diff options
Diffstat (limited to 'Source/WebCore/inspector/InspectorResourceAgent.cpp')
-rw-r--r-- | Source/WebCore/inspector/InspectorResourceAgent.cpp | 658 |
1 files changed, 0 insertions, 658 deletions
diff --git a/Source/WebCore/inspector/InspectorResourceAgent.cpp b/Source/WebCore/inspector/InspectorResourceAgent.cpp deleted file mode 100644 index 783d0176d..000000000 --- a/Source/WebCore/inspector/InspectorResourceAgent.cpp +++ /dev/null @@ -1,658 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" - -#if ENABLE(INSPECTOR) - -#include "InspectorResourceAgent.h" - -#include "CachedRawResource.h" -#include "CachedResource.h" -#include "CachedResourceLoader.h" -#include "Document.h" -#include "DocumentLoader.h" -#include "ExceptionCodePlaceholder.h" -#include "Frame.h" -#include "FrameLoader.h" -#include "HTTPHeaderMap.h" -#include "IconController.h" -#include "IdentifiersFactory.h" -#include "InspectorClient.h" -#include "InspectorPageAgent.h" -#include "InspectorWebFrontendDispatchers.h" -#include "InstrumentingAgents.h" -#include "MemoryCache.h" -#include "NetworkResourcesData.h" -#include "Page.h" -#include "ProgressTracker.h" -#include "ResourceBuffer.h" -#include "ResourceError.h" -#include "ResourceLoader.h" -#include "ResourceRequest.h" -#include "ResourceResponse.h" -#include "ScriptCallStack.h" -#include "ScriptCallStackFactory.h" -#include "ScriptableDocumentParser.h" -#include "Settings.h" -#include "SubresourceLoader.h" -#include "URL.h" -#include "WebSocketFrame.h" -#include "XMLHttpRequest.h" -#include <inspector/InspectorValues.h> -#include <wtf/CurrentTime.h> -#include <wtf/HexNumber.h> -#include <wtf/ListHashSet.h> -#include <wtf/RefPtr.h> -#include <wtf/text/StringBuilder.h> - -using namespace Inspector; - -namespace WebCore { - -void InspectorResourceAgent::didCreateFrontendAndBackend(Inspector::InspectorFrontendChannel* frontendChannel, InspectorBackendDispatcher* backendDispatcher) -{ - m_frontendDispatcher = std::make_unique<InspectorNetworkFrontendDispatcher>(frontendChannel); - m_backendDispatcher = InspectorNetworkBackendDispatcher::create(backendDispatcher, this); -} - -void InspectorResourceAgent::willDestroyFrontendAndBackend(InspectorDisconnectReason) -{ - m_frontendDispatcher = nullptr; - m_backendDispatcher.clear(); - - ErrorString error; - disable(&error); -} - -static PassRefPtr<InspectorObject> buildObjectForHeaders(const HTTPHeaderMap& headers) -{ - RefPtr<InspectorObject> headersObject = InspectorObject::create(); - HTTPHeaderMap::const_iterator end = headers.end(); - for (HTTPHeaderMap::const_iterator it = headers.begin(); it != end; ++it) - headersObject->setString(it->key.string(), it->value); - return headersObject; -} - -static PassRefPtr<Inspector::TypeBuilder::Network::ResourceTiming> buildObjectForTiming(const ResourceLoadTiming& timing, DocumentLoader* loader) -{ - return Inspector::TypeBuilder::Network::ResourceTiming::create() - .setRequestTime(loader->timing()->monotonicTimeToPseudoWallTime(timing.convertResourceLoadTimeToMonotonicTime(0))) - .setProxyStart(timing.proxyStart) - .setProxyEnd(timing.proxyEnd) - .setDnsStart(timing.dnsStart) - .setDnsEnd(timing.dnsEnd) - .setConnectStart(timing.connectStart) - .setConnectEnd(timing.connectEnd) - .setSslStart(timing.sslStart) - .setSslEnd(timing.sslEnd) - .setSendStart(timing.sendStart) - .setSendEnd(timing.sendEnd) - .setReceiveHeadersEnd(timing.receiveHeadersEnd) - .release(); -} - -static PassRefPtr<Inspector::TypeBuilder::Network::Request> buildObjectForResourceRequest(const ResourceRequest& request) -{ - RefPtr<Inspector::TypeBuilder::Network::Request> requestObject = Inspector::TypeBuilder::Network::Request::create() - .setUrl(request.url().string()) - .setMethod(request.httpMethod()) - .setHeaders(buildObjectForHeaders(request.httpHeaderFields())); - if (request.httpBody() && !request.httpBody()->isEmpty()) - requestObject->setPostData(request.httpBody()->flattenToString()); - return requestObject; -} - -static PassRefPtr<Inspector::TypeBuilder::Network::Response> buildObjectForResourceResponse(const ResourceResponse& response, DocumentLoader* loader) -{ - if (response.isNull()) - return nullptr; - - double status = response.httpStatusCode(); - RefPtr<InspectorObject> headers = buildObjectForHeaders(response.httpHeaderFields()); - - RefPtr<Inspector::TypeBuilder::Network::Response> responseObject = Inspector::TypeBuilder::Network::Response::create() - .setUrl(response.url().string()) - .setStatus(status) - .setStatusText(response.httpStatusText()) - .setHeaders(headers) - .setMimeType(response.mimeType()) - .setConnectionReused(response.connectionReused()) - .setConnectionId(response.connectionID()); - - responseObject->setFromDiskCache(response.wasCached()); - if (response.resourceLoadTiming()) - responseObject->setTiming(buildObjectForTiming(*response.resourceLoadTiming(), loader)); - - return responseObject; -} - -static PassRefPtr<Inspector::TypeBuilder::Network::CachedResource> buildObjectForCachedResource(CachedResource* cachedResource, DocumentLoader* loader) -{ - RefPtr<Inspector::TypeBuilder::Network::CachedResource> resourceObject = Inspector::TypeBuilder::Network::CachedResource::create() - .setUrl(cachedResource->url()) - .setType(InspectorPageAgent::cachedResourceTypeJson(*cachedResource)) - .setBodySize(cachedResource->encodedSize()); - - RefPtr<Inspector::TypeBuilder::Network::Response> resourceResponse = buildObjectForResourceResponse(cachedResource->response(), loader); - if (resourceResponse) - resourceObject->setResponse(resourceResponse); - - String sourceMappingURL = InspectorPageAgent::sourceMapURLForResource(cachedResource); - if (!sourceMappingURL.isEmpty()) - resourceObject->setSourceMapURL(sourceMappingURL); - - return resourceObject; -} - -InspectorResourceAgent::~InspectorResourceAgent() -{ - if (m_enabled) { - ErrorString error; - disable(&error); - } - ASSERT(!m_instrumentingAgents->inspectorResourceAgent()); -} - -void InspectorResourceAgent::willSendRequest(unsigned long identifier, DocumentLoader* loader, ResourceRequest& request, const ResourceResponse& redirectResponse) -{ - String requestId = IdentifiersFactory::requestId(identifier); - m_resourcesData->resourceCreated(requestId, m_pageAgent->loaderId(loader)); - - CachedResource* cachedResource = loader ? InspectorPageAgent::cachedResource(loader->frame(), request.url()) : nullptr; - InspectorPageAgent::ResourceType type = cachedResource ? InspectorPageAgent::cachedResourceType(*cachedResource) : m_resourcesData->resourceType(requestId); - if (type == InspectorPageAgent::OtherResource) { - if (m_loadingXHRSynchronously) - type = InspectorPageAgent::XHRResource; - else if (equalIgnoringFragmentIdentifier(request.url(), loader->frameLoader()->icon().url())) - type = InspectorPageAgent::ImageResource; - else if (equalIgnoringFragmentIdentifier(request.url(), loader->url()) && !loader->isCommitted()) - type = InspectorPageAgent::DocumentResource; - } - - m_resourcesData->setResourceType(requestId, type); - - if (m_extraRequestHeaders) { - InspectorObject::const_iterator end = m_extraRequestHeaders->end(); - for (InspectorObject::const_iterator it = m_extraRequestHeaders->begin(); it != end; ++it) { - String value; - if (it->value->asString(&value)) - request.setHTTPHeaderField(it->key, value); - } - } - - request.setReportLoadTiming(true); - request.setReportRawHeaders(true); - - if (m_cacheDisabled) { - request.setHTTPHeaderField("Pragma", "no-cache"); - request.setCachePolicy(ReloadIgnoringCacheData); - request.setHTTPHeaderField("Cache-Control", "no-cache"); - } - - Inspector::TypeBuilder::Page::ResourceType::Enum resourceType = InspectorPageAgent::resourceTypeJson(type); - - RefPtr<Inspector::TypeBuilder::Network::Initiator> initiatorObject = buildInitiatorObject(loader->frame() ? loader->frame()->document() : nullptr); - m_frontendDispatcher->requestWillBeSent(requestId, m_pageAgent->frameId(loader->frame()), m_pageAgent->loaderId(loader), loader->url().string(), buildObjectForResourceRequest(request), currentTime(), initiatorObject, buildObjectForResourceResponse(redirectResponse, loader), type != InspectorPageAgent::OtherResource ? &resourceType : nullptr); -} - -void InspectorResourceAgent::markResourceAsCached(unsigned long identifier) -{ - m_frontendDispatcher->requestServedFromCache(IdentifiersFactory::requestId(identifier)); -} - -void InspectorResourceAgent::didReceiveResponse(unsigned long identifier, DocumentLoader* loader, const ResourceResponse& response, ResourceLoader* resourceLoader) -{ - String requestId = IdentifiersFactory::requestId(identifier); - RefPtr<Inspector::TypeBuilder::Network::Response> resourceResponse = buildObjectForResourceResponse(response, loader); - - bool isNotModified = response.httpStatusCode() == 304; - - CachedResource* cachedResource = nullptr; - if (resourceLoader && resourceLoader->isSubresourceLoader() && !isNotModified) - cachedResource = static_cast<SubresourceLoader*>(resourceLoader)->cachedResource(); - if (!cachedResource) - cachedResource = InspectorPageAgent::cachedResource(loader->frame(), response.url()); - - if (cachedResource) { - // Use mime type from cached resource in case the one in response is empty. - if (resourceResponse && response.mimeType().isEmpty()) - resourceResponse->setString(Inspector::TypeBuilder::Network::Response::MimeType, cachedResource->response().mimeType()); - m_resourcesData->addCachedResource(requestId, cachedResource); - } - - InspectorPageAgent::ResourceType type = m_resourcesData->resourceType(requestId); - InspectorPageAgent::ResourceType newType = cachedResource ? InspectorPageAgent::cachedResourceType(*cachedResource) : type; - - // FIXME: XHRResource is returned for CachedResource::RawResource, it should be OtherResource unless it truly is an XHR. - // RawResource is used for loading worker scripts, and those should stay as ScriptResource and not change to XHRResource. - if (type != newType && newType != InspectorPageAgent::XHRResource && newType != InspectorPageAgent::OtherResource) - type = newType; - - m_resourcesData->responseReceived(requestId, m_pageAgent->frameId(loader->frame()), response); - m_resourcesData->setResourceType(requestId, type); - - m_frontendDispatcher->responseReceived(requestId, m_pageAgent->frameId(loader->frame()), m_pageAgent->loaderId(loader), currentTime(), InspectorPageAgent::resourceTypeJson(type), resourceResponse); - - // If we revalidated the resource and got Not modified, send content length following didReceiveResponse - // as there will be no calls to didReceiveData from the network stack. - if (isNotModified && cachedResource && cachedResource->encodedSize()) - didReceiveData(identifier, nullptr, cachedResource->encodedSize(), 0); -} - -static bool isErrorStatusCode(int statusCode) -{ - return statusCode >= 400; -} - -void InspectorResourceAgent::didReceiveData(unsigned long identifier, const char* data, int dataLength, int encodedDataLength) -{ - String requestId = IdentifiersFactory::requestId(identifier); - - if (data) { - NetworkResourcesData::ResourceData const* resourceData = m_resourcesData->data(requestId); - if (resourceData && !m_loadingXHRSynchronously && (!resourceData->cachedResource() || resourceData->cachedResource()->dataBufferingPolicy() == DoNotBufferData || isErrorStatusCode(resourceData->httpStatusCode()))) - m_resourcesData->maybeAddResourceData(requestId, data, dataLength); - } - - m_frontendDispatcher->dataReceived(requestId, currentTime(), dataLength, encodedDataLength); -} - -void InspectorResourceAgent::didFinishLoading(unsigned long identifier, DocumentLoader* loader, double finishTime) -{ - String requestId = IdentifiersFactory::requestId(identifier); - if (m_resourcesData->resourceType(requestId) == InspectorPageAgent::DocumentResource) { - RefPtr<ResourceBuffer> buffer = loader->frameLoader()->documentLoader()->mainResourceData(); - m_resourcesData->addResourceSharedBuffer(requestId, buffer ? buffer->sharedBuffer() : nullptr, loader->frame()->document()->inputEncoding()); - } - - m_resourcesData->maybeDecodeDataToContent(requestId); - - // FIXME: The finishTime that is passed in is from the NetworkProcess and is more accurate. - // However, all other times passed to the Inspector are generated from the web process. Mixing - // times from different processes can cause the finish time to be earlier than the response - // received time due to inter-process communication lag. - finishTime = currentTime(); - - String sourceMappingURL; - NetworkResourcesData::ResourceData const* resourceData = m_resourcesData->data(requestId); - if (resourceData && resourceData->cachedResource()) - sourceMappingURL = InspectorPageAgent::sourceMapURLForResource(resourceData->cachedResource()); - - m_frontendDispatcher->loadingFinished(requestId, finishTime, !sourceMappingURL.isEmpty() ? &sourceMappingURL : nullptr); -} - -void InspectorResourceAgent::didFailLoading(unsigned long identifier, DocumentLoader* loader, const ResourceError& error) -{ - String requestId = IdentifiersFactory::requestId(identifier); - - if (m_resourcesData->resourceType(requestId) == InspectorPageAgent::DocumentResource) { - Frame* frame = loader ? loader->frame() : nullptr; - if (frame && frame->loader().documentLoader() && frame->document()) { - RefPtr<ResourceBuffer> buffer = frame->loader().documentLoader()->mainResourceData(); - m_resourcesData->addResourceSharedBuffer(requestId, buffer ? buffer->sharedBuffer() : nullptr, frame->document()->inputEncoding()); - } - } - - bool canceled = error.isCancellation(); - m_frontendDispatcher->loadingFailed(requestId, currentTime(), error.localizedDescription(), canceled ? &canceled : nullptr); -} - -void InspectorResourceAgent::didLoadResourceFromMemoryCache(DocumentLoader* loader, CachedResource* resource) -{ - String loaderId = m_pageAgent->loaderId(loader); - String frameId = m_pageAgent->frameId(loader->frame()); - unsigned long identifier = loader->frame()->page()->progress().createUniqueIdentifier(); - String requestId = IdentifiersFactory::requestId(identifier); - m_resourcesData->resourceCreated(requestId, loaderId); - m_resourcesData->addCachedResource(requestId, resource); - if (resource->type() == CachedResource::RawResource) { - CachedRawResource* rawResource = static_cast<CachedRawResource*>(resource); - String rawRequestId = IdentifiersFactory::requestId(rawResource->identifier()); - m_resourcesData->reuseXHRReplayData(requestId, rawRequestId); - } - - RefPtr<Inspector::TypeBuilder::Network::Initiator> initiatorObject = buildInitiatorObject(loader->frame() ? loader->frame()->document() : nullptr); - - m_frontendDispatcher->requestServedFromMemoryCache(requestId, frameId, loaderId, loader->url().string(), currentTime(), initiatorObject, buildObjectForCachedResource(resource, loader)); -} - -void InspectorResourceAgent::setInitialScriptContent(unsigned long identifier, const String& sourceString) -{ - m_resourcesData->setResourceContent(IdentifiersFactory::requestId(identifier), sourceString); -} - -void InspectorResourceAgent::didReceiveScriptResponse(unsigned long identifier) -{ - m_resourcesData->setResourceType(IdentifiersFactory::requestId(identifier), InspectorPageAgent::ScriptResource); -} - -void InspectorResourceAgent::documentThreadableLoaderStartedLoadingForClient(unsigned long identifier, ThreadableLoaderClient* client) -{ - if (!client) - return; - - PendingXHRReplayDataMap::iterator it = m_pendingXHRReplayData.find(client); - if (it == m_pendingXHRReplayData.end()) - return; - - XHRReplayData* xhrReplayData = it->value.get(); - String requestId = IdentifiersFactory::requestId(identifier); - m_resourcesData->setXHRReplayData(requestId, xhrReplayData); -} - -void InspectorResourceAgent::willLoadXHR(ThreadableLoaderClient* client, const String& method, const URL& url, bool async, PassRefPtr<FormData> formData, const HTTPHeaderMap& headers, bool includeCredentials) -{ - RefPtr<XHRReplayData> xhrReplayData = XHRReplayData::create(method, url, async, formData, includeCredentials); - HTTPHeaderMap::const_iterator end = headers.end(); - for (HTTPHeaderMap::const_iterator it = headers.begin(); it!= end; ++it) - xhrReplayData->addHeader(it->key, it->value); - m_pendingXHRReplayData.set(client, xhrReplayData); -} - -void InspectorResourceAgent::didFailXHRLoading(ThreadableLoaderClient* client) -{ - m_pendingXHRReplayData.remove(client); -} - -void InspectorResourceAgent::didFinishXHRLoading(ThreadableLoaderClient* client, unsigned long identifier, const String& sourceString) -{ - // For Asynchronous XHRs, the inspector can grab the data directly off of the CachedResource. For sync XHRs, we need to - // provide the data here, since no CachedResource was involved. - if (m_loadingXHRSynchronously) - m_resourcesData->setResourceContent(IdentifiersFactory::requestId(identifier), sourceString); - m_pendingXHRReplayData.remove(client); -} - -void InspectorResourceAgent::didReceiveXHRResponse(unsigned long identifier) -{ - m_resourcesData->setResourceType(IdentifiersFactory::requestId(identifier), InspectorPageAgent::XHRResource); -} - -void InspectorResourceAgent::willLoadXHRSynchronously() -{ - m_loadingXHRSynchronously = true; -} - -void InspectorResourceAgent::didLoadXHRSynchronously() -{ - m_loadingXHRSynchronously = false; -} - -void InspectorResourceAgent::willDestroyCachedResource(CachedResource* cachedResource) -{ - Vector<String> requestIds = m_resourcesData->removeCachedResource(cachedResource); - if (!requestIds.size()) - return; - - String content; - bool base64Encoded; - if (!InspectorPageAgent::cachedResourceContent(cachedResource, &content, &base64Encoded)) - return; - Vector<String>::iterator end = requestIds.end(); - for (Vector<String>::iterator it = requestIds.begin(); it != end; ++it) - m_resourcesData->setResourceContent(*it, content, base64Encoded); -} - -void InspectorResourceAgent::willRecalculateStyle() -{ - m_isRecalculatingStyle = true; -} - -void InspectorResourceAgent::didRecalculateStyle() -{ - m_isRecalculatingStyle = false; - m_styleRecalculationInitiator = nullptr; -} - -void InspectorResourceAgent::didScheduleStyleRecalculation(Document* document) -{ - if (!m_styleRecalculationInitiator) - m_styleRecalculationInitiator = buildInitiatorObject(document); -} - -PassRefPtr<Inspector::TypeBuilder::Network::Initiator> InspectorResourceAgent::buildInitiatorObject(Document* document) -{ - RefPtr<ScriptCallStack> stackTrace = createScriptCallStack(ScriptCallStack::maxCallStackSizeToCapture, true); - if (stackTrace && stackTrace->size() > 0) { - RefPtr<Inspector::TypeBuilder::Network::Initiator> initiatorObject = Inspector::TypeBuilder::Network::Initiator::create() - .setType(Inspector::TypeBuilder::Network::Initiator::Type::Script); - initiatorObject->setStackTrace(stackTrace->buildInspectorArray()); - return initiatorObject; - } - - if (document && document->scriptableDocumentParser()) { - RefPtr<Inspector::TypeBuilder::Network::Initiator> initiatorObject = Inspector::TypeBuilder::Network::Initiator::create() - .setType(Inspector::TypeBuilder::Network::Initiator::Type::Parser); - initiatorObject->setUrl(document->url().string()); - initiatorObject->setLineNumber(document->scriptableDocumentParser()->textPosition().m_line.oneBasedInt()); - return initiatorObject; - } - - if (m_isRecalculatingStyle && m_styleRecalculationInitiator) - return m_styleRecalculationInitiator; - - return Inspector::TypeBuilder::Network::Initiator::create() - .setType(Inspector::TypeBuilder::Network::Initiator::Type::Other) - .release(); -} - -#if ENABLE(WEB_SOCKETS) - -void InspectorResourceAgent::didCreateWebSocket(unsigned long identifier, const URL& requestURL) -{ - m_frontendDispatcher->webSocketCreated(IdentifiersFactory::requestId(identifier), requestURL.string()); -} - -void InspectorResourceAgent::willSendWebSocketHandshakeRequest(unsigned long identifier, const ResourceRequest& request) -{ - RefPtr<Inspector::TypeBuilder::Network::WebSocketRequest> requestObject = Inspector::TypeBuilder::Network::WebSocketRequest::create() - .setHeaders(buildObjectForHeaders(request.httpHeaderFields())); - m_frontendDispatcher->webSocketWillSendHandshakeRequest(IdentifiersFactory::requestId(identifier), currentTime(), requestObject); -} - -void InspectorResourceAgent::didReceiveWebSocketHandshakeResponse(unsigned long identifier, const ResourceResponse& response) -{ - RefPtr<Inspector::TypeBuilder::Network::WebSocketResponse> responseObject = Inspector::TypeBuilder::Network::WebSocketResponse::create() - .setStatus(response.httpStatusCode()) - .setStatusText(response.httpStatusText()) - .setHeaders(buildObjectForHeaders(response.httpHeaderFields())); - m_frontendDispatcher->webSocketHandshakeResponseReceived(IdentifiersFactory::requestId(identifier), currentTime(), responseObject); -} - -void InspectorResourceAgent::didCloseWebSocket(unsigned long identifier) -{ - m_frontendDispatcher->webSocketClosed(IdentifiersFactory::requestId(identifier), currentTime()); -} - -void InspectorResourceAgent::didReceiveWebSocketFrame(unsigned long identifier, const WebSocketFrame& frame) -{ - RefPtr<Inspector::TypeBuilder::Network::WebSocketFrame> frameObject = Inspector::TypeBuilder::Network::WebSocketFrame::create() - .setOpcode(frame.opCode) - .setMask(frame.masked) - .setPayloadData(String(frame.payload, frame.payloadLength)); - m_frontendDispatcher->webSocketFrameReceived(IdentifiersFactory::requestId(identifier), currentTime(), frameObject); -} - -void InspectorResourceAgent::didSendWebSocketFrame(unsigned long identifier, const WebSocketFrame& frame) -{ - RefPtr<Inspector::TypeBuilder::Network::WebSocketFrame> frameObject = Inspector::TypeBuilder::Network::WebSocketFrame::create() - .setOpcode(frame.opCode) - .setMask(frame.masked) - .setPayloadData(String(frame.payload, frame.payloadLength)); - m_frontendDispatcher->webSocketFrameSent(IdentifiersFactory::requestId(identifier), currentTime(), frameObject); -} - -void InspectorResourceAgent::didReceiveWebSocketFrameError(unsigned long identifier, const String& errorMessage) -{ - m_frontendDispatcher->webSocketFrameError(IdentifiersFactory::requestId(identifier), currentTime(), errorMessage); -} - -#endif // ENABLE(WEB_SOCKETS) - -// called from Internals for layout test purposes. -void InspectorResourceAgent::setResourcesDataSizeLimitsFromInternals(int maximumResourcesContentSize, int maximumSingleResourceContentSize) -{ - m_resourcesData->setResourcesDataSizeLimits(maximumResourcesContentSize, maximumSingleResourceContentSize); -} - -void InspectorResourceAgent::enable(ErrorString*) -{ - enable(); -} - -void InspectorResourceAgent::enable() -{ - if (!m_frontendDispatcher) - return; - m_enabled = true; - m_instrumentingAgents->setInspectorResourceAgent(this); -} - -void InspectorResourceAgent::disable(ErrorString*) -{ - m_enabled = false; - m_instrumentingAgents->setInspectorResourceAgent(nullptr); - m_resourcesData->clear(); - m_extraRequestHeaders.clear(); -} - -void InspectorResourceAgent::setExtraHTTPHeaders(ErrorString*, const RefPtr<InspectorObject>& headers) -{ - m_extraRequestHeaders = headers; -} - -void InspectorResourceAgent::getResponseBody(ErrorString* errorString, const String& requestId, String* content, bool* base64Encoded) -{ - NetworkResourcesData::ResourceData const* resourceData = m_resourcesData->data(requestId); - if (!resourceData) { - *errorString = "No resource with given identifier found"; - return; - } - - if (resourceData->hasContent()) { - *base64Encoded = resourceData->base64Encoded(); - *content = resourceData->content(); - return; - } - - if (resourceData->isContentEvicted()) { - *errorString = "Request content was evicted from inspector cache"; - return; - } - - if (resourceData->buffer() && !resourceData->textEncodingName().isNull()) { - *base64Encoded = false; - if (InspectorPageAgent::sharedBufferContent(resourceData->buffer(), resourceData->textEncodingName(), *base64Encoded, content)) - return; - } - - if (resourceData->cachedResource()) { - if (InspectorPageAgent::cachedResourceContent(resourceData->cachedResource(), content, base64Encoded)) - return; - } - - *errorString = "No data found for resource with given identifier"; -} - -void InspectorResourceAgent::replayXHR(ErrorString*, const String& requestId) -{ - RefPtr<XMLHttpRequest> xhr = XMLHttpRequest::create(*m_pageAgent->mainFrame()->document()); - String actualRequestId = requestId; - - XHRReplayData* xhrReplayData = m_resourcesData->xhrReplayData(requestId); - if (!xhrReplayData) - return; - - ResourceRequest request(xhrReplayData->url()); -#if ENABLE(CACHE_PARTITIONING) - request.setCachePartition(m_pageAgent->mainFrame()->document()->topOrigin()->cachePartition()); -#endif - CachedResource* cachedResource = memoryCache()->resourceForRequest(request); - if (cachedResource) - memoryCache()->remove(cachedResource); - - xhr->open(xhrReplayData->method(), xhrReplayData->url(), xhrReplayData->async(), IGNORE_EXCEPTION); - HTTPHeaderMap::const_iterator end = xhrReplayData->headers().end(); - for (HTTPHeaderMap::const_iterator it = xhrReplayData->headers().begin(); it!= end; ++it) - xhr->setRequestHeader(it->key, it->value, IGNORE_EXCEPTION); - xhr->sendFromInspector(xhrReplayData->formData(), IGNORE_EXCEPTION); -} - -void InspectorResourceAgent::canClearBrowserCache(ErrorString*, bool* result) -{ - *result = m_client->canClearBrowserCache(); -} - -void InspectorResourceAgent::clearBrowserCache(ErrorString*) -{ - m_client->clearBrowserCache(); -} - -void InspectorResourceAgent::canClearBrowserCookies(ErrorString*, bool* result) -{ - *result = m_client->canClearBrowserCookies(); -} - -void InspectorResourceAgent::clearBrowserCookies(ErrorString*) -{ - m_client->clearBrowserCookies(); -} - -void InspectorResourceAgent::setCacheDisabled(ErrorString*, bool cacheDisabled) -{ - m_cacheDisabled = cacheDisabled; - if (cacheDisabled) - memoryCache()->evictResources(); -} - -void InspectorResourceAgent::mainFrameNavigated(DocumentLoader* loader) -{ - if (m_cacheDisabled) - memoryCache()->evictResources(); - - m_resourcesData->clear(m_pageAgent->loaderId(loader)); -} - -InspectorResourceAgent::InspectorResourceAgent(InstrumentingAgents* instrumentingAgents, InspectorPageAgent* pageAgent, InspectorClient* client) - : InspectorAgentBase(ASCIILiteral("Network"), instrumentingAgents) - , m_pageAgent(pageAgent) - , m_client(client) - , m_resourcesData(adoptPtr(new NetworkResourcesData())) - , m_enabled(false) - , m_cacheDisabled(false) - , m_loadingXHRSynchronously(false) - , m_isRecalculatingStyle(false) -{ -} - -} // namespace WebCore - -#endif // ENABLE(INSPECTOR) |