Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(549)

Unified Diff: chrome/browser/external_protocol/external_protocol_handler.cc

Issue 131783012: Fix the handling of user gestures for external protocol handler dialogs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: joi and pkasting comments Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..528d21d82f801e5fff1c8c1f2cbd9d5dd756051e 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;
+// User gesture counter. This is increased when a user gesture is available, and
+// decreased when the gesture is consumed or goes out of scope. This variable
+// should only be accessed from the UI thread.
+static size_t g_consumable_user_gestures = 0;
namespace {
@@ -204,8 +204,8 @@ 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)
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ if (!g_consumable_user_gestures)
return BLOCK;
if (scheme.length() == 1) {
@@ -270,8 +270,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.
@@ -309,8 +307,12 @@ void ExternalProtocolHandler::RegisterPrefs(PrefRegistrySimple* registry) {
registry->RegisterDictionaryPref(prefs::kExcludedSchemes);
}
-// static
-void ExternalProtocolHandler::PermitLaunchUrl() {
- DCHECK(base::MessageLoopForUI::IsCurrent());
- g_accept_requests = true;
+ExternalProtocolHandler::ScopedUserGesture::ScopedUserGesture() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ g_consumable_user_gestures++;
+}
+
+ExternalProtocolHandler::ScopedUserGesture::~ScopedUserGesture() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ g_consumable_user_gestures--;
}

Powered by Google App Engine
This is Rietveld 408576698