Commit d615826c authored by Andrey Kosyakov's avatar Andrey Kosyakov Committed by Commit Bot

DevTools: prepare NetworkManager for cross-target requests

This prepares the front-end for https://chromium-review.googlesource.com/c/chromium/src/+/861952,
which will cause requestWillBeSent and responseReceived to
be sent from a different target with regards to dataReceived
and loadingFinished events for the main resources.

Change-Id: Iae80c139e01523375689468866c228a15c2e6a89
Reviewed-on: https://chromium-review.googlesource.com/872255
Commit-Queue: Andrey Kosyakov <caseq@chromium.org>
Reviewed-by: default avatarDmitry Gozman <dgozman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#530695}
parent 74003faf
Tests content is available for a cross-process iframe.
content: <html>
<head>
</head>
<body>
<p>Cross origin frame.<p>
</body>
</html>
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
(async function() {
// TestRunner.startDumpingProtocolMessages();
TestRunner.addResult(`Tests content is available for a cross-process iframe.\n`);
await TestRunner.loadModule('network_test_runner');
await TestRunner.showPanel('network');
NetworkTestRunner.recordNetwork();
await TestRunner.addIframe('http://devtools.oopif.test:8000/devtools/resources/cross-origin-iframe.html');
const request = NetworkTestRunner.networkRequests().pop();
if (!request || !request.finished) {
TestRunner.addResult('FAILED: request not finished!');
TestRunner.completeTest();
return;
}
const content = await request.requestContent();
TestRunner.addResult(`content: ${content}`);
TestRunner.completeTest();
})();
......@@ -490,6 +490,8 @@ SDK.NetworkDispatcher = class {
*/
dataReceived(requestId, time, dataLength, encodedDataLength) {
var networkRequest = this._inflightRequestsById[requestId];
if (!networkRequest)
networkRequest = this._maybeAdoptMainResourceRequest(requestId);
if (!networkRequest)
return;
......@@ -510,6 +512,8 @@ SDK.NetworkDispatcher = class {
*/
loadingFinished(requestId, finishTime, encodedDataLength, blockedCrossSiteDocument) {
var networkRequest = this._inflightRequestsById[requestId];
if (!networkRequest)
networkRequest = this._maybeAdoptMainResourceRequest(requestId);
if (!networkRequest)
return;
this._finishNetworkRequest(networkRequest, finishTime, encodedDataLength, blockedCrossSiteDocument);
......@@ -721,12 +725,34 @@ SDK.NetworkDispatcher = class {
return newNetworkRequest;
}
/**
* @param {string} requestId
* @return {?SDK.NetworkRequest}
*/
_maybeAdoptMainResourceRequest(requestId) {
var request = SDK.multitargetNetworkManager._inflightMainResourceRequests.get(requestId);
if (!request)
return null;
var oldDispatcher = SDK.NetworkManager.forRequest(request)._dispatcher;
delete oldDispatcher._inflightRequestsById[requestId];
delete oldDispatcher._inflightRequestsByURL[request.url()];
this._inflightRequestsById[requestId] = request;
this._inflightRequestsByURL[request.url()] = request;
request[SDK.NetworkManager._networkManagerForRequestSymbol] = this._manager;
return request;
}
/**
* @param {!SDK.NetworkRequest} networkRequest
*/
_startNetworkRequest(networkRequest) {
this._inflightRequestsById[networkRequest.requestId()] = networkRequest;
this._inflightRequestsByURL[networkRequest.url()] = networkRequest;
// The following relies on the fact that loaderIds and requestIds are
// globally unique and that the main request has them equal.
if (networkRequest.loaderId === networkRequest.requestId())
SDK.multitargetNetworkManager._inflightMainResourceRequests.set(networkRequest.requestId(), networkRequest);
this._manager.dispatchEventToListeners(SDK.NetworkManager.Events.RequestStarted, networkRequest);
}
......@@ -751,6 +777,7 @@ SDK.NetworkDispatcher = class {
this._manager.dispatchEventToListeners(SDK.NetworkManager.Events.RequestFinished, networkRequest);
delete this._inflightRequestsById[networkRequest.requestId()];
delete this._inflightRequestsByURL[networkRequest.url()];
SDK.multitargetNetworkManager._inflightMainResourceRequests.delete(networkRequest.requestId());
if (blockedCrossSiteDocument) {
var message = Common.UIString(
......@@ -798,6 +825,8 @@ SDK.MultitargetNetworkManager = class extends Common.Object {
this._userAgentOverride = '';
/** @type {!Set<!Protocol.NetworkAgent>} */
this._agents = new Set();
/** @type {!Map<string, !SDK.NetworkRequest>} */
this._inflightMainResourceRequests = new Map();
/** @type {!SDK.NetworkManager.Conditions} */
this._networkConditions = SDK.NetworkManager.NoThrottlingConditions;
/** @type {?Promise} */
......@@ -852,6 +881,12 @@ SDK.MultitargetNetworkManager = class extends Common.Object {
* @param {!SDK.Target} target
*/
targetRemoved(target) {
for (var entry of this._inflightMainResourceRequests) {
var manager = SDK.NetworkManager.forRequest(/** @type {!SDK.NetworkRequest} */ (entry[1]));
if (manager.target() !== target)
continue;
this._inflightMainResourceRequests.delete(/** @type {string} */ (entry[0]));
}
this._agents.delete(target.networkAgent());
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment