Commit aa70882f authored by K Moon's avatar K Moon Committed by Commit Bot

Pass PDF layout options through JavaScript

Adds a "LayoutOptions" object that is passed from the PDF plugin (via
the "documentDimensions" message), through the extension, and back to
the plugin (via the "viewport" message).

We plan to make layout asynchronous for crbug.com/885110. To accomplish
this, we need to carry certain layout state through the JavaScript
layer, until the layout change finally is applied.

In the future, we may want to modify the layout options in JavaScript
(such as for 2-up view), but for now, we just need to pass the exact
same object back and forth.

Bug: 885110
Change-Id: Iaac57422dbba185399358ceffdbde4e6ad2c7899
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1815769
Commit-Queue: K Moon <kmoon@chromium.org>
Reviewed-by: default avatarRebekah Potter <rbpotter@chromium.org>
Cr-Commit-Position: refs/heads/master@{#700417}
parent d3e37e4a
...@@ -266,10 +266,12 @@ class PluginController extends ContentController { ...@@ -266,10 +266,12 @@ class PluginController extends ContentController {
const position = this.viewport_.position; const position = this.viewport_.position;
const zoom = this.viewport_.getZoom(); const zoom = this.viewport_.getZoom();
const pinchPhase = this.viewport_.pinchPhase; const pinchPhase = this.viewport_.pinchPhase;
const layoutOptions = this.viewport_.getLayoutOptions();
this.postMessage_({ this.postMessage_({
type: 'viewport', type: 'viewport',
userInitiated: true, userInitiated: true,
zoom: zoom, zoom: zoom,
layoutOptions: layoutOptions,
xOffset: position.x, xOffset: position.x,
yOffset: position.y, yOffset: position.y,
pinchPhase: pinchPhase pinchPhase: pinchPhase
...@@ -285,6 +287,7 @@ class PluginController extends ContentController { ...@@ -285,6 +287,7 @@ class PluginController extends ContentController {
afterZoom() { afterZoom() {
const position = this.viewport_.position; const position = this.viewport_.position;
const zoom = this.viewport_.getZoom(); const zoom = this.viewport_.getZoom();
const layoutOptions = this.viewport_.getLayoutOptions();
const pinchVector = this.viewport_.pinchPanVector || {x: 0, y: 0}; const pinchVector = this.viewport_.pinchPanVector || {x: 0, y: 0};
const pinchCenter = this.viewport_.pinchCenter || {x: 0, y: 0}; const pinchCenter = this.viewport_.pinchCenter || {x: 0, y: 0};
const pinchPhase = this.viewport_.pinchPhase; const pinchPhase = this.viewport_.pinchPhase;
...@@ -293,6 +296,7 @@ class PluginController extends ContentController { ...@@ -293,6 +296,7 @@ class PluginController extends ContentController {
type: 'viewport', type: 'viewport',
userInitiated: this.getIsUserInitiatedCallback_(), userInitiated: this.getIsUserInitiatedCallback_(),
zoom: zoom, zoom: zoom,
layoutOptions: layoutOptions,
xOffset: position.x, xOffset: position.x,
yOffset: position.y, yOffset: position.y,
pinchPhase: pinchPhase, pinchPhase: pinchPhase,
......
...@@ -18,6 +18,7 @@ let MessageObject; ...@@ -18,6 +18,7 @@ let MessageObject;
* type: string, * type: string,
* height: number, * height: number,
* width: number, * width: number,
* layoutOptions: (!LayoutOptions|undefined),
* pageDimensions: Array * pageDimensions: Array
* }} * }}
*/ */
......
...@@ -6,11 +6,15 @@ ...@@ -6,11 +6,15 @@
* @typedef {{ * @typedef {{
* width: number, * width: number,
* height: number, * height: number,
* layoutOptions: (!LayoutOptions|undefined),
* pageDimensions: Array<ViewportRect>, * pageDimensions: Array<ViewportRect>,
* }} * }}
*/ */
let DocumentDimensions; let DocumentDimensions;
/** @typedef {{defaultPageOrientation: number}} */
let LayoutOptions;
/** @typedef {{x: number, y: number}} */ /** @typedef {{x: number, y: number}} */
let Point; let Point;
...@@ -281,6 +285,15 @@ class Viewport { ...@@ -281,6 +285,15 @@ class Viewport {
}; };
} }
/**
* @return {!LayoutOptions|undefined} A dictionary carrying layout options
* from the plugin.
*/
getLayoutOptions() {
return this.documentDimensions_ ? this.documentDimensions_.layoutOptions :
undefined;
}
/** /**
* @return {!ViewportRect} ViewportRect for the viewport given current zoom. * @return {!ViewportRect} ViewportRect for the viewport given current zoom.
* @private * @private
......
...@@ -80,9 +80,10 @@ function MockViewportChangedCallback() { ...@@ -80,9 +80,10 @@ function MockViewportChangedCallback() {
}; };
} }
function MockDocumentDimensions(width, height) { function MockDocumentDimensions(width, height, layoutOptions) {
this.width = width || 0; this.width = width || 0;
this.height = height ? height : 0; this.height = height ? height : 0;
this.layoutOptions = layoutOptions;
this.pageDimensions = []; this.pageDimensions = [];
this.addPage = function(w, h) { this.addPage = function(w, h) {
var y = 0; var y = 0;
......
...@@ -1033,6 +1033,23 @@ var tests = [ ...@@ -1033,6 +1033,23 @@ var tests = [
chrome.test.succeed(); chrome.test.succeed();
}, },
function testLayoutOptions() {
var viewport =
new Viewport(new MockWindow(100, 100), new MockSizer(), 0, 1, 0);
chrome.test.assertEq(undefined, viewport.getLayoutOptions());
viewport.setDocumentDimensions(
new MockDocumentDimensions(50, 50, {defaultPageOrientation: 1}));
chrome.test.assertEq(
{defaultPageOrientation: 1}, viewport.getLayoutOptions());
viewport.setDocumentDimensions(new MockDocumentDimensions(50, 50));
chrome.test.assertEq(undefined, viewport.getLayoutOptions());
chrome.test.succeed();
},
function testToolbarHeightOffset() { function testToolbarHeightOffset() {
var mockSizer = new MockSizer(); var mockSizer = new MockSizer();
var mockWindow = new MockWindow(100, 100); var mockWindow = new MockWindow(100, 100);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment