Skip to content

Commit

Permalink
browser(firefox): make default viewport work in default context (#2277)
Browse files Browse the repository at this point in the history
  • Loading branch information
dgozman committed May 18, 2020
1 parent 9e2733d commit 40ea0dd
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 39 deletions.
2 changes: 1 addition & 1 deletion browser_patches/firefox/BUILD_NUMBER
@@ -1 +1 @@
1095
1096
99 changes: 61 additions & 38 deletions browser_patches/firefox/patches/bootstrap.diff
Expand Up @@ -2402,10 +2402,10 @@ index 0000000000000000000000000000000000000000..ba34976ad05e7f5f1a99777f76ac08b1
+this.SimpleChannel = SimpleChannel;
diff --git a/juggler/TargetRegistry.js b/juggler/TargetRegistry.js
new file mode 100644
index 0000000000000000000000000000000000000000..ffa7a3eb7db0508bce20f59535fee808a3ee2859
index 0000000000000000000000000000000000000000..bbd2983755282e514c17824c210e9ab49a1bbad0
--- /dev/null
+++ b/juggler/TargetRegistry.js
@@ -0,0 +1,648 @@
@@ -0,0 +1,676 @@
+const {EventEmitter} = ChromeUtils.import('resource://gre/modules/EventEmitter.jsm');
+const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
+const {SimpleChannel} = ChromeUtils.import('chrome://juggler/content/SimpleChannel.js');
Expand Down Expand Up @@ -2595,8 +2595,8 @@ index 0000000000000000000000000000000000000000..ffa7a3eb7db0508bce20f59535fee808
+ const tab = event.target;
+ const userContextId = tab.userContextId;
+ const browserContext = this._userContextIdToBrowserContext.get(userContextId);
+ if (browserContext && browserContext.settings.defaultViewport)
+ setViewportSizeForBrowser(browserContext.settings.defaultViewport.viewportSize, tab.linkedBrowser);
+ if (browserContext && browserContext.defaultViewportSize)
+ setViewportSizeForBrowser(browserContext.defaultViewportSize, tab.linkedBrowser);
+ };
+
+ const onTabCloseListener = event => {
Expand Down Expand Up @@ -2731,6 +2731,7 @@ index 0000000000000000000000000000000000000000..ffa7a3eb7db0508bce20f59535fee808
+ this._tab = tab;
+ this._linkedBrowser = linkedBrowser;
+ this._browserContext = browserContext;
+ this._viewportSize = undefined;
+ this._url = '';
+ this._openerId = opener ? opener.id() : undefined;
+ this._channel = SimpleChannel.createForMessageManager(`browser::page[${this._targetId}]`, this._linkedBrowser.messageManager);
Expand All @@ -2745,8 +2746,10 @@ index 0000000000000000000000000000000000000000..ffa7a3eb7db0508bce20f59535fee808
+ ];
+
+ this._disposed = false;
+ if (browserContext)
+ if (browserContext) {
+ browserContext.pages.add(this);
+ browserContext._firstPageCallback();
+ }
+ this._registry._browserToTarget.set(this._linkedBrowser, this);
+ this._registry._browserBrowsingContextToTarget.set(this._linkedBrowser.browsingContext, this);
+ }
Expand All @@ -2759,8 +2762,13 @@ index 0000000000000000000000000000000000000000..ffa7a3eb7db0508bce20f59535fee808
+ return this._browserContext;
+ }
+
+ setViewportSize(viewportSize) {
+ return setViewportSizeForBrowser(viewportSize, this._linkedBrowser);
+ async setViewportSize(viewportSize) {
+ this._viewportSize = viewportSize;
+ const actualSize = setViewportSizeForBrowser(viewportSize, this._linkedBrowser);
+ await this._channel.connect('').send('awaitViewportDimensions', {
+ width: actualSize.width,
+ height: actualSize.height
+ });
+ }
+
+ connectSession(session) {
Expand Down Expand Up @@ -2859,10 +2867,12 @@ index 0000000000000000000000000000000000000000..ffa7a3eb7db0508bce20f59535fee808
+ this.requestInterceptionEnabled = undefined;
+ this.ignoreHTTPSErrors = undefined;
+ this.downloadOptions = undefined;
+ this.defaultViewportSize = undefined;
+ this.scriptsToEvaluateOnNewDocument = [];
+ this.bindings = [];
+ this.settings = {};
+ this.pages = new Set();
+ this._firstPagePromise = new Promise(f => this._firstPageCallback = f);
+ }
+
+ async destroy() {
Expand Down Expand Up @@ -2900,6 +2910,24 @@ index 0000000000000000000000000000000000000000..ffa7a3eb7db0508bce20f59535fee808
+ }
+ }
+
+ async setDefaultViewport(viewport) {
+ this.defaultViewportSize = viewport ? viewport.viewportSize : undefined;
+ if (!this.userContextId) {
+ // First page in the default context comes before onTabOpenListener
+ // so we don't set default viewport. Wait for it here and ensure the viewport.
+ await this._firstPagePromise;
+ }
+ const promises = Array.from(this.pages).map(async page => {
+ // Resize to new default, unless the page has a custom viewport.
+ if (!page._viewportSize)
+ await page.setViewportSize(this.defaultViewportSize);
+ });
+ await Promise.all([
+ this.applySetting('deviceScaleFactor', viewport ? viewport.deviceScaleFactor : undefined),
+ ...promises,
+ ]);
+ }
+
+ async addScriptToEvaluateOnNewDocument(script) {
+ this.scriptsToEvaluateOnNewDocument.push(script);
+ await Promise.all(Array.from(this.pages).map(page => page.addScriptToEvaluateOnNewDocument(script)));
Expand Down Expand Up @@ -3699,10 +3727,10 @@ index 0000000000000000000000000000000000000000..155d0770ddf704728829272a41a31ce8
+
diff --git a/juggler/content/PageAgent.js b/juggler/content/PageAgent.js
new file mode 100644
index 0000000000000000000000000000000000000000..73b6ee4d266ff648acd0a8dfb8909f9b0c76c28d
index 0000000000000000000000000000000000000000..7828bbea9a32fc7bf161c1bc814b900bdc19a2a9
--- /dev/null
+++ b/juggler/content/PageAgent.js
@@ -0,0 +1,992 @@
@@ -0,0 +1,977 @@
+"use strict";
+const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
+const Ci = Components.interfaces;
Expand Down Expand Up @@ -3832,7 +3860,6 @@ index 0000000000000000000000000000000000000000..73b6ee4d266ff648acd0a8dfb8909f9b
+ addBinding: ({ name, script }) => this._frameTree.addBinding(name, script),
+ addScriptToEvaluateOnNewDocument: this._addScriptToEvaluateOnNewDocument.bind(this),
+ adoptNode: this._adoptNode.bind(this),
+ awaitViewportDimensions: this._awaitViewportDimensions.bind(this),
+ crash: this._crash.bind(this),
+ describeNode: this._describeNode.bind(this),
+ dispatchKeyEvent: this._dispatchKeyEvent.bind(this),
Expand Down Expand Up @@ -3871,20 +3898,6 @@ index 0000000000000000000000000000000000000000..73b6ee4d266ff648acd0a8dfb8909f9b
+ this._dataTransfer = null;
+ }
+
+ async _awaitViewportDimensions({width, height}) {
+ const win = this._frameTree.mainFrame().domWindow();
+ if (win.innerWidth === width && win.innerHeight === height)
+ return;
+ await new Promise(resolve => {
+ const listener = helper.addEventListener(win, 'resize', () => {
+ if (win.innerWidth === width && win.innerHeight === height) {
+ helper.removeListeners([listener]);
+ resolve();
+ }
+ });
+ });
+ }
+
+ _requestDetails({channelId}) {
+ return this._networkMonitor.requestDetails(channelId);
+ }
Expand Down Expand Up @@ -5492,10 +5505,10 @@ index 0000000000000000000000000000000000000000..3a386425d3796d0a6786dea193b3402d
+
diff --git a/juggler/content/main.js b/juggler/content/main.js
new file mode 100644
index 0000000000000000000000000000000000000000..ef33a19f8fd4f8abefac1470aa7c79b66d822860
index 0000000000000000000000000000000000000000..70c47bb426876f4a89709ba61460149dae370efe
--- /dev/null
+++ b/juggler/content/main.js
@@ -0,0 +1,174 @@
@@ -0,0 +1,188 @@
+const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
+const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
+const {FrameTree} = ChromeUtils.import('chrome://juggler/content/content/FrameTree.js');
Expand Down Expand Up @@ -5585,9 +5598,9 @@ index 0000000000000000000000000000000000000000..ef33a19f8fd4f8abefac1470aa7c79b6
+ frameTree.setColorScheme(colorScheme);
+ },
+
+ defaultViewport: (viewport) => {
+ docShell.contentViewer.overrideDPPX = viewport.deviceScaleFactor || this._initialDPPX;
+ docShell.deviceSizeIsPageSize = true;
+ deviceScaleFactor: (deviceScaleFactor) => {
+ docShell.contentViewer.overrideDPPX = deviceScaleFactor || this._initialDPPX;
+ docShell.deviceSizeIsPageSize = !!deviceScaleFactor;
+ },
+};
+
Expand Down Expand Up @@ -5650,6 +5663,20 @@ index 0000000000000000000000000000000000000000..ef33a19f8fd4f8abefac1470aa7c79b6
+ return failedToOverrideTimezone;
+ },
+
+ async awaitViewportDimensions({width, height}) {
+ const win = docShell.domWindow;
+ if (win.innerWidth === width && win.innerHeight === height)
+ return;
+ await new Promise(resolve => {
+ const listener = helper.addEventListener(win, 'resize', () => {
+ if (win.innerWidth === width && win.innerHeight === height) {
+ helper.removeListeners([listener]);
+ resolve();
+ }
+ });
+ });
+ },
+
+ dispose() {
+ },
+ });
Expand Down Expand Up @@ -5749,7 +5776,7 @@ index 0000000000000000000000000000000000000000..bf37558bccc48f4d90eadc971c1eb3e4
+this.AccessibilityHandler = AccessibilityHandler;
diff --git a/juggler/protocol/BrowserHandler.js b/juggler/protocol/BrowserHandler.js
new file mode 100644
index 0000000000000000000000000000000000000000..1d304e2996c62df07d823b4cffd1eb309cba29ab
index 0000000000000000000000000000000000000000..ad4bfcf776c2ae97957c8b0e675f920371955728
--- /dev/null
+++ b/juggler/protocol/BrowserHandler.js
@@ -0,0 +1,239 @@
Expand Down Expand Up @@ -5951,7 +5978,7 @@ index 0000000000000000000000000000000000000000..1d304e2996c62df07d823b4cffd1eb30
+ }
+
+ async setDefaultViewport({browserContextId, viewport}) {
+ await this._targetRegistry.browserContextForId(browserContextId).applySetting('defaultViewport', nullToUndefined(viewport));
+ await this._targetRegistry.browserContextForId(browserContextId).setDefaultViewport(nullToUndefined(viewport));
+ }
+
+ async addScriptToEvaluateOnNewDocument({browserContextId, script}) {
Expand Down Expand Up @@ -6299,10 +6326,10 @@ index 0000000000000000000000000000000000000000..10ce1e9eb24879426ca11a21ffeb89f3
+this.NetworkHandler = NetworkHandler;
diff --git a/juggler/protocol/PageHandler.js b/juggler/protocol/PageHandler.js
new file mode 100644
index 0000000000000000000000000000000000000000..95481cd1194918d0b539dc1872906070ef75b1be
index 0000000000000000000000000000000000000000..2ad037e57ac4b0b97d85c55bcd08489d840205c1
--- /dev/null
+++ b/juggler/protocol/PageHandler.js
@@ -0,0 +1,345 @@
@@ -0,0 +1,341 @@
+"use strict";
+
+const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
Expand Down Expand Up @@ -6440,11 +6467,7 @@ index 0000000000000000000000000000000000000000..95481cd1194918d0b539dc1872906070
+ }
+
+ async setViewportSize({viewportSize}) {
+ const size = this._pageTarget.setViewportSize(viewportSize);
+ await this._contentPage.send('awaitViewportDimensions', {
+ width: size.width,
+ height: size.height
+ });
+ await this._pageTarget.setViewportSize(viewportSize === null ? undefined : viewportSize);
+ }
+
+ _updateModalDialogs() {
Expand Down

0 comments on commit 40ea0dd

Please sign in to comment.