diff options
author | mpcomplete@google.com <mpcomplete@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-08 20:53:24 +0000 |
---|---|---|
committer | mpcomplete@google.com <mpcomplete@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-08 20:53:24 +0000 |
commit | 0281b06f8bbde4c064a9276e6d70484ba2a3eaec (patch) | |
tree | fb2a4a873c32f45d27d982a8eb5068349d311c4d /chrome/renderer/render_view.cc | |
parent | b6f05b3fd9422fd9b5c8142fa4224ba2d8abf1d4 (diff) | |
download | chromium_src-0281b06f8bbde4c064a9276e6d70484ba2a3eaec.zip chromium_src-0281b06f8bbde4c064a9276e6d70484ba2a3eaec.tar.gz chromium_src-0281b06f8bbde4c064a9276e6d70484ba2a3eaec.tar.bz2 |
Revert 17889. It broke the extensions_uitests. And I didn't even get it
reviewed! (Wow, brainfart.)
TBR=aa
Review URL: http://codereview.chromium.org/119324
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@17893 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/render_view.cc')
-rw-r--r-- | chrome/renderer/render_view.cc | 47 |
1 files changed, 43 insertions, 4 deletions
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index a9cfe46..4e0ec16 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -207,6 +207,13 @@ RenderView::~RenderView() { it = plugin_delegates_.erase(it); } + // Clear any pending extension api call requests. + IDMap<ExtensionProcessBindings::CallContext>::const_iterator call = + pending_extension_requests_.begin(); + for (; call != pending_extension_requests_.end(); ++call) { + delete call->second; + } + render_thread_->RemoveFilter(debug_message_handler_); render_thread_->RemoveFilter(audio_message_filter_); } @@ -1337,6 +1344,23 @@ void RenderView::DidCancelClientRedirect(WebView* webview, } void RenderView::WillCloseFrame(WebView* view, WebFrame* frame) { + // Remove all the pending extension callbacks for this frame. + if (pending_extension_requests_.IsEmpty()) + return; + + std::vector<int> orphaned_requests; + for (IDMap<ExtensionProcessBindings::CallContext>::const_iterator iter = + pending_extension_requests_.begin(); + iter != pending_extension_requests_.end(); ++iter) { + if (iter->second->frame_ == frame) + orphaned_requests.push_back(iter->first); + } + + for (std::vector<int>::const_iterator iter = orphaned_requests.begin(); + iter != orphaned_requests.end(); ++iter) { + delete pending_extension_requests_.Lookup(*iter); + pending_extension_requests_.Remove(*iter); + } } void RenderView::DidCompleteClientRedirect(WebView* webview, @@ -2731,17 +2755,32 @@ void RenderView::OnSetBackground(const SkBitmap& background) { void RenderView::SendExtensionRequest(const std::string& name, const std::string& args, int request_id, - bool has_callback) { + bool has_callback, + WebFrame* request_frame) { + DCHECK(request_frame) << "Request specified without frame"; + pending_extension_requests_.AddWithID( + new ExtensionProcessBindings::CallContext(request_frame, name), + request_id); + Send(new ViewHostMsg_ExtensionRequest(routing_id_, name, args, request_id, - has_callback)); + has_callback)); } void RenderView::OnExtensionResponse(int request_id, bool success, const std::string& response, const std::string& error) { - ExtensionProcessBindings::HandleResponse(request_id, success, response, - error); + ExtensionProcessBindings::CallContext* call = + pending_extension_requests_.Lookup(request_id); + + if (!call) + return; // The frame went away. + + ExtensionProcessBindings::ExecuteResponseInFrame(call, request_id, + success, response, + error); + pending_extension_requests_.Remove(request_id); + delete call; } // Dump all load time histograms. |