Merge branch 'master' into fix-late-attach

This commit is contained in:
Andrey Lushnikov 2019-12-17 17:32:45 -08:00 committed by GitHub
commit a9c9525c70
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 132 additions and 31 deletions

View file

@ -1 +1 @@
1007
1008

View file

@ -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,

View file

@ -1 +1 @@
1043
1044

View file

@ -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<JSON::ArrayOf<Inspector::Protocol::Page::SearchResult>>&);
void searchInRequest(ErrorString&, const String& requestId, const String& query, bool caseSensitive, bool isRegex, RefPtr<JSON::ArrayOf<Inspector::Protocol::GenericTypes::SearchMatch>>&);
+ 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<Inspector::Protocol::Page::Frame> 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<JSON::ArrayOf<Inspector::Protocol::Page::Cookie>>& 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<SerializedScriptValue> { *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<Ref<DOMWrapperWorld>> 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)
{

View file

@ -10,7 +10,7 @@
"playwright": {
"chromium_revision": "724623",
"firefox_revision": "1008",
"webkit_revision": "1043"
"webkit_revision": "1044"
},
"scripts": {
"unit": "node test/test.js",

View file

@ -190,7 +190,7 @@ export class FrameManager implements PageDelegate {
}
async navigateFrame(frame: frames.Frame, url: string, referrer: string | undefined): Promise<frames.GotoResult> {
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.
}

View file

@ -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() {