diff options
author | rafaelw@chromium.org <rafaelw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-02 21:01:39 +0000 |
---|---|---|
committer | rafaelw@chromium.org <rafaelw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-02 21:01:39 +0000 |
commit | bb64b5128f1641cba1e802ae7d0768be955ffdc5 (patch) | |
tree | 155aa1198f32f57dbdce887dd49a0d7b892fd283 | |
parent | db163f8b20b0a6c512e1ad21bab9af15a8c9c218 (diff) | |
download | chromium_src-bb64b5128f1641cba1e802ae7d0768be955ffdc5.zip chromium_src-bb64b5128f1641cba1e802ae7d0768be955ffdc5.tar.gz chromium_src-bb64b5128f1641cba1e802ae7d0768be955ffdc5.tar.bz2 |
Add calling frame's source_url to extension and dom ui requests.
Additionally, in the extension and tabs api, compute & report UMA histogram data for relative URL use in API calls so we can decide if it's possible to change the behavior of relative url resolution to use the calling frame's url rather than the extension's base url.
Review URL: http://codereview.chromium.org/1605005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@43523 0039d316-1c4b-4281-b951-d872f2087c98
23 files changed, 149 insertions, 59 deletions
diff --git a/chrome/browser/dom_ui/dom_ui.cc b/chrome/browser/dom_ui/dom_ui.cc index 8f83db1..1d6b5b5 100644 --- a/chrome/browser/dom_ui/dom_ui.cc +++ b/chrome/browser/dom_ui/dom_ui.cc @@ -38,6 +38,7 @@ DOMUI::~DOMUI() { void DOMUI::ProcessDOMUIMessage(const std::string& message, const Value* content, + const GURL& source_url, int request_id, bool has_callback) { // Look up the callback for this message. diff --git a/chrome/browser/dom_ui/dom_ui.h b/chrome/browser/dom_ui/dom_ui.h index fe1af1c1..7fd2e55 100644 --- a/chrome/browser/dom_ui/dom_ui.h +++ b/chrome/browser/dom_ui/dom_ui.h @@ -42,6 +42,7 @@ class DOMUI { // Called from TabContents. virtual void ProcessDOMUIMessage(const std::string& message, const Value* content, + const GURL& source_url, int request_id, bool has_callback); diff --git a/chrome/browser/extensions/extension_dom_ui.cc b/chrome/browser/extensions/extension_dom_ui.cc index 7d8d15d..40f11f1 100644 --- a/chrome/browser/extensions/extension_dom_ui.cc +++ b/chrome/browser/extensions/extension_dom_ui.cc @@ -91,9 +91,13 @@ void ExtensionDOMUI::RenderViewReused(RenderViewHost* render_view_host) { void ExtensionDOMUI::ProcessDOMUIMessage(const std::string& message, const Value* content, + const GURL& source_url, int request_id, bool has_callback) { - extension_function_dispatcher_->HandleRequest(message, content, request_id, + extension_function_dispatcher_->HandleRequest(message, + content, + source_url, + request_id, has_callback); } diff --git a/chrome/browser/extensions/extension_dom_ui.h b/chrome/browser/extensions/extension_dom_ui.h index 7892b89..d14eb69 100644 --- a/chrome/browser/extensions/extension_dom_ui.h +++ b/chrome/browser/extensions/extension_dom_ui.h @@ -37,6 +37,7 @@ class ExtensionDOMUI virtual void RenderViewReused(RenderViewHost* render_view_host); virtual void ProcessDOMUIMessage(const std::string& message, const Value* content, + const GURL& source_url, int request_id, bool has_callback); diff --git a/chrome/browser/extensions/extension_function.h b/chrome/browser/extensions/extension_function.h index 8e1ab8f..272d6c1 100644 --- a/chrome/browser/extensions/extension_function.h +++ b/chrome/browser/extensions/extension_function.h @@ -71,6 +71,9 @@ class ExtensionFunction : public base::RefCounted<ExtensionFunction> { void set_request_id(int request_id) { request_id_ = request_id; } int request_id() { return request_id_; } + void set_source_url(const GURL& source_url) { source_url_ = source_url; } + const GURL& source_url() { return source_url_; } + void set_has_callback(bool has_callback) { has_callback_ = has_callback; } bool has_callback() { return has_callback_; } @@ -126,6 +129,9 @@ class ExtensionFunction : public base::RefCounted<ExtensionFunction> { // The name of this function. std::string name_; + // The URL of the frame which is making this request + GURL source_url_; + // True if the js caller provides a callback function to receive the response // of this call. bool has_callback_; diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc index 78a2c032..8abc84c 100644 --- a/chrome/browser/extensions/extension_function_dispatcher.cc +++ b/chrome/browser/extensions/extension_function_dispatcher.cc @@ -372,12 +372,14 @@ Extension* ExtensionFunctionDispatcher::GetExtension() { void ExtensionFunctionDispatcher::HandleRequest(const std::string& name, const Value* args, + const GURL& source_url, int request_id, bool has_callback) { scoped_refptr<ExtensionFunction> function( FactoryRegistry::instance()->NewFunction(name)); function->set_dispatcher_peer(peer_); function->SetArgs(args); + function->set_source_url(source_url); function->set_request_id(request_id); function->set_has_callback(has_callback); ExtensionsService* service = profile()->GetExtensionsService(); diff --git a/chrome/browser/extensions/extension_function_dispatcher.h b/chrome/browser/extensions/extension_function_dispatcher.h index 86342cc..08e74bc1 100644 --- a/chrome/browser/extensions/extension_function_dispatcher.h +++ b/chrome/browser/extensions/extension_function_dispatcher.h @@ -92,7 +92,7 @@ class ExtensionFunctionDispatcher { // Handle a request to execute an extension function. void HandleRequest(const std::string& name, const Value* args, - int request_id, bool has_callback); + const GURL& source_url, int request_id, bool has_callback); // Send a response to a function. void SendResponse(ExtensionFunction* api, bool success); diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc index 1e04547..a9d2259 100644 --- a/chrome/browser/extensions/extension_host.cc +++ b/chrome/browser/extensions/extension_host.cc @@ -526,11 +526,12 @@ WebPreferences ExtensionHost::GetWebkitPrefs() { void ExtensionHost::ProcessDOMUIMessage(const std::string& message, const Value* content, + const GURL& source_url, int request_id, bool has_callback) { if (extension_function_dispatcher_.get()) { extension_function_dispatcher_->HandleRequest( - message, content, request_id, has_callback); + message, content, source_url, request_id, has_callback); } } diff --git a/chrome/browser/extensions/extension_host.h b/chrome/browser/extensions/extension_host.h index b7de670..4d6ca59 100644 --- a/chrome/browser/extensions/extension_host.h +++ b/chrome/browser/extensions/extension_host.h @@ -121,6 +121,7 @@ class ExtensionHost : public RenderViewHostDelegate, virtual WebPreferences GetWebkitPrefs(); virtual void ProcessDOMUIMessage(const std::string& message, const Value* content, + const GURL& source_url, int request_id, bool has_callback); virtual void RunJavaScriptMessage(const std::wstring& message, diff --git a/chrome/browser/extensions/extension_tabs_module.cc b/chrome/browser/extensions/extension_tabs_module.cc index 934f2d6..28b50e9 100644 --- a/chrome/browser/extensions/extension_tabs_module.cc +++ b/chrome/browser/extensions/extension_tabs_module.cc @@ -4,6 +4,7 @@ #include "chrome/browser/extensions/extension_tabs_module.h" +#include "base/histogram.h" #include "base/base64.h" #include "base/string_util.h" #include "chrome/browser/browser.h" @@ -48,6 +49,19 @@ static bool GetTabById(int tab_id, Profile* profile, TabContents** contents, int* tab_index, std::string* error_message); +// Takes |url_string| and returns a GURL which is either valid and absolute +// or invalid. If |url_string| is not directly interpretable as a valid (it is +// likely a relative URL) an attempt is made to resolve it. |extension| is +// provided so it can be resolved relative to its extension base +// (chrome-extension://<id>/). |source_url| is provided so that we can test +// whether |url_string| resolves differently relative to the source frame url. +// Using the source frame url would be more correct, but because the api shipped +// with urls resolved relative to their extension base, we must first measure +// how much of an inpact making the change would have. +static GURL ResolvePossiblyRelativeURL(std::string url_string, + Extension* extension, + const GURL& source_url); + // Return the type name for a browser window type. static std::string GetWindowTypeText(Browser::Type type); @@ -281,26 +295,22 @@ bool GetAllWindowsFunction::RunImpl() { } bool CreateWindowFunction::RunImpl() { - scoped_ptr<GURL> url(new GURL()); + GURL url; // Look for optional url. if (!args_->IsType(Value::TYPE_NULL)) { EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY)); const DictionaryValue *args = args_as_dictionary(); - std::string url_input; + std::string url_string; if (args->HasKey(keys::kUrlKey)) { EXTENSION_FUNCTION_VALIDATE(args->GetString(keys::kUrlKey, - &url_input)); - url.reset(new GURL(url_input)); - if (!url->is_valid()) { - // The path as passed in is not valid. Try converting to absolute path. - *url = GetExtension()->GetResourceURL(url_input); - if (!url->is_valid()) { - error_ = ExtensionErrorUtils::FormatErrorMessage( - keys::kInvalidUrlError, - url_input); - return false; - } + &url_string)); + url = ResolvePossiblyRelativeURL(url_string, GetExtension(), + source_url()); + if (!url.is_valid()) { + error_ = ExtensionErrorUtils::FormatErrorMessage( + keys::kInvalidUrlError, url_string); + return false; } } } @@ -374,7 +384,7 @@ bool CreateWindowFunction::RunImpl() { Browser* new_window = new Browser(window_type, window_profile); new_window->CreateBrowserWindow(); - new_window->AddTabWithURL(*(url.get()), GURL(), PageTransition::LINK, true, + new_window->AddTabWithURL(url, GURL(), PageTransition::LINK, true, -1, false, NULL); new_window->window()->SetBounds(bounds); @@ -532,19 +542,15 @@ bool CreateTabFunction::RunImpl() { // -favIconUrl std::string url_string; - scoped_ptr<GURL> url(new GURL()); + GURL url; if (args->HasKey(keys::kUrlKey)) { EXTENSION_FUNCTION_VALIDATE(args->GetString(keys::kUrlKey, &url_string)); - url.reset(new GURL(url_string)); - if (!url->is_valid()) { - // The path as passed in is not valid. Try converting to absolute path. - *url = GetExtension()->GetResourceURL(url_string); - if (!url->is_valid()) { - error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kInvalidUrlError, - url_string); - return false; - } + url = ResolvePossiblyRelativeURL(url_string, GetExtension(), source_url()); + if (!url.is_valid()) { + error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kInvalidUrlError, + url_string); + return false; } } @@ -563,7 +569,7 @@ bool CreateTabFunction::RunImpl() { // We can't load extension URLs into incognito windows. Special case to // fall back to a normal window. - if (url->SchemeIs(chrome::kExtensionScheme) && + if (url.SchemeIs(chrome::kExtensionScheme) && browser->profile()->IsOffTheRecord()) { browser = Browser::GetOrCreateTabbedBrowser( browser->profile()->GetOriginalProfile()); @@ -580,7 +586,7 @@ bool CreateTabFunction::RunImpl() { index = tab_strip->count(); } - TabContents* contents = browser->AddTabWithURL(*(url.get()), GURL(), + TabContents* contents = browser->AddTabWithURL(url, GURL(), PageTransition::LINK, selected, index, true, NULL); index = tab_strip->GetIndexOfTabContents(contents); @@ -632,25 +638,22 @@ bool UpdateTabFunction::RunImpl() { // -favIconUrl // Navigate the tab to a new location if the url different. - std::string url; + std::string url_string; if (update_props->HasKey(keys::kUrlKey)) { EXTENSION_FUNCTION_VALIDATE(update_props->GetString( - keys::kUrlKey, &url)); - GURL new_gurl(url); - - if (!new_gurl.is_valid()) { - // The path as passed in is not valid. Try converting to absolute path. - new_gurl = GetExtension()->GetResourceURL(url); - if (!new_gurl.is_valid()) { - error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kInvalidUrlError, - url); - return false; - } + keys::kUrlKey, &url_string)); + GURL url = ResolvePossiblyRelativeURL(url_string, GetExtension(), + source_url()); + + if (!url.is_valid()) { + error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kInvalidUrlError, + url_string); + return false; } // JavaScript URLs can do the same kinds of things as cross-origin XHR, so // we need to check host permissions before allowing them. - if (new_gurl.SchemeIs(chrome::kJavaScriptScheme)) { + if (url.SchemeIs(chrome::kJavaScriptScheme)) { if (!GetExtension()->CanExecuteScriptOnHost(contents->GetURL(), &error_)) return false; @@ -665,12 +668,12 @@ bool UpdateTabFunction::RunImpl() { return false; } - controller.LoadURL(new_gurl, GURL(), PageTransition::LINK); + controller.LoadURL(url, GURL(), PageTransition::LINK); // The URL of a tab contents never actually changes to a JavaScript URL, so // this check only makes sense in other cases. - if (!new_gurl.SchemeIs(chrome::kJavaScriptScheme)) - DCHECK_EQ(new_gurl.spec(), contents->GetURL().spec()); + if (!url.SchemeIs(chrome::kJavaScriptScheme)) + DCHECK_EQ(url.spec(), contents->GetURL().spec()); } bool selected = false; @@ -1033,3 +1036,39 @@ static std::string GetWindowTypeText(Browser::Type type) { DCHECK(type == Browser::TYPE_NORMAL); return keys::kWindowTypeValueNormal; } + +// These are histogram buckets passed to UMA in the following test of relative +// URL use in the tabs & windows API. +enum ExtensionAPIRelativeURLUse { + ABSOLUTE_URL, + RELATIVE_URL_RESOLUTIONS_DIFFER, + RELATIVE_URL_RESOLUTIONS_AGREE, + EXTENSION_API_RELATIVE_URL_USE_MAX_VALUE +}; + +static GURL ResolvePossiblyRelativeURL(std::string url_string, + Extension* extension, + const GURL& source_url) { + ExtensionAPIRelativeURLUse use_type = ABSOLUTE_URL; + + GURL url = GURL(url_string); + if (!url.is_valid()) { + url = extension->GetResourceURL(url_string); + GURL resolved_url = source_url.Resolve(url_string); + + // Note: It's possible that GetResourceURL() returned an invalid URL + // meaning that the url_string contained some kind of invalid characters. + // The first test for url.is_valid on the next line puts this case into + // the resolutions agree bucket -- in the sense that both resolutions would + // have resulted in an invald URL and thus an error being returned to the + // caller. + use_type = url.is_valid() && (url != resolved_url) ? + RELATIVE_URL_RESOLUTIONS_DIFFER : RELATIVE_URL_RESOLUTIONS_AGREE; + } + + UMA_HISTOGRAM_ENUMERATION("Extensions.APIUse_RelativeURL", use_type, + EXTENSION_API_RELATIVE_URL_USE_MAX_VALUE); + + return url; +} + diff --git a/chrome/browser/notifications/balloon_host.cc b/chrome/browser/notifications/balloon_host.cc index 9e9ba28..19414a0 100644 --- a/chrome/browser/notifications/balloon_host.cc +++ b/chrome/browser/notifications/balloon_host.cc @@ -81,11 +81,12 @@ void BalloonHost::RendererGone(RenderViewHost* render_view_host) { void BalloonHost::ProcessDOMUIMessage(const std::string& message, const Value* content, + const GURL& source_url, int request_id, bool has_callback) { if (extension_function_dispatcher_.get()) { extension_function_dispatcher_->HandleRequest( - message, content, request_id, has_callback); + message, content, source_url, request_id, has_callback); } } diff --git a/chrome/browser/notifications/balloon_host.h b/chrome/browser/notifications/balloon_host.h index 42cd0e0..8cc397c 100644 --- a/chrome/browser/notifications/balloon_host.h +++ b/chrome/browser/notifications/balloon_host.h @@ -67,6 +67,7 @@ class BalloonHost : public RenderViewHostDelegate, } virtual void ProcessDOMUIMessage(const std::string& message, const Value* content, + const GURL& source_url, int request_id, bool has_callback); diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index ddc754f..9f70534 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -1217,7 +1217,8 @@ void RenderViewHost::OnMsgDomOperationResponse( } void RenderViewHost::OnMsgDOMUISend( - const std::string& message, const std::string& content) { + const GURL& source_url, const std::string& message, + const std::string& content) { if (!ChildProcessSecurityPolicy::GetInstance()-> HasDOMUIBindings(process()->id())) { NOTREACHED() << "Blocked unauthorized use of DOMUIBindings."; @@ -1240,7 +1241,7 @@ void RenderViewHost::OnMsgDOMUISend( } } - delegate_->ProcessDOMUIMessage(message, value.get(), + delegate_->ProcessDOMUIMessage(message, value.get(), source_url, kRequestId, kHasCallback); } @@ -1740,6 +1741,7 @@ void RenderViewHost::OnRequestNotificationPermission( void RenderViewHost::OnExtensionRequest(const std::string& name, const ListValue& args_holder, + const GURL& source_url, int request_id, bool has_callback) { if (!ChildProcessSecurityPolicy::GetInstance()-> @@ -1759,7 +1761,8 @@ void RenderViewHost::OnExtensionRequest(const std::string& name, return; } - delegate_->ProcessDOMUIMessage(name, args, request_id, has_callback); + delegate_->ProcessDOMUIMessage(name, args, source_url, request_id, + has_callback); } void RenderViewHost::SendExtensionResponse(int request_id, bool success, diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h index 831c446..045acee 100644 --- a/chrome/browser/renderer_host/render_view_host.h +++ b/chrome/browser/renderer_host/render_view_host.h @@ -517,7 +517,8 @@ class RenderViewHost : public RenderWidgetHost { void OnMsgDidContentsPreferredSizeChange(const gfx::Size& new_size); void OnMsgDomOperationResponse(const std::string& json_string, int automation_id); - void OnMsgDOMUISend(const std::string& message, + void OnMsgDOMUISend(const GURL& source_url, + const std::string& message, const std::string& content); void OnMsgForwardMessageToExternalHost(const std::string& message, const std::string& origin, @@ -603,7 +604,9 @@ class RenderViewHost : public RenderWidgetHost { void OnRequestNotificationPermission(const GURL& origin, int callback_id); void OnExtensionRequest(const std::string& name, const ListValue& args, - int request_id, bool has_callback); + const GURL& source_url, + int request_id, + bool has_callback); void OnExtensionPostMessage(int port_id, const std::string& message); void OnAccessibilityFocusChange(int acc_obj_id); void OnAccessibilityObjectStateChange(int acc_obj_id); diff --git a/chrome/browser/renderer_host/render_view_host_delegate.h b/chrome/browser/renderer_host/render_view_host_delegate.h index 1f93d31..332fd24 100644 --- a/chrome/browser/renderer_host/render_view_host_delegate.h +++ b/chrome/browser/renderer_host/render_view_host_delegate.h @@ -546,6 +546,7 @@ class RenderViewHostDelegate { // By default we ignore such messages. virtual void ProcessDOMUIMessage(const std::string& message, const Value* content, + const GURL& source_url, int request_id, bool has_callback) {} diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc index bd9b517..cdd5d1f6 100644 --- a/chrome/browser/tab_contents/tab_contents.cc +++ b/chrome/browser/tab_contents/tab_contents.cc @@ -2468,6 +2468,7 @@ void TabContents::DomOperationResponse(const std::string& json_string, void TabContents::ProcessDOMUIMessage(const std::string& message, const Value* content, + const GURL& source_url, int request_id, bool has_callback) { if (!render_manager_.dom_ui()) { @@ -2476,7 +2477,8 @@ void TabContents::ProcessDOMUIMessage(const std::string& message, render_view_host()->BlockExtensionRequest(request_id); return; } - render_manager_.dom_ui()->ProcessDOMUIMessage(message, content, request_id, + render_manager_.dom_ui()->ProcessDOMUIMessage(message, content, source_url, + request_id, has_callback); } diff --git a/chrome/browser/tab_contents/tab_contents.h b/chrome/browser/tab_contents/tab_contents.h index de11dd2..b9e0f15 100644 --- a/chrome/browser/tab_contents/tab_contents.h +++ b/chrome/browser/tab_contents/tab_contents.h @@ -923,6 +923,7 @@ class TabContents : public PageNavigator, int automation_id); virtual void ProcessDOMUIMessage(const std::string& message, const Value* content, + const GURL& source_url, int request_id, bool has_callback); virtual void ProcessExternalHostMessage(const std::string& message, diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h index b112e01..d7ea058 100644 --- a/chrome/common/render_messages_internal.h +++ b/chrome/common/render_messages_internal.h @@ -1316,7 +1316,8 @@ IPC_BEGIN_MESSAGES(ViewHost) // A message from HTML-based UI. When (trusted) Javascript calls // send(message, args), this message is sent to the browser. - IPC_MESSAGE_ROUTED2(ViewHostMsg_DOMUISend, + IPC_MESSAGE_ROUTED3(ViewHostMsg_DOMUISend, + GURL /* source_url */, std::string /* message */, std::string /* args (as a JSON string) */) @@ -1865,9 +1866,10 @@ IPC_BEGIN_MESSAGES(ViewHost) // A renderer sends this message when an extension process starts an API // request. The browser will always respond with a ViewMsg_ExtensionResponse. - IPC_MESSAGE_ROUTED4(ViewHostMsg_ExtensionRequest, + IPC_MESSAGE_ROUTED5(ViewHostMsg_ExtensionRequest, std::string /* name */, ListValue /* argument */, + GURL /* source_url */, int /* callback id */, bool /* has_callback */) diff --git a/chrome/renderer/dom_ui_bindings.cc b/chrome/renderer/dom_ui_bindings.cc index 1183ceb..229cb29 100644 --- a/chrome/renderer/dom_ui_bindings.cc +++ b/chrome/renderer/dom_ui_bindings.cc @@ -8,6 +8,8 @@ #include "base/stl_util-inl.h" #include "base/values.h" #include "chrome/common/render_messages.h" +#include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" +#include "third_party/WebKit/WebKit/chromium/public/WebURL.h" DOMBoundBrowserObject::~DOMBoundBrowserObject() { STLDeleteContainerPointers(properties_.begin(), properties_.end()); @@ -43,9 +45,15 @@ void DOMUIBindings::send(const CppArgumentList& args, CppVariant* result) { base::JSONWriter::Write(&value, /* pretty_print= */ false, &content); } + // Retrieve the source frame's url + GURL source_url; + WebKit::WebFrame* webframe = WebKit::WebFrame::frameForCurrentContext(); + if (webframe) + source_url = webframe->url(); + // Send the message up to the browser. sender()->Send( - new ViewHostMsg_DOMUISend(routing_id(), message, content)); + new ViewHostMsg_DOMUISend(routing_id(), source_url, message, content)); } void DOMBoundBrowserObject::SetProperty(const std::string& name, diff --git a/chrome/renderer/extensions/extension_api_client_unittest.cc b/chrome/renderer/extensions/extension_api_client_unittest.cc index 7158a8c..111c991 100644 --- a/chrome/renderer/extensions/extension_api_client_unittest.cc +++ b/chrome/renderer/extensions/extension_api_client_unittest.cc @@ -97,7 +97,7 @@ TEST_F(ExtensionAPIClientTest, CallbackDispatching) { ASSERT_TRUE(request_msg); ViewHostMsg_ExtensionRequest::Param params; ViewHostMsg_ExtensionRequest::Read(request_msg, ¶ms); - int callback_id = params.c; + int callback_id = params.d; ASSERT_GE(callback_id, 0); // Now send the callback a response diff --git a/chrome/renderer/extensions/extension_process_bindings.cc b/chrome/renderer/extensions/extension_process_bindings.cc index 71b77a5..3232237 100644 --- a/chrome/renderer/extensions/extension_process_bindings.cc +++ b/chrome/renderer/extensions/extension_process_bindings.cc @@ -421,6 +421,11 @@ class ExtensionImpl : public ExtensionBase { return ExtensionProcessBindings::ThrowPermissionDeniedException(name); } + GURL source_url; + WebFrame* webframe = WebFrame::frameForCurrentContext(); + if (webframe) + source_url = webframe->url(); + int request_id = args[2]->Int32Value(); bool has_callback = args[3]->BooleanValue(); @@ -435,7 +440,7 @@ class ExtensionImpl : public ExtensionBase { GetPendingRequestMap()[request_id].reset(new PendingRequest( current_context, name)); - renderview->SendExtensionRequest(name, args_holder, + renderview->SendExtensionRequest(name, args_holder, source_url, request_id, has_callback); return v8::Undefined(); diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index a027d020..64403b0 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -4263,9 +4263,14 @@ void RenderView::OnWindowFrameChanged(gfx::Rect window_frame, void RenderView::SendExtensionRequest(const std::string& name, const ListValue& args, + const GURL& source_url, int request_id, bool has_callback) { - Send(new ViewHostMsg_ExtensionRequest(routing_id_, name, args, request_id, + Send(new ViewHostMsg_ExtensionRequest(routing_id_, + name, + args, + source_url, + request_id, has_callback)); } diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h index 963a142..ffd2ebb 100644 --- a/chrome/renderer/render_view.h +++ b/chrome/renderer/render_view.h @@ -477,7 +477,9 @@ class RenderView : public RenderWidget, void OnClearFocusedNode(); void SendExtensionRequest(const std::string& name, const ListValue& args, - int request_id, bool has_callback); + const GURL& source_url, + int request_id, + bool has_callback); void OnExtensionResponse(int request_id, bool success, const std::string& response, const std::string& error); |