[Editor] Avoid to have some part of an editor outside its page (bug 1843303)
This commit is contained in:
parent
717c766a42
commit
a8867cf68a
@ -258,8 +258,7 @@ class AnnotationEditor {
|
|||||||
this.x = (x + tx) / width;
|
this.x = (x + tx) / width;
|
||||||
this.y = (y + ty) / height;
|
this.y = (y + ty) / height;
|
||||||
|
|
||||||
this.div.style.left = `${100 * this.x}%`;
|
this.fixAndSetPosition();
|
||||||
this.div.style.top = `${100 * this.y}%`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -274,8 +273,41 @@ class AnnotationEditor {
|
|||||||
this.x += x / width;
|
this.x += x / width;
|
||||||
this.y += y / height;
|
this.y += y / height;
|
||||||
|
|
||||||
this.div.style.left = `${100 * this.x}%`;
|
this.fixAndSetPosition();
|
||||||
this.div.style.top = `${100 * this.y}%`;
|
}
|
||||||
|
|
||||||
|
fixAndSetPosition() {
|
||||||
|
const [pageWidth, pageHeight] = this.pageDimensions;
|
||||||
|
let { x, y, width, height } = this;
|
||||||
|
width *= pageWidth;
|
||||||
|
height *= pageHeight;
|
||||||
|
x *= pageWidth;
|
||||||
|
y *= pageHeight;
|
||||||
|
|
||||||
|
switch (this.rotation) {
|
||||||
|
case 0:
|
||||||
|
x = Math.max(0, Math.min(pageWidth - width, x));
|
||||||
|
y = Math.max(0, Math.min(pageHeight - height, y));
|
||||||
|
break;
|
||||||
|
case 90:
|
||||||
|
x = Math.max(0, Math.min(pageWidth - height, x));
|
||||||
|
y = Math.min(pageHeight, Math.max(width, y));
|
||||||
|
break;
|
||||||
|
case 180:
|
||||||
|
x = Math.min(pageWidth, Math.max(width, x));
|
||||||
|
y = Math.min(pageHeight, Math.max(height, y));
|
||||||
|
break;
|
||||||
|
case 270:
|
||||||
|
x = Math.min(pageWidth, Math.max(height, x));
|
||||||
|
y = Math.max(0, Math.min(pageHeight - width, y));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.x = x / pageWidth;
|
||||||
|
this.y = y / pageHeight;
|
||||||
|
|
||||||
|
this.div.style.left = `${(100 * this.x).toFixed(2)}%`;
|
||||||
|
this.div.style.top = `${(100 * this.y).toFixed(2)}%`;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -383,6 +415,17 @@ class AnnotationEditor {
|
|||||||
this.div.addEventListener("focusin", this.#boundFocusin);
|
this.div.addEventListener("focusin", this.#boundFocusin);
|
||||||
this.div.addEventListener("focusout", this.#boundFocusout);
|
this.div.addEventListener("focusout", this.#boundFocusout);
|
||||||
|
|
||||||
|
const [parentWidth, parentHeight] = this.parentDimensions;
|
||||||
|
if (this.parentRotation % 180 !== 0) {
|
||||||
|
this.div.style.maxWidth = `${((100 * parentHeight) / parentWidth).toFixed(
|
||||||
|
2
|
||||||
|
)}%`;
|
||||||
|
this.div.style.maxHeight = `${(
|
||||||
|
(100 * parentWidth) /
|
||||||
|
parentHeight
|
||||||
|
).toFixed(2)}%`;
|
||||||
|
}
|
||||||
|
|
||||||
const [tx, ty] = this.getInitialTranslation();
|
const [tx, ty] = this.getInitialTranslation();
|
||||||
this.translate(tx, ty);
|
this.translate(tx, ty);
|
||||||
|
|
||||||
|
@ -357,6 +357,7 @@ class FreeTextEditor extends AnnotationEditor {
|
|||||||
this.width = rect.height / parentWidth;
|
this.width = rect.height / parentWidth;
|
||||||
this.height = rect.width / parentHeight;
|
this.height = rect.width / parentHeight;
|
||||||
}
|
}
|
||||||
|
this.fixAndSetPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -838,6 +838,7 @@ class InkEditor extends AnnotationEditor {
|
|||||||
const [parentWidth, parentHeight] = this.parentDimensions;
|
const [parentWidth, parentHeight] = this.parentDimensions;
|
||||||
this.width = width / parentWidth;
|
this.width = width / parentWidth;
|
||||||
this.height = height / parentHeight;
|
this.height = height / parentHeight;
|
||||||
|
this.fixAndSetPosition();
|
||||||
|
|
||||||
if (this.#disableEditing) {
|
if (this.#disableEditing) {
|
||||||
this.#setScaleFactor(width, height);
|
this.#setScaleFactor(width, height);
|
||||||
|
@ -254,6 +254,7 @@ class StampEditor extends AnnotationEditor {
|
|||||||
this.width = width / parentWidth;
|
this.width = width / parentWidth;
|
||||||
this.height = height / parentHeight;
|
this.height = height / parentHeight;
|
||||||
this.setDims(width, height);
|
this.setDims(width, height);
|
||||||
|
this.fixAndSetPosition();
|
||||||
if (this.#resizeTimeoutId !== null) {
|
if (this.#resizeTimeoutId !== null) {
|
||||||
clearTimeout(this.#resizeTimeoutId);
|
clearTimeout(this.#resizeTimeoutId);
|
||||||
}
|
}
|
||||||
|
@ -128,4 +128,51 @@ describe("Stamp Editor", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("Page overflow", () => {
|
||||||
|
let pages;
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
pages = await loadAndWait("empty.pdf", ".annotationEditorLayer", 50);
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await closePages(pages);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("must check that an added image stay within the page", async () => {
|
||||||
|
await Promise.all(
|
||||||
|
pages.map(async ([browserName, page]) => {
|
||||||
|
if (browserName === "firefox") {
|
||||||
|
pending(
|
||||||
|
"Disabled in Firefox, because of https://bugzilla.mozilla.org/1553847."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
await page.click("#editorStamp");
|
||||||
|
|
||||||
|
const rect = await page.$eval(".annotationEditorLayer", el => {
|
||||||
|
// With Chrome something is wrong when serializing a DomRect,
|
||||||
|
// hence we extract the values and just return them.
|
||||||
|
const { right, bottom } = el.getBoundingClientRect();
|
||||||
|
return { x: right, y: bottom };
|
||||||
|
});
|
||||||
|
|
||||||
|
await page.mouse.click(rect.x - 10, rect.y - 10);
|
||||||
|
const input = await page.$("#stampEditorFileInput");
|
||||||
|
await input.uploadFile(
|
||||||
|
`${path.join(__dirname, "../images/firefox_logo.png")}`
|
||||||
|
);
|
||||||
|
|
||||||
|
await page.waitForTimeout(300);
|
||||||
|
|
||||||
|
const { left } = await getEditorDimensions(page, 0);
|
||||||
|
|
||||||
|
// The image is bigger than the page, so it has been scaled down to
|
||||||
|
// 75% of the page width.
|
||||||
|
expect(left).toEqual("25%");
|
||||||
|
})
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -161,7 +161,12 @@ function getEditorDimensions(page, id) {
|
|||||||
return page.evaluate(n => {
|
return page.evaluate(n => {
|
||||||
const element = document.getElementById(`pdfjs_internal_editor_${n}`);
|
const element = document.getElementById(`pdfjs_internal_editor_${n}`);
|
||||||
const { style } = element;
|
const { style } = element;
|
||||||
return { width: style.width, height: style.height };
|
return {
|
||||||
|
left: style.left,
|
||||||
|
top: style.top,
|
||||||
|
width: style.width,
|
||||||
|
height: style.height,
|
||||||
|
};
|
||||||
}, id);
|
}, id);
|
||||||
}
|
}
|
||||||
exports.getEditorDimensions = getEditorDimensions;
|
exports.getEditorDimensions = getEditorDimensions;
|
||||||
|
@ -88,6 +88,8 @@
|
|||||||
z-index: 1;
|
z-index: 1;
|
||||||
transform-origin: 0 0;
|
transform-origin: 0 0;
|
||||||
cursor: auto;
|
cursor: auto;
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.annotationEditorLayer :is(.inkEditor, .stampEditor) {
|
.annotationEditorLayer :is(.inkEditor, .stampEditor) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user