| Index: Source/core/inspector/InspectorPageAgent.cpp
|
| diff --git a/Source/core/inspector/InspectorPageAgent.cpp b/Source/core/inspector/InspectorPageAgent.cpp
|
| index 3572507ada281c891f7fe37ee183e419d91500fd..4e85861640d23eeb25ebdc709156c0bb057ba174 100644
|
| --- a/Source/core/inspector/InspectorPageAgent.cpp
|
| +++ b/Source/core/inspector/InspectorPageAgent.cpp
|
| @@ -51,6 +51,7 @@
|
| #include "core/frame/LocalFrame.h"
|
| #include "core/frame/Settings.h"
|
| #include "core/html/HTMLFrameOwnerElement.h"
|
| +#include "core/html/VoidCallback.h"
|
| #include "core/html/imports/HTMLImport.h"
|
| #include "core/html/imports/HTMLImportLoader.h"
|
| #include "core/html/imports/HTMLImportsController.h"
|
| @@ -62,6 +63,7 @@
|
| #include "core/inspector/InspectorClient.h"
|
| #include "core/inspector/InspectorInstrumentation.h"
|
| #include "core/inspector/InspectorOverlay.h"
|
| +#include "core/inspector/InspectorResourceContentLoader.h"
|
| #include "core/inspector/InspectorState.h"
|
| #include "core/inspector/InstrumentingAgents.h"
|
| #include "core/loader/CookieJar.h"
|
| @@ -115,6 +117,32 @@ KURL urlWithoutFragment(const KURL& url)
|
|
|
| }
|
|
|
| +class InspectorPageAgent::GetResourceContentLoadListener FINAL : public VoidCallback {
|
| +public:
|
| + GetResourceContentLoadListener(InspectorPageAgent*, const String& frameId, const String& url, PassRefPtr<GetResourceContentCallback>);
|
| + virtual void handleEvent() OVERRIDE;
|
| +private:
|
| + InspectorPageAgent* m_pageAgent;
|
| + String m_frameId;
|
| + String m_url;
|
| + RefPtr<GetResourceContentCallback> m_callback;
|
| +};
|
| +
|
| +InspectorPageAgent::GetResourceContentLoadListener::GetResourceContentLoadListener(InspectorPageAgent* pageAgent, const String& frameId, const String& url, PassRefPtr<GetResourceContentCallback> callback)
|
| + : m_pageAgent(pageAgent)
|
| + , m_frameId(frameId)
|
| + , m_url(url)
|
| + , m_callback(callback)
|
| +{
|
| +}
|
| +
|
| +void InspectorPageAgent::GetResourceContentLoadListener::handleEvent()
|
| +{
|
| + if (!m_callback->isActive())
|
| + return;
|
| + m_pageAgent->getResourceContentAfterResourcesContentLoaded(m_frameId, m_url, m_callback);
|
| +}
|
| +
|
| static bool decodeBuffer(const char* buffer, unsigned size, const String& textEncodingName, String* result)
|
| {
|
| if (buffer) {
|
| @@ -253,13 +281,26 @@ void InspectorPageAgent::resourceContent(ErrorString* errorString, LocalFrame* f
|
| DocumentLoader* loader = assertDocumentLoader(errorString, frame);
|
| if (!loader)
|
| return;
|
| +
|
| if (!cachedResourceContent(cachedResource(frame, url), result, base64Encoded))
|
| *errorString = "No resource with given URL found";
|
| }
|
|
|
| Resource* InspectorPageAgent::cachedResource(LocalFrame* frame, const KURL& url)
|
| {
|
| - Resource* cachedResource = frame->document()->fetcher()->cachedResource(url);
|
| + Document* document = frame->document();
|
| + if (!document)
|
| + return 0;
|
| + Resource* cachedResource = document->fetcher()->cachedResource(url);
|
| + if (!cachedResource) {
|
| + Vector<Document*> allImports = InspectorPageAgent::importsForFrame(frame);
|
| + for (Vector<Document*>::const_iterator it = allImports.begin(); it != allImports.end(); ++it) {
|
| + Document* import = *it;
|
| + cachedResource = import->fetcher()->cachedResource(url);
|
| + if (cachedResource)
|
| + break;
|
| + }
|
| + }
|
| if (!cachedResource)
|
| cachedResource = memoryCache()->resourceForURL(url);
|
| return cachedResource;
|
| @@ -403,6 +444,7 @@ void InspectorPageAgent::enable(ErrorString*)
|
| m_enabled = true;
|
| m_state->setBoolean(PageAgentState::pageAgentEnabled, true);
|
| m_instrumentingAgents->setInspectorPageAgent(this);
|
| + m_inspectorResourceContentLoader = adoptPtr(new InspectorResourceContentLoader(m_page));
|
| }
|
|
|
| void InspectorPageAgent::disable(ErrorString*)
|
| @@ -412,6 +454,7 @@ void InspectorPageAgent::disable(ErrorString*)
|
| m_state->remove(PageAgentState::pageAgentScriptsToEvaluateOnLoad);
|
| m_overlay->hide();
|
| m_instrumentingAgents->setInspectorPageAgent(0);
|
| + m_inspectorResourceContentLoader.clear();
|
| m_deviceMetricsOverridden = false;
|
|
|
| setShowPaintRects(0, false);
|
| @@ -511,7 +554,7 @@ static PassRefPtr<TypeBuilder::Array<TypeBuilder::Page::Cookie> > buildArrayForC
|
| return cookies;
|
| }
|
|
|
| -static void cachedResourcesForDocument(Document* document, Vector<Resource*>& result)
|
| +static void cachedResourcesForDocument(Document* document, Vector<Resource*>& result, bool skipXHRs)
|
| {
|
| const ResourceFetcher::DocumentResourceMap& allResources = document->fetcher()->allResources();
|
| ResourceFetcher::DocumentResourceMap::const_iterator end = allResources.end();
|
| @@ -529,6 +572,10 @@ static void cachedResourcesForDocument(Document* document, Vector<Resource*>& re
|
| if (toFontResource(cachedResource)->stillNeedsLoad())
|
| continue;
|
| break;
|
| + case Resource::Raw:
|
| + if (skipXHRs)
|
| + continue;
|
| + break;
|
| default:
|
| // All other Resource types download immediately.
|
| break;
|
| @@ -538,7 +585,8 @@ static void cachedResourcesForDocument(Document* document, Vector<Resource*>& re
|
| }
|
| }
|
|
|
| -static Vector<Document*> importsForFrame(LocalFrame* frame)
|
| +// static
|
| +Vector<Document*> InspectorPageAgent::importsForFrame(LocalFrame* frame)
|
| {
|
| Vector<Document*> result;
|
| Document* rootDocument = frame->document();
|
| @@ -553,15 +601,15 @@ static Vector<Document*> importsForFrame(LocalFrame* frame)
|
| return result;
|
| }
|
|
|
| -static Vector<Resource*> cachedResourcesForFrame(LocalFrame* frame)
|
| +static Vector<Resource*> cachedResourcesForFrame(LocalFrame* frame, bool skipXHRs)
|
| {
|
| Vector<Resource*> result;
|
| Document* rootDocument = frame->document();
|
| - Vector<Document*> loaders = importsForFrame(frame);
|
| + Vector<Document*> loaders = InspectorPageAgent::importsForFrame(frame);
|
|
|
| - cachedResourcesForDocument(rootDocument, result);
|
| + cachedResourcesForDocument(rootDocument, result, skipXHRs);
|
| for (size_t i = 0; i < loaders.size(); ++i)
|
| - cachedResourcesForDocument(loaders[i], result);
|
| + cachedResourcesForDocument(loaders[i], result, skipXHRs);
|
|
|
| return result;
|
| }
|
| @@ -572,7 +620,7 @@ static Vector<KURL> allResourcesURLsForFrame(LocalFrame* frame)
|
|
|
| result.append(urlWithoutFragment(frame->loader().documentLoader()->url()));
|
|
|
| - Vector<Resource*> allResources = cachedResourcesForFrame(frame);
|
| + Vector<Resource*> allResources = cachedResourcesForFrame(frame, false);
|
| for (Vector<Resource*>::const_iterator it = allResources.begin(); it != allResources.end(); ++it)
|
| result.append(urlWithoutFragment((*it)->url()));
|
|
|
| @@ -616,12 +664,31 @@ void InspectorPageAgent::getResourceTree(ErrorString*, RefPtr<TypeBuilder::Page:
|
| object = buildObjectForFrameTree(m_page->deprecatedLocalMainFrame());
|
| }
|
|
|
| -void InspectorPageAgent::getResourceContent(ErrorString* errorString, const String& frameId, const String& url, String* content, bool* base64Encoded)
|
| +void InspectorPageAgent::getResourceContentAfterResourcesContentLoaded(const String& frameId, const String& url, PassRefPtr<GetResourceContentCallback> callback)
|
| {
|
| - LocalFrame* frame = assertFrame(errorString, frameId);
|
| - if (!frame)
|
| + ErrorString errorString;
|
| + LocalFrame* frame = assertFrame(&errorString, frameId);
|
| + if (!frame) {
|
| + callback->sendFailure(errorString);
|
| + return;
|
| + }
|
| + String content;
|
| + bool base64Encoded;
|
| + resourceContent(&errorString, frame, KURL(ParsedURLString, url), &content, &base64Encoded);
|
| + if (!errorString.isEmpty()) {
|
| + callback->sendFailure(errorString);
|
| return;
|
| - resourceContent(errorString, frame, KURL(ParsedURLString, url), content, base64Encoded);
|
| + }
|
| + callback->sendSuccess(content, base64Encoded);
|
| +}
|
| +
|
| +void InspectorPageAgent::getResourceContent(ErrorString* errorString, const String& frameId, const String& url, PassRefPtr<GetResourceContentCallback> callback)
|
| +{
|
| + if (!m_inspectorResourceContentLoader) {
|
| + callback->sendFailure("Agent was not enabled before sending content requests.");
|
| + return;
|
| + }
|
| + m_inspectorResourceContentLoader->addListener(adoptPtr(new GetResourceContentLoadListener(this, frameId, url, callback)));
|
| }
|
|
|
| static bool textContentForResource(Resource* cachedResource, String* result)
|
| @@ -857,7 +924,7 @@ void InspectorPageAgent::loadEventFired(LocalFrame* frame)
|
|
|
| void InspectorPageAgent::didCommitLoad(LocalFrame*, DocumentLoader* loader)
|
| {
|
| - // FIXME: If "frame" is always guarenteed to be in the same Page as loader->frame()
|
| + // FIXME: If "frame" is always guaranteed to be in the same Page as loader->frame()
|
| // then all we need to check here is loader->frame()->isMainFrame()
|
| // and we don't need "frame" at all.
|
| if (loader->frame() == m_page->mainFrame()) {
|
| @@ -865,6 +932,8 @@ void InspectorPageAgent::didCommitLoad(LocalFrame*, DocumentLoader* loader)
|
| m_scriptPreprocessorSource = m_pendingScriptPreprocessor;
|
| m_pendingScriptToEvaluateOnLoadOnce = String();
|
| m_pendingScriptPreprocessor = String();
|
| + if (m_inspectorResourceContentLoader)
|
| + m_inspectorResourceContentLoader->stop();
|
| }
|
| m_frontend->frameNavigated(buildObjectForFrame(loader->frame()));
|
| }
|
| @@ -1102,7 +1171,7 @@ PassRefPtr<TypeBuilder::Page::FrameResourceTree> InspectorPageAgent::buildObject
|
| .setFrame(frameObject)
|
| .setResources(subresources);
|
|
|
| - Vector<Resource*> allResources = cachedResourcesForFrame(frame);
|
| + Vector<Resource*> allResources = cachedResourcesForFrame(frame, true);
|
| for (Vector<Resource*>::const_iterator it = allResources.begin(); it != allResources.end(); ++it) {
|
| Resource* cachedResource = *it;
|
|
|
| @@ -1117,7 +1186,7 @@ PassRefPtr<TypeBuilder::Page::FrameResourceTree> InspectorPageAgent::buildObject
|
| subresources->addItem(resourceObject);
|
| }
|
|
|
| - Vector<Document*> allImports = importsForFrame(frame);
|
| + Vector<Document*> allImports = InspectorPageAgent::importsForFrame(frame);
|
| for (Vector<Document*>::const_iterator it = allImports.begin(); it != allImports.end(); ++it) {
|
| Document* import = *it;
|
| RefPtr<TypeBuilder::Page::FrameResourceTree::Resources> resourceObject = TypeBuilder::Page::FrameResourceTree::Resources::create()
|
|
|