Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Side by Side Diff: Source/core/inspector/InspectorResourceAgent.cpp

Issue 23658039: [ABANDONED] Get content of resources from Blob when the downloadToFile option is enabled (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 23 matching lines...) Expand all
34 #include "FetchInitiatorTypeNames.h" 34 #include "FetchInitiatorTypeNames.h"
35 #include "InspectorFrontend.h" 35 #include "InspectorFrontend.h"
36 #include "bindings/v8/ExceptionStatePlaceholder.h" 36 #include "bindings/v8/ExceptionStatePlaceholder.h"
37 #include "bindings/v8/ScriptCallStackFactory.h" 37 #include "bindings/v8/ScriptCallStackFactory.h"
38 #include "core/dom/Document.h" 38 #include "core/dom/Document.h"
39 #include "core/dom/ScriptableDocumentParser.h" 39 #include "core/dom/ScriptableDocumentParser.h"
40 #include "core/fetch/FetchInitiatorInfo.h" 40 #include "core/fetch/FetchInitiatorInfo.h"
41 #include "core/fetch/MemoryCache.h" 41 #include "core/fetch/MemoryCache.h"
42 #include "core/fetch/Resource.h" 42 #include "core/fetch/Resource.h"
43 #include "core/fetch/ResourceLoader.h" 43 #include "core/fetch/ResourceLoader.h"
44 #include "core/fetch/TextResourceDecoder.h"
45 #include "core/fileapi/Blob.h"
46 #include "core/fileapi/FileReaderLoader.h"
47 #include "core/fileapi/FileReaderLoaderClient.h"
44 #include "core/inspector/IdentifiersFactory.h" 48 #include "core/inspector/IdentifiersFactory.h"
45 #include "core/inspector/InspectorClient.h" 49 #include "core/inspector/InspectorClient.h"
46 #include "core/inspector/InspectorOverlay.h" 50 #include "core/inspector/InspectorOverlay.h"
47 #include "core/inspector/InspectorPageAgent.h" 51 #include "core/inspector/InspectorPageAgent.h"
48 #include "core/inspector/InspectorState.h" 52 #include "core/inspector/InspectorState.h"
49 #include "core/inspector/InstrumentingAgents.h" 53 #include "core/inspector/InstrumentingAgents.h"
50 #include "core/inspector/NetworkResourcesData.h" 54 #include "core/inspector/NetworkResourcesData.h"
51 #include "core/inspector/ScriptCallStack.h" 55 #include "core/inspector/ScriptCallStack.h"
52 #include "core/loader/DocumentLoader.h" 56 #include "core/loader/DocumentLoader.h"
53 #include "core/loader/DocumentThreadableLoader.h" 57 #include "core/loader/DocumentThreadableLoader.h"
54 #include "core/loader/FrameLoader.h" 58 #include "core/loader/FrameLoader.h"
55 #include "core/loader/ThreadableLoader.h" 59 #include "core/loader/ThreadableLoader.h"
56 #include "core/loader/ThreadableLoaderClient.h" 60 #include "core/loader/ThreadableLoaderClient.h"
57 #include "core/page/Frame.h" 61 #include "core/page/Frame.h"
58 #include "core/page/Page.h" 62 #include "core/page/Page.h"
59 #include "core/platform/JSONValues.h" 63 #include "core/platform/JSONValues.h"
60 #include "core/platform/network/HTTPHeaderMap.h" 64 #include "core/platform/network/HTTPHeaderMap.h"
61 #include "core/platform/network/ResourceError.h" 65 #include "core/platform/network/ResourceError.h"
62 #include "core/platform/network/ResourceRequest.h" 66 #include "core/platform/network/ResourceRequest.h"
63 #include "core/platform/network/ResourceResponse.h" 67 #include "core/platform/network/ResourceResponse.h"
64 #include "core/xml/XMLHttpRequest.h" 68 #include "core/xml/XMLHttpRequest.h"
65 #include "modules/websockets/WebSocketFrame.h" 69 #include "modules/websockets/WebSocketFrame.h"
66 #include "modules/websockets/WebSocketHandshakeRequest.h" 70 #include "modules/websockets/WebSocketHandshakeRequest.h"
67 #include "modules/websockets/WebSocketHandshakeResponse.h" 71 #include "modules/websockets/WebSocketHandshakeResponse.h"
68 #include "weborigin/KURL.h" 72 #include "weborigin/KURL.h"
69 #include "wtf/CurrentTime.h" 73 #include "wtf/CurrentTime.h"
70 #include "wtf/RefPtr.h" 74 #include "wtf/RefPtr.h"
71 75
72 typedef WebCore::InspectorBackendDispatcher::NetworkCommandHandler::LoadResource ForFrontendCallback LoadResourceForFrontendCallback; 76 typedef WebCore::InspectorBackendDispatcher::NetworkCommandHandler::LoadResource ForFrontendCallback LoadResourceForFrontendCallback;
77 typedef WebCore::InspectorBackendDispatcher::NetworkCommandHandler::GetResponseB odyCallback GetResponseBodyCallback;
73 78
74 namespace WebCore { 79 namespace WebCore {
75 80
76 namespace ResourceAgentState { 81 namespace ResourceAgentState {
77 static const char resourceAgentEnabled[] = "resourceAgentEnabled"; 82 static const char resourceAgentEnabled[] = "resourceAgentEnabled";
78 static const char extraRequestHeaders[] = "extraRequestHeaders"; 83 static const char extraRequestHeaders[] = "extraRequestHeaders";
79 static const char cacheDisabled[] = "cacheDisabled"; 84 static const char cacheDisabled[] = "cacheDisabled";
80 static const char userAgentOverride[] = "userAgentOverride"; 85 static const char userAgentOverride[] = "userAgentOverride";
81 } 86 }
82 87
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 } 168 }
164 169
165 RefPtr<LoadResourceForFrontendCallback> m_callback; 170 RefPtr<LoadResourceForFrontendCallback> m_callback;
166 RefPtr<ThreadableLoader> m_loader; 171 RefPtr<ThreadableLoader> m_loader;
167 RefPtr<TextResourceDecoder> m_decoder; 172 RefPtr<TextResourceDecoder> m_decoder;
168 ScriptString m_responseText; 173 ScriptString m_responseText;
169 int m_statusCode; 174 int m_statusCode;
170 HTTPHeaderMap m_responseHeaders; 175 HTTPHeaderMap m_responseHeaders;
171 }; 176 };
172 177
178
179 class InspectorResourceFileReaderLoaderClient : public FileReaderLoaderClient {
180 WTF_MAKE_NONCOPYABLE(InspectorResourceFileReaderLoaderClient);
181 public:
182 InspectorResourceFileReaderLoaderClient(PassRefPtr<GetResponseBodyCallback> callback)
183 : m_callback(callback) { }
184
185 void didStartLoading()
186 {
187 ASSERT(m_loader);
188 }
189
190 void didReceiveData()
191 {
192 ASSERT(m_loader);
193 }
194
195 void didFinishLoading()
196 {
197 ASSERT(m_loader);
198 if (!m_decoder) {
199 m_callback->sendSuccess(String(""), false);
200 } else {
201 RefPtr<ArrayBuffer> buffer = m_loader->arrayBufferResult();
202 String content = m_decoder->decode(static_cast<const char*>(buffer-> data()), buffer->byteLength());
203 m_callback->sendSuccess(content + m_decoder->flush(), false);
204 }
205 dispose();
206 }
207
208 void didFail(FileError::ErrorCode errorCode)
209 {
210 m_callback->sendFailure("Failed to load Blob: error code = " + String::n umber(errorCode)); // FIXME: Generate human-friendly reason message.
211 dispose();
212 }
213
214 void setLoader(PassOwnPtr<FileReaderLoader> loader)
215 {
216 m_loader = loader;
217 }
218
219 void start(Document* document, PassRefPtr<Blob> prpBlob, const String& textE ncodingName)
220 {
221 ASSERT(m_loader);
222 RefPtr<Blob> blob = prpBlob;
223 m_decoder = InspectorPageAgent::createXHRTextDecoder(blob->type(), textE ncodingName);
224 m_loader->start(document, *blob);
225 }
226
227 private:
228 void dispose()
229 {
230 m_loader.clear();
231 delete this;
232 }
233
234 OwnPtr<FileReaderLoader> m_loader;
235 RefPtr<GetResponseBodyCallback> m_callback;
236 RefPtr<TextResourceDecoder> m_decoder;
237 };
238
173 KURL urlWithoutFragment(const KURL& url) 239 KURL urlWithoutFragment(const KURL& url)
174 { 240 {
175 KURL result = url; 241 KURL result = url;
176 result.removeFragmentIdentifier(); 242 result.removeFragmentIdentifier();
177 return result; 243 return result;
178 } 244 }
179 245
180 } // namespace 246 } // namespace
181 247
182 void InspectorResourceAgent::setFrontend(InspectorFrontend* frontend) 248 void InspectorResourceAgent::setFrontend(InspectorFrontend* frontend)
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 } 541 }
476 542
477 void InspectorResourceAgent::willDestroyResource(Resource* cachedResource) 543 void InspectorResourceAgent::willDestroyResource(Resource* cachedResource)
478 { 544 {
479 Vector<String> requestIds = m_resourcesData->removeResource(cachedResource); 545 Vector<String> requestIds = m_resourcesData->removeResource(cachedResource);
480 if (!requestIds.size()) 546 if (!requestIds.size())
481 return; 547 return;
482 548
483 String content; 549 String content;
484 bool base64Encoded; 550 bool base64Encoded;
485 if (!InspectorPageAgent::cachedResourceContent(cachedResource, &content, &ba se64Encoded)) 551 RefPtr<Blob> blob;
552 String textEncodingName;
553 if (!InspectorPageAgent::cachedResourceContentOrBlob(cachedResource, &conten t, &base64Encoded, &blob, &textEncodingName))
486 return; 554 return;
487 Vector<String>::iterator end = requestIds.end(); 555 Vector<String>::iterator end = requestIds.end();
488 for (Vector<String>::iterator it = requestIds.begin(); it != end; ++it) 556 for (Vector<String>::iterator it = requestIds.begin(); it != end; ++it) {
489 m_resourcesData->setResourceContent(*it, content, base64Encoded); 557 if (!blob)
558 m_resourcesData->setResourceContent(*it, content, base64Encoded);
559 else
560 m_resourcesData->setResourceBlob(*it, blob, textEncodingName);
561 }
490 } 562 }
491 563
492 void InspectorResourceAgent::applyUserAgentOverride(String* userAgent) 564 void InspectorResourceAgent::applyUserAgentOverride(String* userAgent)
493 { 565 {
494 String userAgentOverride = m_state->getString(ResourceAgentState::userAgentO verride); 566 String userAgentOverride = m_state->getString(ResourceAgentState::userAgentO verride);
495 if (!userAgentOverride.isEmpty()) 567 if (!userAgentOverride.isEmpty())
496 *userAgent = userAgentOverride; 568 *userAgent = userAgentOverride;
497 } 569 }
498 570
499 void InspectorResourceAgent::willRecalculateStyle(Document*) 571 void InspectorResourceAgent::willRecalculateStyle(Document*)
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
622 { 694 {
623 m_state->setString(ResourceAgentState::userAgentOverride, userAgent); 695 m_state->setString(ResourceAgentState::userAgentOverride, userAgent);
624 m_overlay->setOverride(InspectorOverlay::UserAgentOverride, !userAgent.isEmp ty()); 696 m_overlay->setOverride(InspectorOverlay::UserAgentOverride, !userAgent.isEmp ty());
625 } 697 }
626 698
627 void InspectorResourceAgent::setExtraHTTPHeaders(ErrorString*, const RefPtr<JSON Object>& headers) 699 void InspectorResourceAgent::setExtraHTTPHeaders(ErrorString*, const RefPtr<JSON Object>& headers)
628 { 700 {
629 m_state->setObject(ResourceAgentState::extraRequestHeaders, headers); 701 m_state->setObject(ResourceAgentState::extraRequestHeaders, headers);
630 } 702 }
631 703
632 void InspectorResourceAgent::getResponseBody(ErrorString* errorString, const Str ing& requestId, String* content, bool* base64Encoded) 704 void InspectorResourceAgent::getResponseBody(ErrorString* errorString, const Str ing& requestId, PassRefPtr<GetResponseBodyCallback> prpCallback)
633 { 705 {
706 RefPtr<GetResponseBodyCallback> callback = prpCallback;
707 if (!callback->isActive())
708 return;
709
710 Document* document = m_pageAgent->mainFrame()->document();
711 if (!document) {
712 *errorString = "No Document instance for the specified frame";
713 return;
714 }
715
634 NetworkResourcesData::ResourceData const* resourceData = m_resourcesData->da ta(requestId); 716 NetworkResourcesData::ResourceData const* resourceData = m_resourcesData->da ta(requestId);
635 if (!resourceData) { 717 if (!resourceData) {
636 *errorString = "No resource with given identifier found"; 718 *errorString = "No resource with given identifier found";
637 return; 719 return;
638 } 720 }
639 721
640 if (resourceData->hasContent()) { 722 if (resourceData->hasContent()) {
641 *base64Encoded = resourceData->base64Encoded(); 723 callback->sendSuccess(resourceData->content(), resourceData->base64Encod ed());
642 *content = resourceData->content();
643 return; 724 return;
644 } 725 }
645 726
727 if (resourceData->hasBlob()) {
728 InspectorResourceFileReaderLoaderClient* client = new InspectorResourceF ileReaderLoaderClient(callback);
729 OwnPtr<FileReaderLoader> loader = adoptPtr(new FileReaderLoader(FileRead erLoader::ReadAsArrayBuffer, client));
730 client->setLoader(loader.release());
731 client->start(document, resourceData->blob(), resourceData->blobTextEnco dingName());
732 return;
733 }
734
646 if (resourceData->isContentEvicted()) { 735 if (resourceData->isContentEvicted()) {
647 *errorString = "Request content was evicted from inspector cache"; 736 *errorString = "Request content was evicted from inspector cache";
648 return; 737 return;
649 } 738 }
650 739
651 if (resourceData->buffer() && !resourceData->textEncodingName().isNull()) { 740 if (resourceData->buffer() && !resourceData->textEncodingName().isNull()) {
652 *base64Encoded = false; 741 String content;
653 if (InspectorPageAgent::sharedBufferContent(resourceData->buffer(), reso urceData->textEncodingName(), *base64Encoded, content)) 742 bool base64Encoded = false;
743 if (InspectorPageAgent::sharedBufferContent(resourceData->buffer(), reso urceData->textEncodingName(), base64Encoded, &content)) {
744 callback->sendSuccess(content, base64Encoded);
654 return; 745 return;
746 }
655 } 747 }
656 748
657 if (resourceData->cachedResource()) { 749 if (resourceData->cachedResource()) {
658 if (InspectorPageAgent::cachedResourceContent(resourceData->cachedResour ce(), content, base64Encoded)) 750 String content;
751 bool base64Encoded;
752 RefPtr<Blob> blob;
753 String textEncodingName;
754 if (InspectorPageAgent::cachedResourceContentOrBlob(resourceData->cached Resource(), &content, &base64Encoded, &blob, &textEncodingName)) {
755 if (blob) {
756 InspectorResourceFileReaderLoaderClient* client = new InspectorR esourceFileReaderLoaderClient(callback);
757 OwnPtr<FileReaderLoader> loader = adoptPtr(new FileReaderLoader( FileReaderLoader::ReadAsArrayBuffer, client));
758 client->setLoader(loader.release());
759 client->start(document, blob.release(), textEncodingName);
760 } else {
761 callback->sendSuccess(content, base64Encoded);
762 }
659 return; 763 return;
764 }
660 } 765 }
661 766
662 *errorString = "No data found for resource with given identifier"; 767 *errorString = "No data found for resource with given identifier";
663 } 768 }
664 769
665 void InspectorResourceAgent::replayXHR(ErrorString*, const String& requestId) 770 void InspectorResourceAgent::replayXHR(ErrorString*, const String& requestId)
666 { 771 {
667 RefPtr<XMLHttpRequest> xhr = XMLHttpRequest::create(m_pageAgent->mainFrame() ->document()); 772 RefPtr<XMLHttpRequest> xhr = XMLHttpRequest::create(m_pageAgent->mainFrame() ->document());
668 String actualRequestId = requestId; 773 String actualRequestId = requestId;
669 774
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 , m_overlay(overlay) 888 , m_overlay(overlay)
784 , m_frontend(0) 889 , m_frontend(0)
785 , m_resourcesData(adoptPtr(new NetworkResourcesData())) 890 , m_resourcesData(adoptPtr(new NetworkResourcesData()))
786 , m_loadingXHRSynchronously(false) 891 , m_loadingXHRSynchronously(false)
787 , m_isRecalculatingStyle(false) 892 , m_isRecalculatingStyle(false)
788 { 893 {
789 } 894 }
790 895
791 } // namespace WebCore 896 } // namespace WebCore
792 897
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698