Skip to content

Commit 40ea0dd

Browse files
authored
browser(firefox): make default viewport work in default context (#2277)
1 parent 9e2733d commit 40ea0dd

File tree

2 files changed

+62
-39
lines changed

2 files changed

+62
-39
lines changed

browser_patches/firefox/BUILD_NUMBER

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1095
1+
1096

browser_patches/firefox/patches/bootstrap.diff

Lines changed: 61 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2402,10 +2402,10 @@ index 0000000000000000000000000000000000000000..ba34976ad05e7f5f1a99777f76ac08b1
24022402
+this.SimpleChannel = SimpleChannel;
24032403
diff --git a/juggler/TargetRegistry.js b/juggler/TargetRegistry.js
24042404
new file mode 100644
2405-
index 0000000000000000000000000000000000000000..ffa7a3eb7db0508bce20f59535fee808a3ee2859
2405+
index 0000000000000000000000000000000000000000..bbd2983755282e514c17824c210e9ab49a1bbad0
24062406
--- /dev/null
24072407
+++ b/juggler/TargetRegistry.js
2408-
@@ -0,0 +1,648 @@
2408+
@@ -0,0 +1,676 @@
24092409
+const {EventEmitter} = ChromeUtils.import('resource://gre/modules/EventEmitter.jsm');
24102410
+const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
24112411
+const {SimpleChannel} = ChromeUtils.import('chrome://juggler/content/SimpleChannel.js');
@@ -2595,8 +2595,8 @@ index 0000000000000000000000000000000000000000..ffa7a3eb7db0508bce20f59535fee808
25952595
+ const tab = event.target;
25962596
+ const userContextId = tab.userContextId;
25972597
+ const browserContext = this._userContextIdToBrowserContext.get(userContextId);
2598-
+ if (browserContext && browserContext.settings.defaultViewport)
2599-
+ setViewportSizeForBrowser(browserContext.settings.defaultViewport.viewportSize, tab.linkedBrowser);
2598+
+ if (browserContext && browserContext.defaultViewportSize)
2599+
+ setViewportSizeForBrowser(browserContext.defaultViewportSize, tab.linkedBrowser);
26002600
+ };
26012601
+
26022602
+ const onTabCloseListener = event => {
@@ -2731,6 +2731,7 @@ index 0000000000000000000000000000000000000000..ffa7a3eb7db0508bce20f59535fee808
27312731
+ this._tab = tab;
27322732
+ this._linkedBrowser = linkedBrowser;
27332733
+ this._browserContext = browserContext;
2734+
+ this._viewportSize = undefined;
27342735
+ this._url = '';
27352736
+ this._openerId = opener ? opener.id() : undefined;
27362737
+ this._channel = SimpleChannel.createForMessageManager(`browser::page[${this._targetId}]`, this._linkedBrowser.messageManager);
@@ -2745,8 +2746,10 @@ index 0000000000000000000000000000000000000000..ffa7a3eb7db0508bce20f59535fee808
27452746
+ ];
27462747
+
27472748
+ this._disposed = false;
2748-
+ if (browserContext)
2749+
+ if (browserContext) {
27492750
+ browserContext.pages.add(this);
2751+
+ browserContext._firstPageCallback();
2752+
+ }
27502753
+ this._registry._browserToTarget.set(this._linkedBrowser, this);
27512754
+ this._registry._browserBrowsingContextToTarget.set(this._linkedBrowser.browsingContext, this);
27522755
+ }
@@ -2759,8 +2762,13 @@ index 0000000000000000000000000000000000000000..ffa7a3eb7db0508bce20f59535fee808
27592762
+ return this._browserContext;
27602763
+ }
27612764
+
2762-
+ setViewportSize(viewportSize) {
2763-
+ return setViewportSizeForBrowser(viewportSize, this._linkedBrowser);
2765+
+ async setViewportSize(viewportSize) {
2766+
+ this._viewportSize = viewportSize;
2767+
+ const actualSize = setViewportSizeForBrowser(viewportSize, this._linkedBrowser);
2768+
+ await this._channel.connect('').send('awaitViewportDimensions', {
2769+
+ width: actualSize.width,
2770+
+ height: actualSize.height
2771+
+ });
27642772
+ }
27652773
+
27662774
+ connectSession(session) {
@@ -2859,10 +2867,12 @@ index 0000000000000000000000000000000000000000..ffa7a3eb7db0508bce20f59535fee808
28592867
+ this.requestInterceptionEnabled = undefined;
28602868
+ this.ignoreHTTPSErrors = undefined;
28612869
+ this.downloadOptions = undefined;
2870+
+ this.defaultViewportSize = undefined;
28622871
+ this.scriptsToEvaluateOnNewDocument = [];
28632872
+ this.bindings = [];
28642873
+ this.settings = {};
28652874
+ this.pages = new Set();
2875+
+ this._firstPagePromise = new Promise(f => this._firstPageCallback = f);
28662876
+ }
28672877
+
28682878
+ async destroy() {
@@ -2900,6 +2910,24 @@ index 0000000000000000000000000000000000000000..ffa7a3eb7db0508bce20f59535fee808
29002910
+ }
29012911
+ }
29022912
+
2913+
+ async setDefaultViewport(viewport) {
2914+
+ this.defaultViewportSize = viewport ? viewport.viewportSize : undefined;
2915+
+ if (!this.userContextId) {
2916+
+ // First page in the default context comes before onTabOpenListener
2917+
+ // so we don't set default viewport. Wait for it here and ensure the viewport.
2918+
+ await this._firstPagePromise;
2919+
+ }
2920+
+ const promises = Array.from(this.pages).map(async page => {
2921+
+ // Resize to new default, unless the page has a custom viewport.
2922+
+ if (!page._viewportSize)
2923+
+ await page.setViewportSize(this.defaultViewportSize);
2924+
+ });
2925+
+ await Promise.all([
2926+
+ this.applySetting('deviceScaleFactor', viewport ? viewport.deviceScaleFactor : undefined),
2927+
+ ...promises,
2928+
+ ]);
2929+
+ }
2930+
+
29032931
+ async addScriptToEvaluateOnNewDocument(script) {
29042932
+ this.scriptsToEvaluateOnNewDocument.push(script);
29052933
+ await Promise.all(Array.from(this.pages).map(page => page.addScriptToEvaluateOnNewDocument(script)));
@@ -3699,10 +3727,10 @@ index 0000000000000000000000000000000000000000..155d0770ddf704728829272a41a31ce8
36993727
+
37003728
diff --git a/juggler/content/PageAgent.js b/juggler/content/PageAgent.js
37013729
new file mode 100644
3702-
index 0000000000000000000000000000000000000000..73b6ee4d266ff648acd0a8dfb8909f9b0c76c28d
3730+
index 0000000000000000000000000000000000000000..7828bbea9a32fc7bf161c1bc814b900bdc19a2a9
37033731
--- /dev/null
37043732
+++ b/juggler/content/PageAgent.js
3705-
@@ -0,0 +1,992 @@
3733+
@@ -0,0 +1,977 @@
37063734
+"use strict";
37073735
+const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
37083736
+const Ci = Components.interfaces;
@@ -3832,7 +3860,6 @@ index 0000000000000000000000000000000000000000..73b6ee4d266ff648acd0a8dfb8909f9b
38323860
+ addBinding: ({ name, script }) => this._frameTree.addBinding(name, script),
38333861
+ addScriptToEvaluateOnNewDocument: this._addScriptToEvaluateOnNewDocument.bind(this),
38343862
+ adoptNode: this._adoptNode.bind(this),
3835-
+ awaitViewportDimensions: this._awaitViewportDimensions.bind(this),
38363863
+ crash: this._crash.bind(this),
38373864
+ describeNode: this._describeNode.bind(this),
38383865
+ dispatchKeyEvent: this._dispatchKeyEvent.bind(this),
@@ -3871,20 +3898,6 @@ index 0000000000000000000000000000000000000000..73b6ee4d266ff648acd0a8dfb8909f9b
38713898
+ this._dataTransfer = null;
38723899
+ }
38733900
+
3874-
+ async _awaitViewportDimensions({width, height}) {
3875-
+ const win = this._frameTree.mainFrame().domWindow();
3876-
+ if (win.innerWidth === width && win.innerHeight === height)
3877-
+ return;
3878-
+ await new Promise(resolve => {
3879-
+ const listener = helper.addEventListener(win, 'resize', () => {
3880-
+ if (win.innerWidth === width && win.innerHeight === height) {
3881-
+ helper.removeListeners([listener]);
3882-
+ resolve();
3883-
+ }
3884-
+ });
3885-
+ });
3886-
+ }
3887-
+
38883901
+ _requestDetails({channelId}) {
38893902
+ return this._networkMonitor.requestDetails(channelId);
38903903
+ }
@@ -5492,10 +5505,10 @@ index 0000000000000000000000000000000000000000..3a386425d3796d0a6786dea193b3402d
54925505
+
54935506
diff --git a/juggler/content/main.js b/juggler/content/main.js
54945507
new file mode 100644
5495-
index 0000000000000000000000000000000000000000..ef33a19f8fd4f8abefac1470aa7c79b66d822860
5508+
index 0000000000000000000000000000000000000000..70c47bb426876f4a89709ba61460149dae370efe
54965509
--- /dev/null
54975510
+++ b/juggler/content/main.js
5498-
@@ -0,0 +1,174 @@
5511+
@@ -0,0 +1,188 @@
54995512
+const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
55005513
+const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
55015514
+const {FrameTree} = ChromeUtils.import('chrome://juggler/content/content/FrameTree.js');
@@ -5585,9 +5598,9 @@ index 0000000000000000000000000000000000000000..ef33a19f8fd4f8abefac1470aa7c79b6
55855598
+ frameTree.setColorScheme(colorScheme);
55865599
+ },
55875600
+
5588-
+ defaultViewport: (viewport) => {
5589-
+ docShell.contentViewer.overrideDPPX = viewport.deviceScaleFactor || this._initialDPPX;
5590-
+ docShell.deviceSizeIsPageSize = true;
5601+
+ deviceScaleFactor: (deviceScaleFactor) => {
5602+
+ docShell.contentViewer.overrideDPPX = deviceScaleFactor || this._initialDPPX;
5603+
+ docShell.deviceSizeIsPageSize = !!deviceScaleFactor;
55915604
+ },
55925605
+};
55935606
+
@@ -5650,6 +5663,20 @@ index 0000000000000000000000000000000000000000..ef33a19f8fd4f8abefac1470aa7c79b6
56505663
+ return failedToOverrideTimezone;
56515664
+ },
56525665
+
5666+
+ async awaitViewportDimensions({width, height}) {
5667+
+ const win = docShell.domWindow;
5668+
+ if (win.innerWidth === width && win.innerHeight === height)
5669+
+ return;
5670+
+ await new Promise(resolve => {
5671+
+ const listener = helper.addEventListener(win, 'resize', () => {
5672+
+ if (win.innerWidth === width && win.innerHeight === height) {
5673+
+ helper.removeListeners([listener]);
5674+
+ resolve();
5675+
+ }
5676+
+ });
5677+
+ });
5678+
+ },
5679+
+
56535680
+ dispose() {
56545681
+ },
56555682
+ });
@@ -5749,7 +5776,7 @@ index 0000000000000000000000000000000000000000..bf37558bccc48f4d90eadc971c1eb3e4
57495776
+this.AccessibilityHandler = AccessibilityHandler;
57505777
diff --git a/juggler/protocol/BrowserHandler.js b/juggler/protocol/BrowserHandler.js
57515778
new file mode 100644
5752-
index 0000000000000000000000000000000000000000..1d304e2996c62df07d823b4cffd1eb309cba29ab
5779+
index 0000000000000000000000000000000000000000..ad4bfcf776c2ae97957c8b0e675f920371955728
57535780
--- /dev/null
57545781
+++ b/juggler/protocol/BrowserHandler.js
57555782
@@ -0,0 +1,239 @@
@@ -5951,7 +5978,7 @@ index 0000000000000000000000000000000000000000..1d304e2996c62df07d823b4cffd1eb30
59515978
+ }
59525979
+
59535980
+ async setDefaultViewport({browserContextId, viewport}) {
5954-
+ await this._targetRegistry.browserContextForId(browserContextId).applySetting('defaultViewport', nullToUndefined(viewport));
5981+
+ await this._targetRegistry.browserContextForId(browserContextId).setDefaultViewport(nullToUndefined(viewport));
59555982
+ }
59565983
+
59575984
+ async addScriptToEvaluateOnNewDocument({browserContextId, script}) {
@@ -6299,10 +6326,10 @@ index 0000000000000000000000000000000000000000..10ce1e9eb24879426ca11a21ffeb89f3
62996326
+this.NetworkHandler = NetworkHandler;
63006327
diff --git a/juggler/protocol/PageHandler.js b/juggler/protocol/PageHandler.js
63016328
new file mode 100644
6302-
index 0000000000000000000000000000000000000000..95481cd1194918d0b539dc1872906070ef75b1be
6329+
index 0000000000000000000000000000000000000000..2ad037e57ac4b0b97d85c55bcd08489d840205c1
63036330
--- /dev/null
63046331
+++ b/juggler/protocol/PageHandler.js
6305-
@@ -0,0 +1,345 @@
6332+
@@ -0,0 +1,341 @@
63066333
+"use strict";
63076334
+
63086335
+const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
@@ -6440,11 +6467,7 @@ index 0000000000000000000000000000000000000000..95481cd1194918d0b539dc1872906070
64406467
+ }
64416468
+
64426469
+ async setViewportSize({viewportSize}) {
6443-
+ const size = this._pageTarget.setViewportSize(viewportSize);
6444-
+ await this._contentPage.send('awaitViewportDimensions', {
6445-
+ width: size.width,
6446-
+ height: size.height
6447-
+ });
6470+
+ await this._pageTarget.setViewportSize(viewportSize === null ? undefined : viewportSize);
64486471
+ }
64496472
+
64506473
+ _updateModalDialogs() {

0 commit comments

Comments
 (0)