Index: chrome/browser/external_protocol/external_protocol_handler.cc |
diff --git a/chrome/browser/external_protocol/external_protocol_handler.cc b/chrome/browser/external_protocol/external_protocol_handler.cc |
index b414261cb32dd576f655e6e8529eba46d817e917..25ca460e5247f5ceb01838ba080bbc9322e1b688 100644 |
--- a/chrome/browser/external_protocol/external_protocol_handler.cc |
+++ b/chrome/browser/external_protocol/external_protocol_handler.cc |
@@ -27,10 +27,10 @@ |
using content::BrowserThread; |
-// Whether we accept requests for launching external protocols. This is set to |
-// false every time an external protocol is requested, and set back to true on |
-// each user gesture. This variable should only be accessed from the UI thread. |
-static bool g_accept_requests = true; |
+// Whether there is an existing user gesture. A user gesture is required to |
+// launch external protocols. This variable should only be accessed from the UI |
+// thread. |
+static bool g_user_gesture = false; |
namespace { |
@@ -204,8 +204,7 @@ void ExternalProtocolHandler::PrepopulateDictionary( |
// static |
ExternalProtocolHandler::BlockState ExternalProtocolHandler::GetBlockState( |
const std::string& scheme) { |
- // If we are being carpet bombed, block the request. |
- if (!g_accept_requests) |
+ if (!g_user_gesture) |
return BLOCK; |
if (scheme.length() == 1) { |
@@ -270,8 +269,6 @@ void ExternalProtocolHandler::LaunchUrlWithDelegate(const GURL& url, |
return; |
} |
- g_accept_requests = false; |
- |
// The worker creates tasks with references to itself and puts them into |
// message loops. When no tasks are left it will delete the observer and |
// eventually be deleted itself. |
@@ -310,7 +307,13 @@ void ExternalProtocolHandler::RegisterPrefs(PrefRegistrySimple* registry) { |
} |
// static |
-void ExternalProtocolHandler::PermitLaunchUrl() { |
- DCHECK(base::MessageLoopForUI::IsCurrent()); |
- g_accept_requests = true; |
+void ExternalProtocolHandler::EnableUserGesture() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ g_user_gesture = true; |
+} |
+ |
+// static |
+void ExternalProtocolHandler::DisableUserGesture() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ g_user_gesture = false; |
} |