Current test status: All tests passing (in at least Chrome and Firefox beta)
- Fix (Firefox): tspan (and textPath apparently) have no `getBBox` in Firefox, so recover (fixes FF issue with recalculate test 3: "recalculateDimensions() on text w/tspan with simple translate") - Fix (Chrome): Chrome has a bug in not performing `removeAttribute` after `removeItem`; deal with it (though only if there is a single identity matrix) (fixes Chrome issue with recalculate test 1: " recalculateDimensions() on rect with identity matrix")master
parent
6f791b12dd
commit
69f3a42aa8
|
@ -76,6 +76,7 @@ svgedit.recalculate.recalculateDimensions = function (selected) {
|
||||||
// remove any unnecessary transforms
|
// remove any unnecessary transforms
|
||||||
if (tlist && tlist.numberOfItems > 0) {
|
if (tlist && tlist.numberOfItems > 0) {
|
||||||
k = tlist.numberOfItems;
|
k = tlist.numberOfItems;
|
||||||
|
var noi = k;
|
||||||
while (k--) {
|
while (k--) {
|
||||||
var xform = tlist.getItem(k);
|
var xform = tlist.getItem(k);
|
||||||
if (xform.type === 0) {
|
if (xform.type === 0) {
|
||||||
|
@ -83,6 +84,14 @@ svgedit.recalculate.recalculateDimensions = function (selected) {
|
||||||
// remove identity matrices
|
// remove identity matrices
|
||||||
} else if (xform.type === 1) {
|
} else if (xform.type === 1) {
|
||||||
if (svgedit.math.isIdentity(xform.matrix)) {
|
if (svgedit.math.isIdentity(xform.matrix)) {
|
||||||
|
if (noi === 1) {
|
||||||
|
// Overcome Chrome bug (though only when noi is 1) with
|
||||||
|
// `removeItem` preventing `removeAttribute` from
|
||||||
|
// subsequently working
|
||||||
|
// See https://bugs.chromium.org/p/chromium/issues/detail?id=843901
|
||||||
|
selected.removeAttribute('transform');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
tlist.removeItem(k);
|
tlist.removeItem(k);
|
||||||
}
|
}
|
||||||
// remove zero-degree rotations
|
// remove zero-degree rotations
|
||||||
|
@ -99,9 +108,11 @@ svgedit.recalculate.recalculateDimensions = function (selected) {
|
||||||
|
|
||||||
// if this element had no transforms, we are done
|
// if this element had no transforms, we are done
|
||||||
if (!tlist || tlist.numberOfItems === 0) {
|
if (!tlist || tlist.numberOfItems === 0) {
|
||||||
// Chrome has a bug that requires clearing the attribute first.
|
// Chrome apparently had a bug that requires clearing the attribute first.
|
||||||
selected.setAttribute('transform', '');
|
selected.setAttribute('transform', '');
|
||||||
|
// However, this still next line currently doesn't work at all in Chrome
|
||||||
selected.removeAttribute('transform');
|
selected.removeAttribute('transform');
|
||||||
|
// selected.transform.baseVal.clear(); // Didn't help for Chrome bug
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -548,7 +548,20 @@ svgedit.utilities.getBBox = function (elem) {
|
||||||
}
|
}
|
||||||
} else if (~visElemsArr.indexOf(elname)) {
|
} else if (~visElemsArr.indexOf(elname)) {
|
||||||
if (selected) {
|
if (selected) {
|
||||||
ret = selected.getBBox();
|
try {
|
||||||
|
ret = selected.getBBox();
|
||||||
|
} catch (err) {
|
||||||
|
// tspan (and textPath apparently) have no `getBBox` in Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=937268
|
||||||
|
// Re: Chrome returning bbox for containing text element, see: https://bugs.chromium.org/p/chromium/issues/detail?id=349835
|
||||||
|
var extent = selected.getExtentOfChar(0); // pos+dimensions of the first glyph
|
||||||
|
var width = selected.getComputedTextLength(); // width of the tspan
|
||||||
|
ret = {
|
||||||
|
x: extent.x,
|
||||||
|
y: extent.y,
|
||||||
|
width: width,
|
||||||
|
height: extent.height
|
||||||
|
};
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Check if element is child of a foreignObject
|
// Check if element is child of a foreignObject
|
||||||
var fo = $(selected).closest('foreignObject');
|
var fo = $(selected).closest('foreignObject');
|
||||||
|
|
Loading…
Reference in New Issue