Diff
Modified: trunk/LayoutTests/ChangeLog (230819 => 230820)
--- trunk/LayoutTests/ChangeLog 2018-04-19 21:00:50 UTC (rev 230819)
+++ trunk/LayoutTests/ChangeLog 2018-04-19 21:27:02 UTC (rev 230820)
@@ -1,3 +1,13 @@
+2018-04-19 Youenn Fablet <you...@apple.com>
+
+ Web Inspector backend should get headers & cookies from network process separately from resource requests
+ https://bugs.webkit.org/show_bug.cgi?id=184396
+ <rdar://problem/38877384>
+
+ Reviewed by Brian Burg.
+
+ * http/wpt/service-workers/header-filtering.https-expected.txt:
+
2018-04-19 Wenson Hsieh <wenson_hs...@apple.com>
[Extra zoom mode] Add a mechanism to extend the height of the layout viewport in extra zoom mode
Modified: trunk/LayoutTests/http/wpt/service-workers/header-filtering.https-expected.txt (230819 => 230820)
--- trunk/LayoutTests/http/wpt/service-workers/header-filtering.https-expected.txt 2018-04-19 21:00:50 UTC (rev 230819)
+++ trunk/LayoutTests/http/wpt/service-workers/header-filtering.https-expected.txt 2018-04-19 21:27:02 UTC (rev 230820)
@@ -3,8 +3,8 @@
PASS Prepare tests: setup worker and register the client
PASS Prepare tests: Add a frame controlled by service worker
PASS Test same-origin fetch
-FAIL Test cors cross-origin fetch assert_array_equals: lengths differ, expected 13 got 15
-FAIL Test no-cors cross-origin fetch assert_array_equals: lengths differ, expected 13 got 15
+PASS Test cors cross-origin fetch
+PASS Test no-cors cross-origin fetch
PASS Test same-origin script load
PASS Test no-cors script load
PASS Test cors script load
Modified: trunk/Source/WebCore/ChangeLog (230819 => 230820)
--- trunk/Source/WebCore/ChangeLog 2018-04-19 21:00:50 UTC (rev 230819)
+++ trunk/Source/WebCore/ChangeLog 2018-04-19 21:27:02 UTC (rev 230820)
@@ -1,3 +1,26 @@
+2018-04-19 Youenn Fablet <you...@apple.com>
+
+ Web Inspector backend should get headers & cookies from network process separately from resource requests
+ https://bugs.webkit.org/show_bug.cgi?id=184396
+ <rdar://problem/38877384>
+
+ Reviewed by Brian Burg.
+
+ Add two new loader strategies to get response and network metrics directly from
+ NetworkProcess based on resource loader identifier.
+ Use these methods in InspectorNetworkAgent when response/metrics might be filtered.
+
+ Covered by existing tests, in particular http/tests/inspector/network/fetch-network-data.html which would fail
+ without this since we are now setting the sourceOrigin for NetworkResourceLoader, which is used to sanitize response headers.
+
+ * inspector/agents/InspectorNetworkAgent.cpp:
+ (WebCore::InspectorNetworkAgent::didReceiveResponse):
+ (WebCore::InspectorNetworkAgent::didFinishLoading):
+ * loader/LoaderStrategy.cpp:
+ (WebCore::LoaderStrategy::responseFromResourceLoaIdentifier):
+ (WebCore::LoaderStrategy::networkMetricsFromResourceLoaIdentifier):
+ * loader/LoaderStrategy.h:
+
2018-04-19 Wenson Hsieh <wenson_hs...@apple.com>
[Extra zoom mode] Add a mechanism to extend the height of the layout viewport in extra zoom mode
Modified: trunk/Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp (230819 => 230820)
--- trunk/Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp 2018-04-19 21:00:50 UTC (rev 230819)
+++ trunk/Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp 2018-04-19 21:27:02 UTC (rev 230820)
@@ -49,15 +49,18 @@
#include "InstrumentingAgents.h"
#include "JSMainThreadExecState.h"
#include "JSWebSocket.h"
+#include "LoaderStrategy.h"
#include "MIMETypeRegistry.h"
#include "MemoryCache.h"
#include "NetworkResourcesData.h"
#include "Page.h"
+#include "PlatformStrategies.h"
#include "ProgressTracker.h"
#include "ResourceError.h"
#include "ResourceLoader.h"
#include "ResourceRequest.h"
#include "ResourceResponse.h"
+#include "RuntimeEnabledFeatures.h"
#include "ScriptState.h"
#include "ScriptableDocumentParser.h"
#include "SubresourceLoader.h"
@@ -418,6 +421,23 @@
willSendRequest(identifier, loader, request, ResourceResponse(), resourceTypeForLoadType(loadType));
}
+static inline bool isResponseProbablyComingFromNetworkProcess(ResourceResponse::Source source)
+{
+ switch (source) {
+ case ResourceResponse::Source::MemoryCache:
+ case ResourceResponse::Source::MemoryCacheAfterValidation:
+ case ResourceResponse::Source::ServiceWorker:
+ case ResourceResponse::Source::ApplicationCache:
+ return false;
+ case ResourceResponse::Source::Unknown:
+ case ResourceResponse::Source::Network:
+ case ResourceResponse::Source::DiskCache:
+ case ResourceResponse::Source::DiskCacheAfterValidation:
+ return true;
+ }
+ return true;
+}
+
void InspectorNetworkAgent::didReceiveResponse(unsigned long identifier, DocumentLoader* loader, const ResourceResponse& response, ResourceLoader* resourceLoader)
{
if (m_hiddenRequestIdentifiers.contains(identifier))
@@ -424,8 +444,19 @@
return;
String requestId = IdentifiersFactory::requestId(identifier);
- RefPtr<Inspector::Protocol::Network::Response> resourceResponse = buildObjectForResourceResponse(response, resourceLoader);
+ std::optional<ResourceResponse> realResponse;
+ if (RuntimeEnabledFeatures::sharedFeatures().restrictedHTTPResponseAccess() && isResponseProbablyComingFromNetworkProcess(response.source())) {
+ callOnMainThreadAndWait([&] {
+ // We do not need to isolate response since it comes straight from IPC, but we might want to isolate it for extra safety.
+ auto response = platformStrategies()->loaderStrategy()->responseFromResourceLoadIdentifier(identifier);
+ if (!response.isNull())
+ realResponse = WTFMove(response);
+ });
+ }
+
+ RefPtr<Inspector::Protocol::Network::Response> resourceResponse = buildObjectForResourceResponse(realResponse ? *realResponse : response, resourceLoader);
+
bool isNotModified = response.httpStatusCode() == 304;
CachedResource* cachedResource = nullptr;
@@ -502,7 +533,13 @@
if (resourceData && resourceData->cachedResource())
sourceMappingURL = InspectorPageAgent::sourceMapURLForResource(resourceData->cachedResource());
- RefPtr<Inspector::Protocol::Network::Metrics> metrics = buildObjectForMetrics(networkLoadMetrics);
+ std::optional<NetworkLoadMetrics> realMetrics;
+ if (RuntimeEnabledFeatures::sharedFeatures().restrictedHTTPResponseAccess() && !networkLoadMetrics.isComplete()) {
+ callOnMainThreadAndWait([&] {
+ realMetrics = platformStrategies()->loaderStrategy()->networkMetricsFromResourceLoadIdentifier(identifier).isolatedCopy();
+ });
+ }
+ RefPtr<Inspector::Protocol::Network::Metrics> metrics = buildObjectForMetrics(realMetrics ? *realMetrics : networkLoadMetrics);
m_frontendDispatcher->loadingFinished(requestId, elapsedFinishTime, !sourceMappingURL.isEmpty() ? &sourceMappingURL : nullptr, metrics);
}
Modified: trunk/Source/WebCore/loader/LoaderStrategy.cpp (230819 => 230820)
--- trunk/Source/WebCore/loader/LoaderStrategy.cpp 2018-04-19 21:00:50 UTC (rev 230819)
+++ trunk/Source/WebCore/loader/LoaderStrategy.cpp 2018-04-19 21:27:02 UTC (rev 230820)
@@ -26,12 +26,24 @@
#include "config.h"
#include "LoaderStrategy.h"
+#include "NetworkLoadMetrics.h"
#include "PlatformStrategies.h"
+#include "ResourceResponse.h"
namespace WebCore {
LoaderStrategy::~LoaderStrategy() = default;
+ResourceResponse LoaderStrategy::responseFromResourceLoadIdentifier(uint64_t /* resourceLoadIdentifier */)
+{
+ return { };
+}
+
+NetworkLoadMetrics LoaderStrategy::networkMetricsFromResourceLoadIdentifier(uint64_t /* resourceLoadIdentifier */)
+{
+ return { };
+}
+
} // namespace WebCore
Modified: trunk/Source/WebCore/loader/LoaderStrategy.h (230819 => 230820)
--- trunk/Source/WebCore/loader/LoaderStrategy.h 2018-04-19 21:00:50 UTC (rev 230819)
+++ trunk/Source/WebCore/loader/LoaderStrategy.h 2018-04-19 21:27:02 UTC (rev 230820)
@@ -42,6 +42,7 @@
class HTTPHeaderMap;
class NetscapePlugInStreamLoader;
class NetscapePlugInStreamLoaderClient;
+class NetworkLoadMetrics;
class ResourceError;
class ResourceLoader;
class ResourceRequest;
@@ -81,6 +82,9 @@
virtual bool isDoingLoadingSecurityChecks() const { return false; }
+ virtual ResourceResponse responseFromResourceLoadIdentifier(uint64_t resourceLoadIdentifier);
+ virtual NetworkLoadMetrics networkMetricsFromResourceLoadIdentifier(uint64_t resourceLoadIdentifier);
+
protected:
virtual ~LoaderStrategy();
};
Modified: trunk/Source/WebKit/ChangeLog (230819 => 230820)
--- trunk/Source/WebKit/ChangeLog 2018-04-19 21:00:50 UTC (rev 230819)
+++ trunk/Source/WebKit/ChangeLog 2018-04-19 21:27:02 UTC (rev 230820)
@@ -1,3 +1,43 @@
+2018-04-19 Youenn Fablet <you...@apple.com>
+
+ Web Inspector backend should get headers & cookies from network process separately from resource requests
+ https://bugs.webkit.org/show_bug.cgi?id=184396
+ <rdar://problem/38877384>
+
+ Reviewed by Brian Burg.
+
+ Add support for storing response and network metrics for every resource load.
+ This is made conditional on inspector being activated.
+ NetworkConnectionToWebProcess keeps a response and network metrics for every load.
+ This is cleared when inspector is going away or when a web process requests
+ the data.
+
+ WebLoaderStrategy gets this data through synchronous IPC.
+ Synchronous IPC is a temporary implementation until Inspector code gets refactored.
+
+ Updated WebLoaderStrategy to pass the sourceOrigin for every NetworkResourceLoader.
+ This activates additional sanitization based on cross origin status.
+
+ * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+ (WebKit::NetworkConnectionToWebProcess::setCaptureExtraNetworkLoadMetricsEnabled):
+ * NetworkProcess/NetworkConnectionToWebProcess.h:
+ (WebKit::NetworkConnectionToWebProcess::takeNetworkLoadInformationResponse):
+ (WebKit::NetworkConnectionToWebProcess::takeNetworkLoadInformationMetrics):
+ (WebKit::NetworkConnectionToWebProcess::addNetworkLoadInformationResponse):
+ (WebKit::NetworkConnectionToWebProcess::addNetworkLoadInformationMetrics):
+ (WebKit::NetworkConnectionToWebProcess::removeNetworkLoadInformation):
+ * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
+ * NetworkProcess/NetworkResourceLoader.cpp:
+ (WebKit::NetworkResourceLoader::didReceiveResponse):
+ (WebKit::NetworkResourceLoader::didFinishLoading):
+ (WebKit::NetworkResourceLoader::didFailLoading):
+ * WebProcess/Network/WebLoaderStrategy.cpp:
+ (WebKit::WebLoaderStrategy::responseFromResourceLoadIdentifier):
+ (WebKit::WebLoaderStrategy::networkMetricsFromResourceLoadIdentifier):
+ * WebProcess/Network/WebLoaderStrategy.h:
+ * WebProcess/Network/WebResourceLoader.cpp:
+ (WebKit::WebResourceLoader::didReceiveResponse):
+
2018-04-19 Wenson Hsieh <wenson_hs...@apple.com>
[Extra zoom mode] Add a mechanism to extend the height of the layout viewport in extra zoom mode
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (230819 => 230820)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp 2018-04-19 21:00:50 UTC (rev 230819)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp 2018-04-19 21:27:02 UTC (rev 230820)
@@ -484,6 +484,8 @@
void NetworkConnectionToWebProcess::setCaptureExtraNetworkLoadMetricsEnabled(bool enabled)
{
m_captureExtraNetworkLoadMetricsEnabled = enabled;
+ if (!m_captureExtraNetworkLoadMetricsEnabled)
+ m_networkLoadInformationByID.clear();
}
void NetworkConnectionToWebProcess::ensureLegacyPrivateBrowsingSession()
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h (230819 => 230820)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h 2018-04-19 21:00:50 UTC (rev 230819)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h 2018-04-19 21:27:02 UTC (rev 230820)
@@ -75,6 +75,41 @@
void cleanupForSuspension(Function<void()>&&);
void endSuspension();
+ // FIXME: We should store all redirected request/responses.
+ struct NetworkLoadInformation {
+ WebCore::ResourceResponse response;
+ WebCore::NetworkLoadMetrics metrics;
+ };
+
+ void takeNetworkLoadInformationResponse(ResourceLoadIdentifier identifier, WebCore::ResourceResponse& response)
+ {
+ response = m_networkLoadInformationByID.get(identifier).response;
+ }
+
+ void takeNetworkLoadInformationMetrics(ResourceLoadIdentifier identifier, WebCore::NetworkLoadMetrics& metrics)
+ {
+ metrics = m_networkLoadInformationByID.take(identifier).metrics;
+ }
+
+ void addNetworkLoadInformationResponse(ResourceLoadIdentifier identifier, const WebCore::ResourceResponse& response)
+ {
+ ASSERT(!m_networkLoadInformationByID.contains(identifier));
+ m_networkLoadInformationByID.add(identifier, NetworkLoadInformation { response, { } });
+ }
+
+ void addNetworkLoadInformationMetrics(ResourceLoadIdentifier identifier, const WebCore::NetworkLoadMetrics& metrics)
+ {
+ ASSERT(m_networkLoadInformationByID.contains(identifier));
+ m_networkLoadInformationByID.ensure(identifier, [] {
+ return NetworkLoadInformation { };
+ }).iterator->value.metrics = metrics;
+ }
+
+ void removeNetworkLoadInformation(ResourceLoadIdentifier identifier)
+ {
+ m_networkLoadInformationByID.remove(identifier);
+ }
+
private:
NetworkConnectionToWebProcess(IPC::Connection::Identifier);
@@ -150,6 +185,9 @@
HashMap<ResourceLoadIdentifier, RefPtr<NetworkResourceLoader>> m_networkResourceLoaders;
HashMap<String, RefPtr<WebCore::BlobDataFileReference>> m_blobDataFileReferences;
+ HashMap<ResourceLoadIdentifier, NetworkLoadInformation> m_networkLoadInformationByID;
+
+
#if USE(LIBWEBRTC)
RefPtr<NetworkRTCProvider> m_rtcProvider;
#endif
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in (230819 => 230820)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in 2018-04-19 21:00:50 UTC (rev 230819)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in 2018-04-19 21:27:02 UTC (rev 230820)
@@ -64,4 +64,7 @@
AddOriginAccessWhitelistEntry(String sourceOrigin, String destinationProtocol, String destinationHost, bool allowDestinationSubdomains);
RemoveOriginAccessWhitelistEntry(String sourceOrigin, String destinationProtocol, String destinationHost, bool allowDestinationSubdomains);
ResetOriginAccessWhitelists();
+
+ TakeNetworkLoadInformationResponse(uint64_t resourceLoadIdentifier) -> (WebCore::ResourceResponse response);
+ TakeNetworkLoadInformationMetrics(uint64_t resourceLoadIdentifier) -> (WebCore::NetworkLoadMetrics networkMetrics);
}
Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp (230819 => 230820)
--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp 2018-04-19 21:00:50 UTC (rev 230819)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp 2018-04-19 21:27:02 UTC (rev 230820)
@@ -357,6 +357,9 @@
m_response = WTFMove(receivedResponse);
+ if (shouldCaptureExtraNetworkLoadMetrics())
+ m_connection->addNetworkLoadInformationResponse(identifier(), m_response);
+
// For multipart/x-mixed-replace didReceiveResponseAsync gets called multiple times and buffering would require special handling.
if (!isSynchronous() && m_response.isMultipart())
m_bufferedData = nullptr;
@@ -432,6 +435,9 @@
{
RELEASE_LOG_IF_ALLOWED("didFinishLoading: (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ", length = %zd)", m_parameters.webPageID, m_parameters.webFrameID, m_parameters.identifier, m_numBytesReceived);
+ if (shouldCaptureExtraNetworkLoadMetrics())
+ m_connection->addNetworkLoadInformationMetrics(identifier(), networkLoadMetrics);
+
if (m_cacheEntryForValidation) {
// 304 Not Modified
ASSERT(m_response.httpStatusCode() == 304);
@@ -464,6 +470,9 @@
{
RELEASE_LOG_IF_ALLOWED("didFailLoading: (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ", isTimeout = %d, isCancellation = %d, errCode = %d)", m_parameters.webPageID, m_parameters.webFrameID, m_parameters.identifier, error.isTimeout(), error.isCancellation(), error.errorCode());
+ if (shouldCaptureExtraNetworkLoadMetrics())
+ m_connection->removeNetworkLoadInformation(identifier());
+
ASSERT(!error.isNull());
m_cacheEntryForValidation = nullptr;
Modified: trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp (230819 => 230820)
--- trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp 2018-04-19 21:00:50 UTC (rev 230819)
+++ trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp 2018-04-19 21:27:02 UTC (rev 230820)
@@ -275,6 +275,27 @@
loadParameters.derivedCachedDataTypesToRetrieve = resourceLoader.options().derivedCachedDataTypesToRetrieve;
loadParameters.options = resourceLoader.options();
+ if (loadParameters.options.mode != FetchOptions::Mode::Navigate) {
+ // FIXME: All loaders should provide their origin if navigation mode is cors/no-cors/same-origin.
+ // As a temporary approach, we use the document origin if available or the HTTP Origin header otherwise.
+ if (resourceLoader.isSubresourceLoader())
+ loadParameters.sourceOrigin = static_cast<SubresourceLoader&>(resourceLoader).origin();
+
+ auto* document = resourceLoader.frame() ? resourceLoader.frame()->document() : nullptr;
+ if (!loadParameters.sourceOrigin && document)
+ loadParameters.sourceOrigin = &document->securityOrigin();
+ if (!loadParameters.sourceOrigin) {
+ auto origin = request.httpOrigin();
+ if (!origin.isNull())
+ loadParameters.sourceOrigin = SecurityOrigin::createFromString(origin);
+ }
+ ASSERT(loadParameters.sourceOrigin);
+ if (!loadParameters.sourceOrigin) {
+ scheduleInternallyFailedLoad(resourceLoader);
+ return;
+ }
+ }
+
// FIXME: We should also sanitize redirect response for navigations.
loadParameters.shouldRestrictHTTPResponseAccess = RuntimeEnabledFeatures::sharedFeatures().restrictedHTTPResponseAccess() && resourceLoader.options().mode != FetchOptions::Mode::Navigate;
@@ -588,4 +609,18 @@
WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::SetCaptureExtraNetworkLoadMetricsEnabled(enabled), 0);
}
+ResourceResponse WebLoaderStrategy::responseFromResourceLoadIdentifier(uint64_t resourceLoadIdentifier)
+{
+ ResourceResponse response;
+ WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::TakeNetworkLoadInformationResponse { resourceLoadIdentifier }, Messages::NetworkConnectionToWebProcess::TakeNetworkLoadInformationResponse::Reply { response }, 0);
+ return response;
+}
+
+NetworkLoadMetrics WebLoaderStrategy::networkMetricsFromResourceLoadIdentifier(uint64_t resourceLoadIdentifier)
+{
+ NetworkLoadMetrics networkMetrics;
+ WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::TakeNetworkLoadInformationMetrics { resourceLoadIdentifier }, Messages::NetworkConnectionToWebProcess::TakeNetworkLoadInformationMetrics::Reply { networkMetrics }, 0);
+ return networkMetrics;
+}
+
} // namespace WebKit
Modified: trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h (230819 => 230820)
--- trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h 2018-04-19 21:00:50 UTC (rev 230819)
+++ trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h 2018-04-19 21:27:02 UTC (rev 230820)
@@ -92,6 +92,9 @@
void startLocalLoad(WebCore::ResourceLoader&);
bool tryLoadingUsingURLSchemeHandler(WebCore::ResourceLoader&);
+ WebCore::ResourceResponse responseFromResourceLoadIdentifier(uint64_t resourceLoadIdentifier) final;
+ WebCore::NetworkLoadMetrics networkMetricsFromResourceLoadIdentifier(uint64_t resourceLoadIdentifier) final;
+
HashSet<RefPtr<WebCore::ResourceLoader>> m_internallyFailedResourceLoaders;
RunLoop::Timer<WebLoaderStrategy> m_internallyFailedLoadTimer;