Skip to content

Commit d7f1ff5

Browse files
muodovgithub-actions[bot]
authored andcommitted
Release build 4.56.0 [ci release]
1 parent b121b27 commit d7f1ff5

File tree

6 files changed

+205
-65
lines changed

6 files changed

+205
-65
lines changed

Sources/ContentScopeScripts/dist/contentScope.js

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2727,20 +2727,43 @@
27272727
};
27282728
}
27292729
viewportWidthFix() {
2730-
const viewportTags = document.querySelectorAll("meta[name=viewport]");
2731-
let viewportTag = viewportTags.length === 0 ? null : viewportTags[viewportTags.length - 1];
2730+
if (document.readyState === "loading") {
2731+
document.addEventListener("DOMContentLoaded", () => this.viewportWidthFixInner());
2732+
} else {
2733+
this.viewportWidthFixInner();
2734+
}
2735+
}
2736+
/**
2737+
* create or update a viewport tag with the given content
2738+
* @param {HTMLMetaElement|null} viewportTag
2739+
* @param {string} forcedValue
2740+
*/
2741+
forceViewportTag(viewportTag, forcedValue) {
2742+
const viewportTagExists = Boolean(viewportTag);
2743+
if (!viewportTag) {
2744+
viewportTag = document.createElement("meta");
2745+
viewportTag.setAttribute("name", "viewport");
2746+
}
2747+
viewportTag.setAttribute("content", forcedValue);
2748+
if (!viewportTagExists) {
2749+
document.head.appendChild(viewportTag);
2750+
}
2751+
}
2752+
viewportWidthFixInner() {
2753+
const viewportTags = document.querySelectorAll("meta[name=viewport i]");
2754+
const viewportTag = viewportTags.length === 0 ? null : viewportTags[viewportTags.length - 1];
27322755
const viewportContent = viewportTag?.getAttribute("content") || "";
27332756
const viewportContentParts = viewportContent ? viewportContent.split(/,|;/) : [];
27342757
const parsedViewportContent = viewportContentParts.map((part) => {
27352758
const [key, value] = part.split("=").map((p) => p.trim().toLowerCase());
27362759
return [key, value];
27372760
});
2738-
if (!viewportTag || this.desktopModeEnabled) {
2739-
const viewportTagExists = Boolean(viewportTag);
2740-
if (!viewportTag) {
2741-
viewportTag = document.createElement("meta");
2742-
viewportTag.setAttribute("name", "viewport");
2743-
}
2761+
const { forcedDesktopValue, forcedMobileValue } = this.getFeatureSetting("viewportWidth");
2762+
if (typeof forcedDesktopValue === "string" && this.desktopModeEnabled) {
2763+
this.forceViewportTag(viewportTag, forcedDesktopValue);
2764+
} else if (typeof forcedMobileValue === "string" && !this.desktopModeEnabled) {
2765+
this.forceViewportTag(viewportTag, forcedMobileValue);
2766+
} else if (!viewportTag || this.desktopModeEnabled) {
27442767
const forcedWidth = screen.width >= 1280 ? 1280 : 980;
27452768
const forcedInitialScale = (screen.width / forcedWidth).toFixed(3);
27462769
let newContent = `width=${forcedWidth}, initial-scale=${forcedInitialScale}`;
@@ -2749,17 +2772,14 @@
27492772
newContent = newContent.concat(`,${viewportContentParts[idx]}`);
27502773
}
27512774
});
2752-
viewportTag.setAttribute("content", newContent);
2753-
if (!viewportTagExists) {
2754-
document.head.appendChild(viewportTag);
2755-
}
2775+
this.forceViewportTag(viewportTag, newContent);
27562776
} else {
27572777
const widthPart = parsedViewportContent.find(([key]) => key === "width");
27582778
const initialScalePart = parsedViewportContent.find(([key]) => key === "initial-scale");
27592779
if (!widthPart && initialScalePart) {
27602780
const parsedInitialScale = parseFloat(initialScalePart[1]);
27612781
if (parsedInitialScale !== 1) {
2762-
viewportTag.setAttribute("content", `width=device-width, ${viewportContent}`);
2782+
this.forceViewportTag(viewportTag, `width=device-width, ${viewportContent}`);
27632783
}
27642784
}
27652785
}

build/android/contentScope.js

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7894,22 +7894,50 @@
78947894
}
78957895

78967896
viewportWidthFix () {
7897-
const viewportTags = document.querySelectorAll('meta[name=viewport]');
7897+
if (document.readyState === 'loading') {
7898+
// if the document is not ready, we may miss the original viewport tag
7899+
document.addEventListener('DOMContentLoaded', () => this.viewportWidthFixInner());
7900+
} else {
7901+
this.viewportWidthFixInner();
7902+
}
7903+
}
7904+
7905+
/**
7906+
* create or update a viewport tag with the given content
7907+
* @param {HTMLMetaElement|null} viewportTag
7908+
* @param {string} forcedValue
7909+
*/
7910+
forceViewportTag (viewportTag, forcedValue) {
7911+
const viewportTagExists = Boolean(viewportTag);
7912+
if (!viewportTag) {
7913+
viewportTag = document.createElement('meta');
7914+
viewportTag.setAttribute('name', 'viewport');
7915+
}
7916+
viewportTag.setAttribute('content', forcedValue);
7917+
if (!viewportTagExists) {
7918+
document.head.appendChild(viewportTag);
7919+
}
7920+
}
7921+
7922+
viewportWidthFixInner () {
7923+
/** @type {NodeListOf<HTMLMetaElement>} **/
7924+
const viewportTags = document.querySelectorAll('meta[name=viewport i]');
78987925
// Chrome respects only the last viewport tag
7899-
let viewportTag = viewportTags.length === 0 ? null : viewportTags[viewportTags.length - 1];
7926+
const viewportTag = viewportTags.length === 0 ? null : viewportTags[viewportTags.length - 1];
79007927
const viewportContent = viewportTag?.getAttribute('content') || '';
79017928
const viewportContentParts = viewportContent ? viewportContent.split(/,|;/) : [];
79027929
const parsedViewportContent = viewportContentParts.map((part) => {
79037930
const [key, value] = part.split('=').map(p => p.trim().toLowerCase());
79047931
return [key, value]
79057932
});
7906-
if (!viewportTag || this.desktopModeEnabled) {
7933+
7934+
const { forcedDesktopValue, forcedMobileValue } = this.getFeatureSetting('viewportWidth');
7935+
if (typeof forcedDesktopValue === 'string' && this.desktopModeEnabled) {
7936+
this.forceViewportTag(viewportTag, forcedDesktopValue);
7937+
} else if (typeof forcedMobileValue === 'string' && !this.desktopModeEnabled) {
7938+
this.forceViewportTag(viewportTag, forcedMobileValue);
7939+
} else if (!viewportTag || this.desktopModeEnabled) {
79077940
// force wide viewport width
7908-
const viewportTagExists = Boolean(viewportTag);
7909-
if (!viewportTag) {
7910-
viewportTag = document.createElement('meta');
7911-
viewportTag.setAttribute('name', 'viewport');
7912-
}
79137941
const forcedWidth = screen.width >= 1280 ? 1280 : 980;
79147942
// Race condition: depending on the loading state of the page, initial scale may or may not be respected, so the page may look zoomed-in after applying this hack.
79157943
// Usually this is just an annoyance, but it may be a bigger issue if user-scalable=no is set, so we remove it too.
@@ -7920,10 +7948,7 @@
79207948
newContent = newContent.concat(`,${viewportContentParts[idx]}`); // reuse the original values, not the parsed ones
79217949
}
79227950
});
7923-
viewportTag.setAttribute('content', newContent);
7924-
if (!viewportTagExists) {
7925-
document.head.appendChild(viewportTag);
7926-
}
7951+
this.forceViewportTag(viewportTag, newContent);
79277952
} else { // mobile mode with a viewport tag
79287953
// fix an edge case where WebView forces the wide viewport
79297954
const widthPart = parsedViewportContent.find(([key]) => key === 'width');
@@ -7932,7 +7957,7 @@
79327957
// Chromium accepts float values for initial-scale
79337958
const parsedInitialScale = parseFloat(initialScalePart[1]);
79347959
if (parsedInitialScale !== 1) {
7935-
viewportTag.setAttribute('content', `width=device-width, ${viewportContent}`);
7960+
this.forceViewportTag(viewportTag, `width=device-width, ${viewportContent}`);
79367961
}
79377962
}
79387963
}

build/contentScope.js

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14063,22 +14063,50 @@
1406314063
}
1406414064

1406514065
viewportWidthFix () {
14066-
const viewportTags = document.querySelectorAll('meta[name=viewport]');
14066+
if (document.readyState === 'loading') {
14067+
// if the document is not ready, we may miss the original viewport tag
14068+
document.addEventListener('DOMContentLoaded', () => this.viewportWidthFixInner());
14069+
} else {
14070+
this.viewportWidthFixInner();
14071+
}
14072+
}
14073+
14074+
/**
14075+
* create or update a viewport tag with the given content
14076+
* @param {HTMLMetaElement|null} viewportTag
14077+
* @param {string} forcedValue
14078+
*/
14079+
forceViewportTag (viewportTag, forcedValue) {
14080+
const viewportTagExists = Boolean(viewportTag);
14081+
if (!viewportTag) {
14082+
viewportTag = document.createElement('meta');
14083+
viewportTag.setAttribute('name', 'viewport');
14084+
}
14085+
viewportTag.setAttribute('content', forcedValue);
14086+
if (!viewportTagExists) {
14087+
document.head.appendChild(viewportTag);
14088+
}
14089+
}
14090+
14091+
viewportWidthFixInner () {
14092+
/** @type {NodeListOf<HTMLMetaElement>} **/
14093+
const viewportTags = document.querySelectorAll('meta[name=viewport i]');
1406714094
// Chrome respects only the last viewport tag
14068-
let viewportTag = viewportTags.length === 0 ? null : viewportTags[viewportTags.length - 1];
14095+
const viewportTag = viewportTags.length === 0 ? null : viewportTags[viewportTags.length - 1];
1406914096
const viewportContent = viewportTag?.getAttribute('content') || '';
1407014097
const viewportContentParts = viewportContent ? viewportContent.split(/,|;/) : [];
1407114098
const parsedViewportContent = viewportContentParts.map((part) => {
1407214099
const [key, value] = part.split('=').map(p => p.trim().toLowerCase());
1407314100
return [key, value]
1407414101
});
14075-
if (!viewportTag || this.desktopModeEnabled) {
14102+
14103+
const { forcedDesktopValue, forcedMobileValue } = this.getFeatureSetting('viewportWidth');
14104+
if (typeof forcedDesktopValue === 'string' && this.desktopModeEnabled) {
14105+
this.forceViewportTag(viewportTag, forcedDesktopValue);
14106+
} else if (typeof forcedMobileValue === 'string' && !this.desktopModeEnabled) {
14107+
this.forceViewportTag(viewportTag, forcedMobileValue);
14108+
} else if (!viewportTag || this.desktopModeEnabled) {
1407614109
// force wide viewport width
14077-
const viewportTagExists = Boolean(viewportTag);
14078-
if (!viewportTag) {
14079-
viewportTag = document.createElement('meta');
14080-
viewportTag.setAttribute('name', 'viewport');
14081-
}
1408214110
const forcedWidth = screen.width >= 1280 ? 1280 : 980;
1408314111
// Race condition: depending on the loading state of the page, initial scale may or may not be respected, so the page may look zoomed-in after applying this hack.
1408414112
// Usually this is just an annoyance, but it may be a bigger issue if user-scalable=no is set, so we remove it too.
@@ -14089,10 +14117,7 @@
1408914117
newContent = newContent.concat(`,${viewportContentParts[idx]}`); // reuse the original values, not the parsed ones
1409014118
}
1409114119
});
14092-
viewportTag.setAttribute('content', newContent);
14093-
if (!viewportTagExists) {
14094-
document.head.appendChild(viewportTag);
14095-
}
14120+
this.forceViewportTag(viewportTag, newContent);
1409614121
} else { // mobile mode with a viewport tag
1409714122
// fix an edge case where WebView forces the wide viewport
1409814123
const widthPart = parsedViewportContent.find(([key]) => key === 'width');
@@ -14101,7 +14126,7 @@
1410114126
// Chromium accepts float values for initial-scale
1410214127
const parsedInitialScale = parseFloat(initialScalePart[1]);
1410314128
if (parsedInitialScale !== 1) {
14104-
viewportTag.setAttribute('content', `width=device-width, ${viewportContent}`);
14129+
this.forceViewportTag(viewportTag, `width=device-width, ${viewportContent}`);
1410514130
}
1410614131
}
1410714132
}

build/integration/contentScope.js

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14063,22 +14063,50 @@
1406314063
}
1406414064

1406514065
viewportWidthFix () {
14066-
const viewportTags = document.querySelectorAll('meta[name=viewport]');
14066+
if (document.readyState === 'loading') {
14067+
// if the document is not ready, we may miss the original viewport tag
14068+
document.addEventListener('DOMContentLoaded', () => this.viewportWidthFixInner());
14069+
} else {
14070+
this.viewportWidthFixInner();
14071+
}
14072+
}
14073+
14074+
/**
14075+
* create or update a viewport tag with the given content
14076+
* @param {HTMLMetaElement|null} viewportTag
14077+
* @param {string} forcedValue
14078+
*/
14079+
forceViewportTag (viewportTag, forcedValue) {
14080+
const viewportTagExists = Boolean(viewportTag);
14081+
if (!viewportTag) {
14082+
viewportTag = document.createElement('meta');
14083+
viewportTag.setAttribute('name', 'viewport');
14084+
}
14085+
viewportTag.setAttribute('content', forcedValue);
14086+
if (!viewportTagExists) {
14087+
document.head.appendChild(viewportTag);
14088+
}
14089+
}
14090+
14091+
viewportWidthFixInner () {
14092+
/** @type {NodeListOf<HTMLMetaElement>} **/
14093+
const viewportTags = document.querySelectorAll('meta[name=viewport i]');
1406714094
// Chrome respects only the last viewport tag
14068-
let viewportTag = viewportTags.length === 0 ? null : viewportTags[viewportTags.length - 1];
14095+
const viewportTag = viewportTags.length === 0 ? null : viewportTags[viewportTags.length - 1];
1406914096
const viewportContent = viewportTag?.getAttribute('content') || '';
1407014097
const viewportContentParts = viewportContent ? viewportContent.split(/,|;/) : [];
1407114098
const parsedViewportContent = viewportContentParts.map((part) => {
1407214099
const [key, value] = part.split('=').map(p => p.trim().toLowerCase());
1407314100
return [key, value]
1407414101
});
14075-
if (!viewportTag || this.desktopModeEnabled) {
14102+
14103+
const { forcedDesktopValue, forcedMobileValue } = this.getFeatureSetting('viewportWidth');
14104+
if (typeof forcedDesktopValue === 'string' && this.desktopModeEnabled) {
14105+
this.forceViewportTag(viewportTag, forcedDesktopValue);
14106+
} else if (typeof forcedMobileValue === 'string' && !this.desktopModeEnabled) {
14107+
this.forceViewportTag(viewportTag, forcedMobileValue);
14108+
} else if (!viewportTag || this.desktopModeEnabled) {
1407614109
// force wide viewport width
14077-
const viewportTagExists = Boolean(viewportTag);
14078-
if (!viewportTag) {
14079-
viewportTag = document.createElement('meta');
14080-
viewportTag.setAttribute('name', 'viewport');
14081-
}
1408214110
const forcedWidth = screen.width >= 1280 ? 1280 : 980;
1408314111
// Race condition: depending on the loading state of the page, initial scale may or may not be respected, so the page may look zoomed-in after applying this hack.
1408414112
// Usually this is just an annoyance, but it may be a bigger issue if user-scalable=no is set, so we remove it too.
@@ -14089,10 +14117,7 @@
1408914117
newContent = newContent.concat(`,${viewportContentParts[idx]}`); // reuse the original values, not the parsed ones
1409014118
}
1409114119
});
14092-
viewportTag.setAttribute('content', newContent);
14093-
if (!viewportTagExists) {
14094-
document.head.appendChild(viewportTag);
14095-
}
14120+
this.forceViewportTag(viewportTag, newContent);
1409614121
} else { // mobile mode with a viewport tag
1409714122
// fix an edge case where WebView forces the wide viewport
1409814123
const widthPart = parsedViewportContent.find(([key]) => key === 'width');
@@ -14101,7 +14126,7 @@
1410114126
// Chromium accepts float values for initial-scale
1410214127
const parsedInitialScale = parseFloat(initialScalePart[1]);
1410314128
if (parsedInitialScale !== 1) {
14104-
viewportTag.setAttribute('content', `width=device-width, ${viewportContent}`);
14129+
this.forceViewportTag(viewportTag, `width=device-width, ${viewportContent}`);
1410514130
}
1410614131
}
1410714132
}

integration-test/test-web-compat.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,16 @@ describe('Viewport fixes', () => {
595595
})
596596

597597
describe('Desktop mode off', () => {
598+
it('should respect the forcedMobileValue config', async () => {
599+
await gotoAndWait(page, `http://localhost:${port}/blank.html`, {
600+
site: { enabledFeatures: ['webCompat'] },
601+
featureSettings: { webCompat: { viewportWidth: { state: 'enabled', forcedMobileValue: 'bla, bla, bla' } } },
602+
desktopModeEnabled: false
603+
})
604+
const viewportValue = await page.evaluate(getViewportValue)
605+
expect(viewportValue).toEqual('bla, bla, bla')
606+
})
607+
598608
it('should force wide viewport if the meta tag is not present', async () => {
599609
await gotoAndWait(page, `http://localhost:${port}/blank.html`, {
600610
site: { enabledFeatures: ['webCompat'] },
@@ -629,6 +639,16 @@ describe('Viewport fixes', () => {
629639
})
630640

631641
describe('Desktop mode on', () => {
642+
it('should respect the forcedDesktopValue config', async () => {
643+
await gotoAndWait(page, `http://localhost:${port}/blank.html`, {
644+
site: { enabledFeatures: ['webCompat'] },
645+
featureSettings: { webCompat: { viewportWidth: { state: 'enabled', forcedDesktopValue: 'bla, bla, bla' } } },
646+
desktopModeEnabled: true
647+
})
648+
const viewportValue = await page.evaluate(getViewportValue)
649+
expect(viewportValue).toEqual('bla, bla, bla')
650+
})
651+
632652
it('should force wide viewport, ignoring the viewport tag', async () => {
633653
await gotoAndWait(page, `http://localhost:${port}/blank.html`, {
634654
site: { enabledFeatures: ['webCompat'] },

0 commit comments

Comments
 (0)