diff options
author | Steve Block <steveblock@google.com> | 2011-05-25 19:08:45 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2011-06-08 13:51:31 +0100 |
commit | 2bde8e466a4451c7319e3a072d118917957d6554 (patch) | |
tree | 28f4a1b869a513e565c7760d0e6a06e7cf1fe95a /Source/WebCore/inspector/InspectorResourceAgent.cpp | |
parent | 6939c99b71d9372d14a0c74a772108052e8c48c8 (diff) | |
download | external_webkit-2bde8e466a4451c7319e3a072d118917957d6554.zip external_webkit-2bde8e466a4451c7319e3a072d118917957d6554.tar.gz external_webkit-2bde8e466a4451c7319e3a072d118917957d6554.tar.bz2 |
Merge WebKit at r82507: Initial merge by git
Change-Id: I60ce9d780725b58b45e54165733a8ffee23b683e
Diffstat (limited to 'Source/WebCore/inspector/InspectorResourceAgent.cpp')
-rw-r--r-- | Source/WebCore/inspector/InspectorResourceAgent.cpp | 241 |
1 files changed, 103 insertions, 138 deletions
diff --git a/Source/WebCore/inspector/InspectorResourceAgent.cpp b/Source/WebCore/inspector/InspectorResourceAgent.cpp index db41640..1e2c16d 100644 --- a/Source/WebCore/inspector/InspectorResourceAgent.cpp +++ b/Source/WebCore/inspector/InspectorResourceAgent.cpp @@ -62,9 +62,10 @@ #include "WebSocketHandshakeResponse.h" #include <wtf/CurrentTime.h> +#include <wtf/HexNumber.h> #include <wtf/ListHashSet.h> #include <wtf/RefPtr.h> -#include <wtf/text/StringBuffer.h> +#include <wtf/text/StringBuilder.h> namespace WebCore { @@ -90,10 +91,12 @@ void InspectorResourceAgent::restore() enable(); } -bool InspectorResourceAgent::resourceContent(Frame* frame, const KURL& url, String* result) +void InspectorResourceAgent::resourceContent(ErrorString* errorString, Frame* frame, const KURL& url, String* result) { - if (!frame) - return false; + if (!frame) { + *errorString = "No frame to get resource content for."; + return; + } String textEncodingName; RefPtr<SharedBuffer> buffer = InspectorResourceAgent::resourceData(frame, url, &textEncodingName); @@ -103,23 +106,22 @@ bool InspectorResourceAgent::resourceContent(Frame* frame, const KURL& url, Stri if (!encoding.isValid()) encoding = WindowsLatin1Encoding(); *result = encoding.decode(buffer->data(), buffer->size()); - return true; + return; } - - return false; + *errorString = "No resource with given URL found."; } -bool InspectorResourceAgent::resourceContentBase64(Frame* frame, const KURL& url, String* result) +void InspectorResourceAgent::resourceContentBase64(ErrorString* errorString, Frame* frame, const KURL& url, String* result) { String textEncodingName; RefPtr<SharedBuffer> data = InspectorResourceAgent::resourceData(frame, url, &textEncodingName); if (!data) { *result = String(); - return false; + *errorString = "No resource with given URL found."; + return; } *result = base64Encode(data->data(), data->size()); - return true; } PassRefPtr<SharedBuffer> InspectorResourceAgent::resourceData(Frame* frame, const KURL& url, String* textEncodingName) @@ -193,69 +195,41 @@ static PassRefPtr<InspectorObject> buildObjectForResourceRequest(const ResourceR { RefPtr<InspectorObject> requestObject = InspectorObject::create(); requestObject->setString("url", request.url().string()); - requestObject->setString("httpMethod", request.httpMethod()); - requestObject->setObject("httpHeaderFields", buildObjectForHeaders(request.httpHeaderFields())); + requestObject->setString("method", request.httpMethod()); + requestObject->setObject("headers", buildObjectForHeaders(request.httpHeaderFields())); if (request.httpBody() && !request.httpBody()->isEmpty()) - requestObject->setString("requestFormData", request.httpBody()->flattenToString()); + requestObject->setString("postData", request.httpBody()->flattenToString()); return requestObject; } static PassRefPtr<InspectorObject> buildObjectForResourceResponse(const ResourceResponse& response) { RefPtr<InspectorObject> responseObject = InspectorObject::create(); - if (response.isNull()) { - responseObject->setBoolean("isNull", true); + if (response.isNull()) return responseObject; - } - responseObject->setString("url", response.url().string()); + + responseObject->setNumber("status", response.resourceLoadInfo() ? response.resourceLoadInfo()->httpStatusCode : response.httpStatusCode()); + responseObject->setString("statusText", response.resourceLoadInfo() ? response.resourceLoadInfo()->httpStatusText : response.httpStatusText()); + responseObject->setObject("headers", buildObjectForHeaders(response.resourceLoadInfo() ? response.resourceLoadInfo()->responseHeaders : response.httpHeaderFields())); + responseObject->setString("mimeType", response.mimeType()); - responseObject->setNumber("expectedContentLength", response.expectedContentLength()); - responseObject->setString("textEncodingName", response.textEncodingName()); - responseObject->setString("suggestedFilename", response.suggestedFilename()); - responseObject->setNumber("httpStatusCode", response.httpStatusCode()); - responseObject->setString("httpStatusText", response.httpStatusText()); - responseObject->setObject("httpHeaderFields", buildObjectForHeaders(response.httpHeaderFields())); responseObject->setBoolean("connectionReused", response.connectionReused()); responseObject->setNumber("connectionID", response.connectionID()); - responseObject->setBoolean("wasCached", response.wasCached()); + responseObject->setBoolean("fromDiskCache", response.wasCached()); if (response.resourceLoadTiming()) responseObject->setObject("timing", buildObjectForTiming(*response.resourceLoadTiming())); - if (response.resourceLoadInfo()) { - RefPtr<InspectorObject> loadInfoObject = InspectorObject::create(); - loadInfoObject->setNumber("httpStatusCode", response.resourceLoadInfo()->httpStatusCode); - loadInfoObject->setString("httpStatusText", response.resourceLoadInfo()->httpStatusText); - loadInfoObject->setObject("requestHeaders", buildObjectForHeaders(response.resourceLoadInfo()->requestHeaders)); - loadInfoObject->setObject("responseHeaders", buildObjectForHeaders(response.resourceLoadInfo()->responseHeaders)); - responseObject->setObject("loadInfo", loadInfoObject); - } - return responseObject; -} -static unsigned long frameId(Frame* frame) -{ - return reinterpret_cast<uintptr_t>(frame); -} + if (response.resourceLoadInfo()) + responseObject->setObject("requestHeaders", buildObjectForHeaders(response.resourceLoadInfo()->requestHeaders)); -static PassRefPtr<InspectorObject> buildObjectForDocumentLoader(DocumentLoader* loader) -{ - RefPtr<InspectorObject> documentLoaderObject = InspectorObject::create(); - documentLoaderObject->setNumber("frameId", frameId(loader->frame())); - documentLoaderObject->setNumber("loaderId", reinterpret_cast<uintptr_t>(loader)); - documentLoaderObject->setString("url", loader->requestURL().string()); - return documentLoaderObject; + return responseObject; } -static PassRefPtr<InspectorObject> buildObjectForFrameResource(Frame* frame) +static String pointerAsId(void* pointer) { - FrameLoader* frameLoader = frame->loader(); - DocumentLoader* loader = frameLoader->documentLoader(); - - RefPtr<InspectorObject> resourceObject = InspectorObject::create(); - resourceObject->setString("url", loader->url().string()); - resourceObject->setObject("loader", buildObjectForDocumentLoader(loader)); - resourceObject->setObject("request", buildObjectForResourceRequest(loader->request())); - resourceObject->setObject("response", buildObjectForResourceResponse(loader->response())); - return resourceObject; + unsigned long long address = reinterpret_cast<uintptr_t>(pointer); + // We want 0 to be "", so that JavaScript checks for if (frameId) worked. + return String::format("%.0llX", address); } static String cachedResourceTypeString(const CachedResource& cachedResource) @@ -279,56 +253,22 @@ static String cachedResourceTypeString(const CachedResource& cachedResource) return "Other"; } -static PassRefPtr<InspectorObject> buildObjectForCachedResource(DocumentLoader* loader, const CachedResource& cachedResource) +static PassRefPtr<InspectorObject> buildObjectForCachedResource(const CachedResource& cachedResource) { RefPtr<InspectorObject> resourceObject = InspectorObject::create(); resourceObject->setString("url", cachedResource.url()); resourceObject->setString("type", cachedResourceTypeString(cachedResource)); - resourceObject->setNumber("encodedSize", cachedResource.encodedSize()); + resourceObject->setNumber("bodySize", cachedResource.encodedSize()); resourceObject->setObject("response", buildObjectForResourceResponse(cachedResource.response())); - resourceObject->setObject("loader", buildObjectForDocumentLoader(loader)); return resourceObject; } -static void populateObjectWithFrameResources(Frame* frame, PassRefPtr<InspectorObject> frameResources) -{ - frameResources->setObject("resource", buildObjectForFrameResource(frame)); - RefPtr<InspectorArray> subresources = InspectorArray::create(); - frameResources->setArray("subresources", subresources); - - const CachedResourceLoader::DocumentResourceMap& allResources = frame->document()->cachedResourceLoader()->allCachedResources(); - CachedResourceLoader::DocumentResourceMap::const_iterator end = allResources.end(); - for (CachedResourceLoader::DocumentResourceMap::const_iterator it = allResources.begin(); it != end; ++it) { - CachedResource* cachedResource = it->second.get(); - RefPtr<InspectorObject> cachedResourceObject = buildObjectForCachedResource(frame->loader()->documentLoader(), *cachedResource); - subresources->pushValue(cachedResourceObject); - } -} - InspectorResourceAgent::~InspectorResourceAgent() { ASSERT(!m_instrumentingAgents->inspectorResourceAgent()); } -void InspectorResourceAgent::identifierForInitialRequest(unsigned long identifier, const KURL& url, DocumentLoader* loader) -{ - RefPtr<InspectorObject> loaderObject = buildObjectForDocumentLoader(loader); - RefPtr<ScriptCallStack> callStack = createScriptCallStack(ScriptCallStack::maxCallStackSizeToCapture, true); - RefPtr<InspectorValue> callStackValue; - if (callStack) - callStackValue = callStack->buildInspectorObject(); - else - callStackValue = InspectorValue::null(); - m_frontend->identifierForInitialRequest(identifier, url.string(), loaderObject, callStackValue); -} - -void InspectorResourceAgent::setExtraHeaders(ErrorString*, PassRefPtr<InspectorObject> headers) -{ - m_state->setObject(ResourceAgentState::extraRequestHeaders, headers); -} - - -void InspectorResourceAgent::willSendRequest(unsigned long identifier, ResourceRequest& request, const ResourceResponse& redirectResponse) +void InspectorResourceAgent::willSendRequest(unsigned long identifier, DocumentLoader* loader, ResourceRequest& request, const ResourceResponse& redirectResponse) { RefPtr<InspectorObject> headers = m_state->getObject(ResourceAgentState::extraRequestHeaders); @@ -344,12 +284,18 @@ void InspectorResourceAgent::willSendRequest(unsigned long identifier, ResourceR request.setReportLoadTiming(true); request.setReportRawHeaders(true); - m_frontend->willSendRequest(identifier, currentTime(), buildObjectForResourceRequest(request), buildObjectForResourceResponse(redirectResponse)); + RefPtr<ScriptCallStack> callStack = createScriptCallStack(ScriptCallStack::maxCallStackSizeToCapture, true); + RefPtr<InspectorArray> callStackValue; + if (callStack) + callStackValue = callStack->buildInspectorArray(); + else + callStackValue = InspectorArray::create(); + m_frontend->requestWillBeSent(static_cast<int>(identifier), pointerAsId(loader->frame()), pointerAsId(loader), loader->url().string(), buildObjectForResourceRequest(request), buildObjectForResourceResponse(redirectResponse), currentTime(), callStackValue); } void InspectorResourceAgent::markResourceAsCached(unsigned long identifier) { - m_frontend->markResourceAsCached(identifier); + m_frontend->resourceMarkedAsCached(static_cast<int>(identifier)); } void InspectorResourceAgent::didReceiveResponse(unsigned long identifier, DocumentLoader* loader, const ResourceResponse& response) @@ -372,16 +318,16 @@ void InspectorResourceAgent::didReceiveResponse(unsigned long identifier, Docume else if (equalIgnoringFragmentIdentifier(response.url(), loader->url()) && type == "Other") type = "Document"; } - m_frontend->didReceiveResponse(identifier, currentTime(), type, resourceResponse); + m_frontend->responseReceived(static_cast<int>(identifier), currentTime(), type, resourceResponse); // If we revalidated the resource and got Not modified, send content length following didReceiveResponse // as there will be no calls to didReceiveContentLength from the network stack. if (cachedResourceSize && response.httpStatusCode() == 304) - didReceiveContentLength(identifier, cachedResourceSize); + didReceiveContentLength(identifier, cachedResourceSize, 0); } -void InspectorResourceAgent::didReceiveContentLength(unsigned long identifier, int lengthReceived) +void InspectorResourceAgent::didReceiveContentLength(unsigned long identifier, int dataLength, int lengthReceived) { - m_frontend->didReceiveContentLength(identifier, currentTime(), lengthReceived); + m_frontend->dataReceived(static_cast<int>(identifier), currentTime(), dataLength, lengthReceived); } void InspectorResourceAgent::didFinishLoading(unsigned long identifier, double finishTime) @@ -389,29 +335,29 @@ void InspectorResourceAgent::didFinishLoading(unsigned long identifier, double f if (!finishTime) finishTime = currentTime(); - m_frontend->didFinishLoading(identifier, finishTime); + m_frontend->loadingFinished(static_cast<int>(identifier), finishTime); } void InspectorResourceAgent::didFailLoading(unsigned long identifier, const ResourceError& error) { - m_frontend->didFailLoading(identifier, currentTime(), error.localizedDescription()); + m_frontend->loadingFailed(static_cast<int>(identifier), currentTime(), error.localizedDescription()); } void InspectorResourceAgent::didLoadResourceFromMemoryCache(DocumentLoader* loader, const CachedResource* resource) { - m_frontend->didLoadResourceFromMemoryCache(currentTime(), buildObjectForCachedResource(loader, *resource)); + m_frontend->resourceLoadedFromMemoryCache(pointerAsId(loader->frame()), pointerAsId(loader), loader->url().string(), currentTime(), buildObjectForCachedResource(*resource)); } void InspectorResourceAgent::setInitialContent(unsigned long identifier, const String& sourceString, const String& type) { - m_frontend->setInitialContent(identifier, sourceString, type); + m_frontend->initialContentSet(static_cast<int>(identifier), sourceString, type); } static PassRefPtr<InspectorObject> buildObjectForFrame(Frame* frame) { RefPtr<InspectorObject> frameObject = InspectorObject::create(); - frameObject->setNumber("id", frameId(frame)); - frameObject->setNumber("parentId", frameId(frame->tree()->parent())); + frameObject->setString("id", pointerAsId(frame)); + frameObject->setString("parentId", pointerAsId(frame->tree()->parent())); if (frame->ownerElement()) { String name = frame->ownerElement()->getAttribute(HTMLNames::nameAttr); if (name.isEmpty()) @@ -419,34 +365,48 @@ static PassRefPtr<InspectorObject> buildObjectForFrame(Frame* frame) frameObject->setString("name", name); } frameObject->setString("url", frame->document()->url().string()); + frameObject->setString("loaderId", pointerAsId(frame->loader()->documentLoader())); + return frameObject; } -static PassRefPtr<InspectorObject> buildObjectForFrameTree(Frame* frame, bool dumpResources) +static PassRefPtr<InspectorObject> buildObjectForFrameTree(Frame* frame) { + RefPtr<InspectorObject> result = InspectorObject::create(); RefPtr<InspectorObject> frameObject = buildObjectForFrame(frame); + result->setObject("frame", frameObject); + + RefPtr<InspectorArray> subresources = InspectorArray::create(); + result->setArray("resources", subresources); + const CachedResourceLoader::DocumentResourceMap& allResources = frame->document()->cachedResourceLoader()->allCachedResources(); + CachedResourceLoader::DocumentResourceMap::const_iterator end = allResources.end(); + for (CachedResourceLoader::DocumentResourceMap::const_iterator it = allResources.begin(); it != end; ++it) { + CachedResource* cachedResource = it->second.get(); + RefPtr<InspectorObject> resourceObject = InspectorObject::create(); + resourceObject->setString("url", cachedResource->url()); + resourceObject->setString("type", cachedResourceTypeString(*cachedResource)); + subresources->pushValue(resourceObject); + } - if (dumpResources) - populateObjectWithFrameResources(frame, frameObject); RefPtr<InspectorArray> childrenArray; for (Frame* child = frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) { if (!childrenArray) { childrenArray = InspectorArray::create(); - frameObject->setArray("children", childrenArray); + result->setArray("childFrames", childrenArray); } - childrenArray->pushObject(buildObjectForFrameTree(child, dumpResources)); + childrenArray->pushObject(buildObjectForFrameTree(child)); } - return frameObject; + return result; } void InspectorResourceAgent::didCommitLoad(DocumentLoader* loader) { - m_frontend->didCommitLoadForFrame(buildObjectForFrame(loader->frame()), buildObjectForDocumentLoader(loader)); + m_frontend->frameNavigated(buildObjectForFrame(loader->frame()), pointerAsId(loader)); } void InspectorResourceAgent::frameDetachedFromParent(Frame* frame) { - m_frontend->frameDetachedFromParent(frameId(frame)); + m_frontend->frameDetached(pointerAsId(frame)); } #if ENABLE(WEB_SOCKETS) @@ -456,63 +416,58 @@ void InspectorResourceAgent::frameDetachedFromParent(Frame* frame) static String createReadableStringFromBinary(const unsigned char* value, size_t length) { ASSERT(length > 0); - static const char hexDigits[17] = "0123456789ABCDEF"; - size_t bufferSize = length * 3 - 1; - StringBuffer buffer(bufferSize); - size_t index = 0; + StringBuilder builder; + builder.reserveCapacity(length * 3 - 1); for (size_t i = 0; i < length; ++i) { if (i > 0) - buffer[index++] = ':'; - buffer[index++] = hexDigits[value[i] >> 4]; - buffer[index++] = hexDigits[value[i] & 0xF]; + builder.append(':'); + appendByteAsHex(value[i], builder); } - ASSERT(index == bufferSize); - return String::adopt(buffer); + return builder.toString(); } void InspectorResourceAgent::didCreateWebSocket(unsigned long identifier, const KURL& requestURL) { - m_frontend->didCreateWebSocket(identifier, requestURL.string()); + m_frontend->webSocketCreated(static_cast<int>(identifier), requestURL.string()); } void InspectorResourceAgent::willSendWebSocketHandshakeRequest(unsigned long identifier, const WebSocketHandshakeRequest& request) { RefPtr<InspectorObject> requestObject = InspectorObject::create(); - requestObject->setObject("webSocketHeaderFields", buildObjectForHeaders(request.headerFields())); - requestObject->setString("webSocketRequestKey3", createReadableStringFromBinary(request.key3().value, sizeof(request.key3().value))); - m_frontend->willSendWebSocketHandshakeRequest(identifier, currentTime(), requestObject); + requestObject->setObject("headers", buildObjectForHeaders(request.headerFields())); + requestObject->setString("requestKey3", createReadableStringFromBinary(request.key3().value, sizeof(request.key3().value))); + m_frontend->webSocketWillSendHandshakeRequest(static_cast<int>(identifier), currentTime(), requestObject); } void InspectorResourceAgent::didReceiveWebSocketHandshakeResponse(unsigned long identifier, const WebSocketHandshakeResponse& response) { RefPtr<InspectorObject> responseObject = InspectorObject::create(); - responseObject->setNumber("statusCode", response.statusCode()); + responseObject->setNumber("status", response.statusCode()); responseObject->setString("statusText", response.statusText()); - responseObject->setObject("webSocketHeaderFields", buildObjectForHeaders(response.headerFields())); - responseObject->setString("webSocketChallengeResponse", createReadableStringFromBinary(response.challengeResponse().value, sizeof(response.challengeResponse().value))); - m_frontend->didReceiveWebSocketHandshakeResponse(identifier, currentTime(), responseObject); + responseObject->setObject("headers", buildObjectForHeaders(response.headerFields())); + responseObject->setString("challengeResponse", createReadableStringFromBinary(response.challengeResponse().value, sizeof(response.challengeResponse().value))); + m_frontend->webSocketHandshakeResponseReceived(static_cast<int>(identifier), currentTime(), responseObject); } void InspectorResourceAgent::didCloseWebSocket(unsigned long identifier) { - m_frontend->didCloseWebSocket(identifier, currentTime()); + m_frontend->webSocketClosed(static_cast<int>(identifier), currentTime()); } #endif // ENABLE(WEB_SOCKETS) -Frame* InspectorResourceAgent::frameForId(unsigned long frameId) +Frame* InspectorResourceAgent::frameForId(const String& frameId) { Frame* mainFrame = m_page->mainFrame(); for (Frame* frame = mainFrame; frame; frame = frame->tree()->traverseNext(mainFrame)) { - if (reinterpret_cast<uintptr_t>(frame) == frameId) + if (pointerAsId(frame) == frameId) return frame; } return 0; } -void InspectorResourceAgent::enable(ErrorString*, RefPtr<InspectorObject>* object) +void InspectorResourceAgent::enable(ErrorString*) { enable(); - *object = buildObjectForFrameTree(m_page->mainFrame(), true); } void InspectorResourceAgent::enable() @@ -529,17 +484,27 @@ void InspectorResourceAgent::disable(ErrorString*) m_instrumentingAgents->setInspectorResourceAgent(0); } -void InspectorResourceAgent::resourceContent(ErrorString*, unsigned long frameId, const String& url, bool base64Encode, bool* success, String* content) +void InspectorResourceAgent::getCachedResources(ErrorString*, RefPtr<InspectorObject>* object) +{ + *object = buildObjectForFrameTree(m_page->mainFrame()); +} + +void InspectorResourceAgent::getResourceContent(ErrorString* errorString, const String& frameId, const String& url, bool base64Encode, String* content) { Frame* frame = frameForId(frameId); if (!frame) { - *success = false; + *errorString = "No frame for given id found."; return; } if (base64Encode) - *success = InspectorResourceAgent::resourceContentBase64(frame, KURL(ParsedURLString, url), content); + InspectorResourceAgent::resourceContentBase64(errorString, frame, KURL(ParsedURLString, url), content); else - *success = InspectorResourceAgent::resourceContent(frame, KURL(ParsedURLString, url), content); + InspectorResourceAgent::resourceContent(errorString, frame, KURL(ParsedURLString, url), content); +} + +void InspectorResourceAgent::setExtraHeaders(ErrorString*, PassRefPtr<InspectorObject> headers) +{ + m_state->setObject(ResourceAgentState::extraRequestHeaders, headers); } InspectorResourceAgent::InspectorResourceAgent(InstrumentingAgents* instrumentingAgents, Page* page, InspectorState* state) |