| Index: Source/core/inspector/InspectorResourceAgent.cpp
|
| diff --git a/Source/core/inspector/InspectorResourceAgent.cpp b/Source/core/inspector/InspectorResourceAgent.cpp
|
| index fad8d679ef7917c242a1f7e2e8dd53a9cfe4a852..acc15c3627afdf804bde97fe43f43f49632513e7 100644
|
| --- a/Source/core/inspector/InspectorResourceAgent.cpp
|
| +++ b/Source/core/inspector/InspectorResourceAgent.cpp
|
| @@ -41,6 +41,10 @@
|
| #include "core/fetch/MemoryCache.h"
|
| #include "core/fetch/Resource.h"
|
| #include "core/fetch/ResourceLoader.h"
|
| +#include "core/fetch/TextResourceDecoder.h"
|
| +#include "core/fileapi/Blob.h"
|
| +#include "core/fileapi/FileReaderLoader.h"
|
| +#include "core/fileapi/FileReaderLoaderClient.h"
|
| #include "core/inspector/IdentifiersFactory.h"
|
| #include "core/inspector/InspectorClient.h"
|
| #include "core/inspector/InspectorOverlay.h"
|
| @@ -70,6 +74,7 @@
|
| #include "wtf/RefPtr.h"
|
|
|
| typedef WebCore::InspectorBackendDispatcher::NetworkCommandHandler::LoadResourceForFrontendCallback LoadResourceForFrontendCallback;
|
| +typedef WebCore::InspectorBackendDispatcher::NetworkCommandHandler::GetResponseBodyCallback GetResponseBodyCallback;
|
|
|
| namespace WebCore {
|
|
|
| @@ -170,6 +175,67 @@ private:
|
| HTTPHeaderMap m_responseHeaders;
|
| };
|
|
|
| +
|
| +class InspectorResourceFileReaderLoaderClient : public FileReaderLoaderClient {
|
| + WTF_MAKE_NONCOPYABLE(InspectorResourceFileReaderLoaderClient);
|
| +public:
|
| + InspectorResourceFileReaderLoaderClient(PassRefPtr<GetResponseBodyCallback> callback)
|
| + : m_callback(callback) { }
|
| +
|
| + void didStartLoading()
|
| + {
|
| + ASSERT(m_loader);
|
| + }
|
| +
|
| + void didReceiveData()
|
| + {
|
| + ASSERT(m_loader);
|
| + }
|
| +
|
| + void didFinishLoading()
|
| + {
|
| + ASSERT(m_loader);
|
| + if (!m_decoder) {
|
| + m_callback->sendSuccess(String(""), false);
|
| + } else {
|
| + RefPtr<ArrayBuffer> buffer = m_loader->arrayBufferResult();
|
| + String content = m_decoder->decode(static_cast<const char*>(buffer->data()), buffer->byteLength());
|
| + m_callback->sendSuccess(content + m_decoder->flush(), false);
|
| + }
|
| + dispose();
|
| + }
|
| +
|
| + void didFail(FileError::ErrorCode errorCode)
|
| + {
|
| + m_callback->sendFailure("Failed to load Blob: error code = " + String::number(errorCode)); // FIXME: Generate human-friendly reason message.
|
| + dispose();
|
| + }
|
| +
|
| + void setLoader(PassOwnPtr<FileReaderLoader> loader)
|
| + {
|
| + m_loader = loader;
|
| + }
|
| +
|
| + void start(Document* document, PassRefPtr<Blob> prpBlob, const String& textEncodingName)
|
| + {
|
| + ASSERT(m_loader);
|
| + RefPtr<Blob> blob = prpBlob;
|
| + m_decoder = InspectorPageAgent::createXHRTextDecoder(blob->type(), textEncodingName);
|
| + m_loader->start(document, *blob);
|
| + }
|
| +
|
| +private:
|
| + void dispose()
|
| + {
|
| + m_loader.clear();
|
| + delete this;
|
| + }
|
| +
|
| + OwnPtr<FileReaderLoader> m_loader;
|
| + RefPtr<GetResponseBodyCallback> m_callback;
|
| + RefPtr<TextResourceDecoder> m_decoder;
|
| +};
|
| +
|
| KURL urlWithoutFragment(const KURL& url)
|
| {
|
| KURL result = url;
|
| @@ -482,11 +548,17 @@ void InspectorResourceAgent::willDestroyResource(Resource* cachedResource)
|
|
|
| String content;
|
| bool base64Encoded;
|
| - if (!InspectorPageAgent::cachedResourceContent(cachedResource, &content, &base64Encoded))
|
| + RefPtr<Blob> blob;
|
| + String textEncodingName;
|
| + if (!InspectorPageAgent::cachedResourceContentOrBlob(cachedResource, &content, &base64Encoded, &blob, &textEncodingName))
|
| return;
|
| Vector<String>::iterator end = requestIds.end();
|
| - for (Vector<String>::iterator it = requestIds.begin(); it != end; ++it)
|
| - m_resourcesData->setResourceContent(*it, content, base64Encoded);
|
| + for (Vector<String>::iterator it = requestIds.begin(); it != end; ++it) {
|
| + if (!blob)
|
| + m_resourcesData->setResourceContent(*it, content, base64Encoded);
|
| + else
|
| + m_resourcesData->setResourceBlob(*it, blob, textEncodingName);
|
| + }
|
| }
|
|
|
| void InspectorResourceAgent::applyUserAgentOverride(String* userAgent)
|
| @@ -629,8 +701,18 @@ void InspectorResourceAgent::setExtraHTTPHeaders(ErrorString*, const RefPtr<JSON
|
| m_state->setObject(ResourceAgentState::extraRequestHeaders, headers);
|
| }
|
|
|
| -void InspectorResourceAgent::getResponseBody(ErrorString* errorString, const String& requestId, String* content, bool* base64Encoded)
|
| +void InspectorResourceAgent::getResponseBody(ErrorString* errorString, const String& requestId, PassRefPtr<GetResponseBodyCallback> prpCallback)
|
| {
|
| + RefPtr<GetResponseBodyCallback> callback = prpCallback;
|
| + if (!callback->isActive())
|
| + return;
|
| +
|
| + Document* document = m_pageAgent->mainFrame()->document();
|
| + if (!document) {
|
| + *errorString = "No Document instance for the specified frame";
|
| + return;
|
| + }
|
| +
|
| NetworkResourcesData::ResourceData const* resourceData = m_resourcesData->data(requestId);
|
| if (!resourceData) {
|
| *errorString = "No resource with given identifier found";
|
| @@ -638,8 +720,15 @@ void InspectorResourceAgent::getResponseBody(ErrorString* errorString, const Str
|
| }
|
|
|
| if (resourceData->hasContent()) {
|
| - *base64Encoded = resourceData->base64Encoded();
|
| - *content = resourceData->content();
|
| + callback->sendSuccess(resourceData->content(), resourceData->base64Encoded());
|
| + return;
|
| + }
|
| +
|
| + if (resourceData->hasBlob()) {
|
| + InspectorResourceFileReaderLoaderClient* client = new InspectorResourceFileReaderLoaderClient(callback);
|
| + OwnPtr<FileReaderLoader> loader = adoptPtr(new FileReaderLoader(FileReaderLoader::ReadAsArrayBuffer, client));
|
| + client->setLoader(loader.release());
|
| + client->start(document, resourceData->blob(), resourceData->blobTextEncodingName());
|
| return;
|
| }
|
|
|
| @@ -649,14 +738,30 @@ void InspectorResourceAgent::getResponseBody(ErrorString* errorString, const Str
|
| }
|
|
|
| if (resourceData->buffer() && !resourceData->textEncodingName().isNull()) {
|
| - *base64Encoded = false;
|
| - if (InspectorPageAgent::sharedBufferContent(resourceData->buffer(), resourceData->textEncodingName(), *base64Encoded, content))
|
| + String content;
|
| + bool base64Encoded = false;
|
| + if (InspectorPageAgent::sharedBufferContent(resourceData->buffer(), resourceData->textEncodingName(), base64Encoded, &content)) {
|
| + callback->sendSuccess(content, base64Encoded);
|
| return;
|
| + }
|
| }
|
|
|
| if (resourceData->cachedResource()) {
|
| - if (InspectorPageAgent::cachedResourceContent(resourceData->cachedResource(), content, base64Encoded))
|
| + String content;
|
| + bool base64Encoded;
|
| + RefPtr<Blob> blob;
|
| + String textEncodingName;
|
| + if (InspectorPageAgent::cachedResourceContentOrBlob(resourceData->cachedResource(), &content, &base64Encoded, &blob, &textEncodingName)) {
|
| + if (blob) {
|
| + InspectorResourceFileReaderLoaderClient* client = new InspectorResourceFileReaderLoaderClient(callback);
|
| + OwnPtr<FileReaderLoader> loader = adoptPtr(new FileReaderLoader(FileReaderLoader::ReadAsArrayBuffer, client));
|
| + client->setLoader(loader.release());
|
| + client->start(document, blob.release(), textEncodingName);
|
| + } else {
|
| + callback->sendSuccess(content, base64Encoded);
|
| + }
|
| return;
|
| + }
|
| }
|
|
|
| *errorString = "No data found for resource with given identifier";
|
|
|