diff --git a/browser_patches/firefox/BUILD_NUMBER b/browser_patches/firefox/BUILD_NUMBER index fb35a14c02..617ba1c154 100644 --- a/browser_patches/firefox/BUILD_NUMBER +++ b/browser_patches/firefox/BUILD_NUMBER @@ -1 +1 @@ -1007 +1008 diff --git a/browser_patches/firefox/patches/bootstrap.diff b/browser_patches/firefox/patches/bootstrap.diff index 62cb9838ab..65715fa270 100644 --- a/browser_patches/firefox/patches/bootstrap.diff +++ b/browser_patches/firefox/patches/bootstrap.diff @@ -1465,10 +1465,10 @@ index 0000000000000000000000000000000000000000..f68780d529e753e7456c3182b051ad79 + diff --git a/testing/juggler/content/FrameTree.js b/testing/juggler/content/FrameTree.js new file mode 100644 -index 0000000000000000000000000000000000000000..640782151e30b2a34b3c0c57e88a4053b5382a88 +index 0000000000000000000000000000000000000000..f239981ae0d87581d9a1c25ca1ebe1730d20bfa0 --- /dev/null +++ b/testing/juggler/content/FrameTree.js -@@ -0,0 +1,240 @@ +@@ -0,0 +1,242 @@ +"use strict"; +const Ci = Components.interfaces; +const Cr = Components.results; @@ -1645,6 +1645,8 @@ index 0000000000000000000000000000000000000000..640782151e30b2a34b3c0c57e88a4053 + this._frameId = helper.generateId(); + this._parentFrame = null; + this._url = ''; ++ if (docShell.domWindow && docShell.domWindow.location) ++ this._url = docShell.domWindow.location.href; + if (parentFrame) { + this._parentFrame = parentFrame; + parentFrame._children.add(this); @@ -1779,7 +1781,7 @@ index 0000000000000000000000000000000000000000..2508cce41565023b7fee9c7b85afe8ec + diff --git a/testing/juggler/content/PageAgent.js b/testing/juggler/content/PageAgent.js new file mode 100644 -index 0000000000000000000000000000000000000000..266fad046ba2fcc950b250fed49be61d10ee6776 +index 0000000000000000000000000000000000000000..0031ff4cad5d479db52122f69c1cb6b0d278dbd6 --- /dev/null +++ b/testing/juggler/content/PageAgent.js @@ -0,0 +1,661 @@ @@ -2004,7 +2006,7 @@ index 0000000000000000000000000000000000000000..266fad046ba2fcc950b250fed49be61d + _onNavigationCommitted(frame) { + this._session.emitEvent('Page.navigationCommitted', { + frameId: frame.id(), -+ navigationId: frame.lastCommittedNavigationId(), ++ navigationId: frame.lastCommittedNavigationId() || undefined, + url: frame.url(), + name: frame.name(), + }); @@ -4134,10 +4136,10 @@ index 0000000000000000000000000000000000000000..78b6601b91d0b7fcda61114e6846aa07 +this.EXPORTED_SYMBOLS = ['t', 'checkScheme']; diff --git a/testing/juggler/protocol/Protocol.js b/testing/juggler/protocol/Protocol.js new file mode 100644 -index 0000000000000000000000000000000000000000..700571aeed4509ad5429adb35d9fd4c2d7cd8113 +index 0000000000000000000000000000000000000000..fbffd5bc1c20d012aec35e9f651b8fb3bfb7e2af --- /dev/null +++ b/testing/juggler/protocol/Protocol.js -@@ -0,0 +1,668 @@ +@@ -0,0 +1,669 @@ +const {t, checkScheme} = ChromeUtils.import('chrome://juggler/content/protocol/PrimitiveTypes.js'); + +// Protocol-specific types. @@ -4547,7 +4549,8 @@ index 0000000000000000000000000000000000000000..700571aeed4509ad5429adb35d9fd4c2 + }, + 'navigationCommitted': { + frameId: t.String, -+ navigationId: t.String, ++ // |navigationId| can only be null in response to enable. ++ navigationId: t.Optional(t.String), + url: t.String, + // frame.id or frame.name + name: t.String, diff --git a/browser_patches/webkit/BUILD_NUMBER b/browser_patches/webkit/BUILD_NUMBER index 34d9aaeb09..408adce179 100644 --- a/browser_patches/webkit/BUILD_NUMBER +++ b/browser_patches/webkit/BUILD_NUMBER @@ -1 +1 @@ -1043 +1044 diff --git a/browser_patches/webkit/patches/bootstrap.diff b/browser_patches/webkit/patches/bootstrap.diff index 52f9fa202b..a129b764ec 100644 --- a/browser_patches/webkit/patches/bootstrap.diff +++ b/browser_patches/webkit/patches/bootstrap.diff @@ -761,7 +761,7 @@ index 0000000000000000000000000000000000000000..60515155c222d3ead52f4e4905017e37 + ] +} diff --git a/Source/JavaScriptCore/inspector/protocol/Page.json b/Source/JavaScriptCore/inspector/protocol/Page.json -index 367d1f235a8213f1360f601bc9e64c0949f477b4..f5bdf41aad83ae35b33294c5702f41acbb81c55d 100644 +index 367d1f235a8213f1360f601bc9e64c0949f477b4..4c16f864d99d7959765fc7f68a4d54d454731ddd 100644 --- a/Source/JavaScriptCore/inspector/protocol/Page.json +++ b/Source/JavaScriptCore/inspector/protocol/Page.json @@ -108,6 +108,40 @@ @@ -805,7 +805,7 @@ index 367d1f235a8213f1360f601bc9e64c0949f477b4..f5bdf41aad83ae35b33294c5702f41ac } ], "commands": [ -@@ -127,11 +161,20 @@ +@@ -127,11 +161,21 @@ { "name": "revalidateAllResources", "type": "boolean", "optional": true, "description": "If true, all cached subresources will be revalidated when the main resource loads. Otherwise, only expired cached subresources will be revalidated (the default behavior for most WebKit clients)." } ] }, @@ -823,11 +823,12 @@ index 367d1f235a8213f1360f601bc9e64c0949f477b4..f5bdf41aad83ae35b33294c5702f41ac "parameters": [ - { "name": "url", "type": "string", "description": "URL to navigate the page to." } + { "name": "url", "type": "string", "description": "URL to navigate the page to." }, -+ { "name": "frameId", "$ref": "Network.FrameId", "optional": true, "description": "Id of the frame to navigate."} ++ { "name": "frameId", "$ref": "Network.FrameId", "optional": true, "description": "Id of the frame to navigate."}, ++ { "name": "referrer", "type": "string", "optional": true, "description": "Referrer URL." } ] }, { -@@ -288,19 +331,64 @@ +@@ -288,19 +332,64 @@ "returns": [ { "name": "data", "type": "string", "description": "Base64-encoded web archive." } ] @@ -894,7 +895,7 @@ index 367d1f235a8213f1360f601bc9e64c0949f477b4..f5bdf41aad83ae35b33294c5702f41ac ] }, { -@@ -310,6 +398,14 @@ +@@ -310,6 +399,14 @@ { "name": "frame", "$ref": "Frame", "description": "Frame object." } ] }, @@ -909,7 +910,7 @@ index 367d1f235a8213f1360f601bc9e64c0949f477b4..f5bdf41aad83ae35b33294c5702f41ac { "name": "frameDetached", "description": "Fired when frame has been detached from its parent.", -@@ -346,12 +442,36 @@ +@@ -346,12 +443,36 @@ { "name": "frameId", "$ref": "Network.FrameId", "description": "Id of the frame that has cleared its scheduled navigation." } ] }, @@ -1562,8 +1563,63 @@ index b578660fbb3ce176e4e0aeb5a22021dc880e47f0..a7c968bc9f88c7d26e1887bb53106b4a class Frame; class Page; class SecurityOrigin; +diff --git a/Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp b/Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp +index ca8f169d18a697a4dea405c933398e67feef01c6..539263dd036da49441df8bcb98242d555c157428 100644 +--- a/Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp ++++ b/Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp +@@ -99,6 +99,11 @@ using namespace Inspector; + + namespace { + ++String inspectorInitiatorPrefix() ++{ ++ return "InspectorPageAgent.navigate referrer:"_s; ++} ++ + class InspectorThreadableLoaderClient final : public ThreadableLoaderClient { + WTF_MAKE_NONCOPYABLE(InspectorThreadableLoaderClient); + public: +@@ -437,6 +442,13 @@ void InspectorNetworkAgent::willSendRequest(unsigned long identifier, DocumentLo + for (auto& entry : m_extraRequestHeaders) + request.setHTTPHeaderField(entry.key, entry.value); + ++ if (request.initiatorIdentifier().startsWith(inspectorInitiatorPrefix())) { ++ String referrer = request.initiatorIdentifier().substring(inspectorInitiatorPrefix().length()); ++ if (!referrer.isEmpty()) ++ request.setHTTPReferrer(referrer); ++ request.setInitiatorIdentifier(String()); ++ } ++ + auto protocolResourceType = InspectorPageAgent::resourceTypeJSON(type); + + Document* document = loader && loader->frame() ? loader->frame()->document() : nullptr; +@@ -1292,6 +1304,11 @@ void InspectorNetworkAgent::searchInRequest(ErrorString& errorString, const Stri + results = ContentSearchUtilities::searchInTextByLines(resourceData->content(), query, caseSensitive, isRegex); + } + ++String InspectorNetworkAgent::createInitiatorIdentifierForInspectorNavigation(const String& referrer) ++{ ++ return inspectorInitiatorPrefix() + referrer; ++} ++ + void InspectorNetworkAgent::mainFrameNavigated(DocumentLoader& loader) + { + m_resourcesData->clear(loaderIdentifier(&loader)); +diff --git a/Source/WebCore/inspector/agents/InspectorNetworkAgent.h b/Source/WebCore/inspector/agents/InspectorNetworkAgent.h +index a68f84520736977c8b9216616c5a178fbf5275d6..364dd6793f0f35134a302827a72f6c9b0bd388cd 100644 +--- a/Source/WebCore/inspector/agents/InspectorNetworkAgent.h ++++ b/Source/WebCore/inspector/agents/InspectorNetworkAgent.h +@@ -125,6 +125,8 @@ public: + void searchOtherRequests(const JSC::Yarr::RegularExpression&, RefPtr>&); + void searchInRequest(ErrorString&, const String& requestId, const String& query, bool caseSensitive, bool isRegex, RefPtr>&); + ++ static String createInitiatorIdentifierForInspectorNavigation(const String& referrer); ++ + protected: + InspectorNetworkAgent(WebAgentContext&); + diff --git a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp -index 01edd0060de362c1ab7b702475ae83822279a800..19d0b3acf2b2f75ac65f00df4e9a9190a710a611 100644 +index 01edd0060de362c1ab7b702475ae83822279a800..2a7254f577b2189cb1c3b2d9b0b04cd2d0935e18 100644 --- a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp +++ b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp @@ -32,6 +32,8 @@ @@ -1637,7 +1693,7 @@ index 01edd0060de362c1ab7b702475ae83822279a800..19d0b3acf2b2f75ac65f00df4e9a9190 #define DISABLE_INSPECTOR_OVERRIDE_SETTING(name) \ m_inspectedPage.settings().set##name##InspectorOverride(WTF::nullopt); -@@ -412,14 +424,28 @@ void InspectorPageAgent::reload(ErrorString&, const bool* optionalReloadFromOrig +@@ -412,14 +424,30 @@ void InspectorPageAgent::reload(ErrorString&, const bool* optionalReloadFromOrig m_inspectedPage.mainFrame().loader().reload(reloadOptions); } @@ -1654,7 +1710,7 @@ index 01edd0060de362c1ab7b702475ae83822279a800..19d0b3acf2b2f75ac65f00df4e9a9190 + errorString = "Failed to go forward"_s; +} + -+void InspectorPageAgent::navigate(ErrorString& errorString, const String& url, const String* frameId) ++void InspectorPageAgent::navigate(ErrorString& errorString, const String& url, const String* frameId, const String* referrer) { UserGestureIndicator indicator { ProcessingUserGesture }; - Frame& frame = m_inspectedPage.mainFrame(); @@ -1666,12 +1722,14 @@ index 01edd0060de362c1ab7b702475ae83822279a800..19d0b3acf2b2f75ac65f00df4e9a9190 - FrameLoadRequest frameLoadRequest { *frame.document(), frame.document()->securityOrigin(), resourceRequest, "_self"_s, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::No, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow, InitiatedByMainFrame::Unknown }; - frame.loader().changeLocation(WTFMove(frameLoadRequest)); + ResourceRequest resourceRequest { frame->document()->completeURL(url) }; ++ if (referrer) ++ resourceRequest.setInitiatorIdentifier(InspectorNetworkAgent::createInitiatorIdentifierForInspectorNavigation(*referrer)); + FrameLoadRequest frameLoadRequest { *frame->document(), frame->document()->securityOrigin(), resourceRequest, "_self"_s, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::No, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow, InitiatedByMainFrame::Unknown }; + frame->loader().changeLocation(WTFMove(frameLoadRequest)); } void InspectorPageAgent::overrideUserAgent(ErrorString&, const String* value) -@@ -680,15 +706,16 @@ void InspectorPageAgent::setShowPaintRects(ErrorString&, bool show) +@@ -680,15 +708,16 @@ void InspectorPageAgent::setShowPaintRects(ErrorString&, bool show) m_overlay->setShowPaintRects(show); } @@ -1693,7 +1751,7 @@ index 01edd0060de362c1ab7b702475ae83822279a800..19d0b3acf2b2f75ac65f00df4e9a9190 } void InspectorPageAgent::frameNavigated(Frame& frame) -@@ -763,6 +790,12 @@ void InspectorPageAgent::frameClearedScheduledNavigation(Frame& frame) +@@ -763,6 +792,12 @@ void InspectorPageAgent::frameClearedScheduledNavigation(Frame& frame) m_frontendDispatcher->frameClearedScheduledNavigation(frameId(&frame)); } @@ -1706,7 +1764,7 @@ index 01edd0060de362c1ab7b702475ae83822279a800..19d0b3acf2b2f75ac65f00df4e9a9190 void InspectorPageAgent::defaultAppearanceDidChange(bool useDarkAppearance) { m_frontendDispatcher->defaultAppearanceDidChange(useDarkAppearance ? Inspector::Protocol::Page::Appearance::Dark : Inspector::Protocol::Page::Appearance::Light); -@@ -817,6 +850,38 @@ void InspectorPageAgent::didRecalculateStyle() +@@ -817,6 +852,38 @@ void InspectorPageAgent::didRecalculateStyle() m_overlay->update(); } @@ -1745,7 +1803,7 @@ index 01edd0060de362c1ab7b702475ae83822279a800..19d0b3acf2b2f75ac65f00df4e9a9190 Ref InspectorPageAgent::buildObjectForFrame(Frame* frame) { ASSERT_ARG(frame, frame); -@@ -988,4 +1053,491 @@ void InspectorPageAgent::archive(ErrorString& errorString, String* data) +@@ -988,4 +1055,491 @@ void InspectorPageAgent::archive(ErrorString& errorString, String* data) #endif } @@ -2238,7 +2296,7 @@ index 01edd0060de362c1ab7b702475ae83822279a800..19d0b3acf2b2f75ac65f00df4e9a9190 + } // namespace WebCore diff --git a/Source/WebCore/inspector/agents/InspectorPageAgent.h b/Source/WebCore/inspector/agents/InspectorPageAgent.h -index 4fd8c0b1016e5ab4752558d6530abb520ecea26a..9954be9e35ab21d056484f3707d092d7d526b79b 100644 +index 4fd8c0b1016e5ab4752558d6530abb520ecea26a..1d5da13a362e64d0cb03955f763f77fed3420684 100644 --- a/Source/WebCore/inspector/agents/InspectorPageAgent.h +++ b/Source/WebCore/inspector/agents/InspectorPageAgent.h @@ -40,10 +40,15 @@ @@ -2264,7 +2322,7 @@ index 4fd8c0b1016e5ab4752558d6530abb520ecea26a..9954be9e35ab21d056484f3707d092d7 - void navigate(ErrorString&, const String& url) override; + void goBack(ErrorString&) override; + void goForward(ErrorString&) override; -+ void navigate(ErrorString&, const String& url, const String* frameId) override; ++ void navigate(ErrorString&, const String& url, const String* frameId, const String* referrer) override; void overrideUserAgent(ErrorString&, const String* value) override; void overrideSetting(ErrorString&, const String& setting, const bool* value) override; void getCookies(ErrorString&, RefPtr>& cookies) override; @@ -2491,7 +2549,7 @@ index 54a00e05828fbe10d7c69facf69bf0c302687786..df0aa6dbd784813514f59bf8c37d8370 Page& m_inspectedPage; diff --git a/Source/WebCore/loader/FrameLoader.cpp b/Source/WebCore/loader/FrameLoader.cpp -index 0f1f281a594f7d3161e45403339841cacdd38f4f..d3d08f344a270df5cc342b1824b93912f408ad92 100644 +index 0f1f281a594f7d3161e45403339841cacdd38f4f..72d9bc5fdbf9f0271e6e1488d124efc5848bf294 100644 --- a/Source/WebCore/loader/FrameLoader.cpp +++ b/Source/WebCore/loader/FrameLoader.cpp @@ -1203,6 +1203,7 @@ void FrameLoader::loadInSameDocument(const URL& url, SerializedScriptValue* stat @@ -2502,7 +2560,16 @@ index 0f1f281a594f7d3161e45403339841cacdd38f4f..d3d08f344a270df5cc342b1824b93912 m_frame.document()->statePopped(stateObject ? Ref { *stateObject } : SerializedScriptValue::nullValue()); m_client.dispatchDidPopStateWithinPage(); -@@ -3205,6 +3206,8 @@ void FrameLoader::receivedMainResourceError(const ResourceError& error) +@@ -1388,6 +1389,8 @@ void FrameLoader::loadURL(FrameLoadRequest&& frameLoadRequest, const String& ref + + ASSERT(newLoadType != FrameLoadType::Same); + ++ request.setInitiatorIdentifier(frameLoadRequest.resourceRequest().initiatorIdentifier()); ++ + // The search for a target frame is done earlier in the case of form submission. + Frame* targetFrame = isFormSubmission ? nullptr : findFrameForNavigation(effectiveFrameName); + if (targetFrame && targetFrame != &m_frame) { +@@ -3205,6 +3208,8 @@ void FrameLoader::receivedMainResourceError(const ResourceError& error) checkCompleted(); if (m_frame.page()) checkLoadComplete(); @@ -2511,7 +2578,7 @@ index 0f1f281a594f7d3161e45403339841cacdd38f4f..d3d08f344a270df5cc342b1824b93912 } void FrameLoader::continueFragmentScrollAfterNavigationPolicy(const ResourceRequest& request, bool shouldContinue) -@@ -3971,9 +3974,6 @@ String FrameLoader::referrer() const +@@ -3971,9 +3976,6 @@ String FrameLoader::referrer() const void FrameLoader::dispatchDidClearWindowObjectsInAllWorlds() { @@ -2521,7 +2588,7 @@ index 0f1f281a594f7d3161e45403339841cacdd38f4f..d3d08f344a270df5cc342b1824b93912 Vector> worlds; ScriptController::getAllWorlds(worlds); for (auto& world : worlds) -@@ -3982,13 +3982,12 @@ void FrameLoader::dispatchDidClearWindowObjectsInAllWorlds() +@@ -3982,13 +3984,12 @@ void FrameLoader::dispatchDidClearWindowObjectsInAllWorlds() void FrameLoader::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld& world) { diff --git a/package.json b/package.json index 7efde39f78..22a9364521 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "playwright": { "chromium_revision": "724623", "firefox_revision": "1008", - "webkit_revision": "1043" + "webkit_revision": "1044" }, "scripts": { "unit": "node test/test.js", diff --git a/src/webkit/FrameManager.ts b/src/webkit/FrameManager.ts index bd41857616..dc07807fe4 100644 --- a/src/webkit/FrameManager.ts +++ b/src/webkit/FrameManager.ts @@ -190,7 +190,7 @@ export class FrameManager implements PageDelegate { } async navigateFrame(frame: frames.Frame, url: string, referrer: string | undefined): Promise { - await this._session.send('Page.navigate', { url, frameId: frame._id }); + await this._session.send('Page.navigate', { url, frameId: frame._id, referrer }); return {}; // We cannot get loaderId of cross-process navigation in advance. } diff --git a/test/navigation.spec.js b/test/navigation.spec.js index e09812484f..fe7e685be4 100644 --- a/test/navigation.spec.js +++ b/test/navigation.spec.js @@ -416,7 +416,7 @@ module.exports.addTests = function({testRunner, expect, playwright, FFOX, CHROME } expect(error.message).toContain(url); }); - it.skip(WEBKIT)('should send referer', async({page, server}) => { + it('should send referer', async({page, server}) => { const [request1, request2] = await Promise.all([ server.waitForRequest('/grid.html'), server.waitForRequest('/digits/1.png'), @@ -429,6 +429,37 @@ module.exports.addTests = function({testRunner, expect, playwright, FFOX, CHROME expect(request2.headers['referer']).toBe(server.PREFIX + '/grid.html'); expect(page.url()).toBe(server.PREFIX + '/grid.html'); }); + it('should use referer option when setExtraHTTPHeaders provides referer', async({page, server}) => { + await page.setExtraHTTPHeaders({ 'referer': 'http://microsoft.com/' }); + const [request1, request2] = await Promise.all([ + server.waitForRequest('/grid.html'), + server.waitForRequest('/digits/1.png'), + page.goto(server.PREFIX + '/grid.html', { + referer: 'http://google.com/', + }), + ]); + expect(request1.headers['referer']).toBe('http://google.com/'); + // Make sure subresources use referer specified by setExtraHTTPHeaders. + expect(request2.headers['referer']).toBe('http://microsoft.com/'); + expect(page.url()).toBe(server.PREFIX + '/grid.html'); + }); + it('should override referrer-policy', async({page, server}) => { + server.setRoute('/grid.html', (req, res) => { + res.setHeader('Referrer-Policy', 'no-referrer'); + server.serveFile(req, res, '/grid.html'); + }); + const [request1, request2] = await Promise.all([ + server.waitForRequest('/grid.html'), + server.waitForRequest('/digits/1.png'), + page.goto(server.PREFIX + '/grid.html', { + referer: 'http://microsoft.com/', + }), + ]); + expect(request1.headers['referer']).toBe('http://microsoft.com/'); + // Make sure subresources do not inherit referer. + expect(request2.headers['referer']).toBe(undefined); + expect(page.url()).toBe(server.PREFIX + '/grid.html'); + }); }); describe('Page.waitForNavigation', function() {