summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/render_view.cc
diff options
context:
space:
mode:
authormpcomplete@google.com <mpcomplete@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-08 20:53:24 +0000
committermpcomplete@google.com <mpcomplete@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-08 20:53:24 +0000
commit0281b06f8bbde4c064a9276e6d70484ba2a3eaec (patch)
treefb2a4a873c32f45d27d982a8eb5068349d311c4d /chrome/renderer/render_view.cc
parentb6f05b3fd9422fd9b5c8142fa4224ba2d8abf1d4 (diff)
downloadchromium_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.cc47
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.