diff options
-rw-r--r-- | chrome/browser/extensions/extension_function_dispatcher.cc | 4 | ||||
-rw-r--r-- | chrome/browser/external_protocol_handler.cc | 2 | ||||
-rw-r--r-- | chrome/browser/external_protocol_handler.h | 7 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents.cc | 2 |
4 files changed, 11 insertions, 4 deletions
diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc index 4959310..d22cfe6 100644 --- a/chrome/browser/extensions/extension_function_dispatcher.cc +++ b/chrome/browser/extensions/extension_function_dispatcher.cc @@ -13,6 +13,7 @@ #include "chrome/browser/browser_window.h" #include "chrome/browser/dom_ui/chrome_url_data_manager.h" #include "chrome/browser/dom_ui/dom_ui_favicon_source.h" +#include "chrome/browser/external_protocol_handler.h" #include "chrome/browser/extensions/execute_code_in_tab_function.h" #include "chrome/browser/extensions/extension_accessibility_api.h" #include "chrome/browser/extensions/extension_bookmark_manager_api.h" @@ -412,6 +413,9 @@ void ExtensionFunctionDispatcher::HandleRequest(const std::string& name, ExtensionsQuotaService* quota = service->quota_service(); if (quota->Assess(extension_id(), function, args, base::TimeTicks::Now())) { + // See crbug.com/39178. + ExternalProtocolHandler::PermitLaunchUrl(); + function->Run(); } else { render_view_host_->SendExtensionResponse(function->request_id(), false, diff --git a/chrome/browser/external_protocol_handler.cc b/chrome/browser/external_protocol_handler.cc index d8bb81d..822e1fb 100644 --- a/chrome/browser/external_protocol_handler.cc +++ b/chrome/browser/external_protocol_handler.cc @@ -180,7 +180,7 @@ void ExternalProtocolHandler::RegisterPrefs(PrefService* prefs) { } // static -void ExternalProtocolHandler::OnUserGesture() { +void ExternalProtocolHandler::PermitLaunchUrl() { DCHECK_EQ(MessageLoop::TYPE_UI, MessageLoop::current()->type()); g_accept_requests = true; } diff --git a/chrome/browser/external_protocol_handler.h b/chrome/browser/external_protocol_handler.h index d9b9592..d67a273 100644 --- a/chrome/browser/external_protocol_handler.h +++ b/chrome/browser/external_protocol_handler.h @@ -69,8 +69,11 @@ class ExternalProtocolHandler { // preferences for them do not already exist. static void PrepopulateDictionary(DictionaryValue* win_pref); - // Called when the user interacts with a web page. - static void OnUserGesture(); + // Allows LaunchUrl to proceed with launching an external protocol handler. + // This is typically triggered by a user gesture, but is also called for + // each extension API function. Note that each call to LaunchUrl resets + // the state to false (not allowed). + static void PermitLaunchUrl(); }; #endif // CHROME_BROWSER_EXTERNAL_PROTOCOL_HANDLER_H_ diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc index 0faf4fc..5ab30a2 100644 --- a/chrome/browser/tab_contents/tab_contents.cc +++ b/chrome/browser/tab_contents/tab_contents.cc @@ -1873,7 +1873,7 @@ void TabContents::OnUserGesture() { g_browser_process->download_request_limiter(); if (limiter) limiter->OnUserGesture(this); - ExternalProtocolHandler::OnUserGesture(); + ExternalProtocolHandler::PermitLaunchUrl(); controller_.OnUserGesture(); } |