Index: chrome/browser/ui/exclusive_access/exclusive_access_controller_base.cc |
diff --git a/chrome/browser/google/google_search_counter_android.cc b/chrome/browser/ui/exclusive_access/exclusive_access_controller_base.cc |
similarity index 13% |
copy from chrome/browser/google/google_search_counter_android.cc |
copy to chrome/browser/ui/exclusive_access/exclusive_access_controller_base.cc |
index 17699bee30e8f7293949ffbe3dee06a5640810bf..db8a243cad56fdaba299a21043d67b3d13d737eb 100644 |
--- a/chrome/browser/google/google_search_counter_android.cc |
+++ b/chrome/browser/ui/exclusive_access/exclusive_access_controller_base.cc |
@@ -1,54 +1,93 @@ |
-// Copyright (c) 2014 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2015 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "chrome/browser/google/google_search_counter_android.h" |
+#include "chrome/browser/ui/exclusive_access/exclusive_access_controller_base.h" |
-#include "base/logging.h" |
-#include "chrome/browser/google/google_search_counter.h" |
-#include "chrome/browser/prerender/prerender_manager.h" |
-#include "chrome/browser/prerender/prerender_manager_factory.h" |
-#include "components/google/core/browser/google_search_metrics.h" |
+#include "chrome/browser/chrome_notification_types.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/ui/browser.h" |
+#include "chrome/browser/ui/browser_window.h" |
#include "content/public/browser/navigation_details.h" |
#include "content/public/browser/navigation_entry.h" |
#include "content/public/browser/notification_service.h" |
-#include "content/public/browser/notification_types.h" |
+#include "content/public/browser/web_contents.h" |
-GoogleSearchCounterAndroid::GoogleSearchCounterAndroid(Profile* profile) |
- : profile_(profile) { |
- // We always listen for all COMMITTED navigations from all sources, as any |
- // one of them could be a navigation of interest. |
- registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
- content::NotificationService::AllSources()); |
+using content::WebContents; |
+ |
+ExclusiveAccessControllerBase::ExclusiveAccessControllerBase( |
+ ExclusiveAccessManager* manager, |
+ Browser* browser) |
+ : manager_(manager), |
+ browser_(browser), |
+ profile_(browser->profile()), |
+ tab_with_exclusive_access_(nullptr) { |
+ DCHECK(profile_); |
} |
-GoogleSearchCounterAndroid::~GoogleSearchCounterAndroid() { |
+ExclusiveAccessControllerBase::~ExclusiveAccessControllerBase() { |
} |
-void GoogleSearchCounterAndroid::ProcessCommittedEntry( |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- GoogleSearchCounter* counter = GoogleSearchCounter::GetInstance(); |
- DCHECK(counter); |
- if (!counter->ShouldRecordCommittedDetails(details)) |
- return; |
- |
- const content::NavigationEntry& entry = |
- *content::Details<content::LoadCommittedDetails>(details)->entry; |
- prerender::PrerenderManager* prerender_manager = |
- prerender::PrerenderManagerFactory::GetForProfile(profile_); |
- // |prerender_manager| is NULL when prerendering is disabled. |
- bool prerender_enabled = |
- prerender_manager ? prerender_manager->IsEnabled() : false; |
- counter->search_metrics()->RecordAndroidGoogleSearch( |
- counter->GetGoogleSearchAccessPointForSearchNavEntry(entry), |
- prerender_enabled); |
-} |
- |
-void GoogleSearchCounterAndroid::Observe( |
+GURL ExclusiveAccessControllerBase::GetExclusiveAccessBubbleURL() const { |
+ return manager_->GetExclusiveAccessBubbleURL(); |
+} |
+ |
+GURL ExclusiveAccessControllerBase::GetURLForExclusiveAccessBubble() const { |
+ if (tab_with_exclusive_access_) |
+ return tab_with_exclusive_access_->GetURL(); |
+ return GURL(); |
+} |
+ |
+void ExclusiveAccessControllerBase::OnTabDeactivated( |
+ WebContents* web_contents) { |
+ if (web_contents == tab_with_exclusive_access_) |
+ ExitExclusiveAccessIfNecessary(); |
+} |
+ |
+void ExclusiveAccessControllerBase::OnTabDetachedFromView( |
+ WebContents* old_contents) { |
+ // Derived class will have to implement if necessary. |
+} |
+ |
+void ExclusiveAccessControllerBase::OnTabClosing(WebContents* web_contents) { |
+ if (web_contents == tab_with_exclusive_access_) { |
+ ExitExclusiveAccessIfNecessary(); |
+ |
+ // The call to exit exclusive access may result in asynchronous notification |
+ // of state change (e.g. fullscreen change on Linux). We don't want to rely |
+ // on it to call NotifyTabExclusiveAccessLost(), because at that point |
+ // |tab_with_exclusive_access_| may not be valid. Instead, we call it here |
+ // to clean up exclusive access tab related state. |
+ NotifyTabExclusiveAccessLost(); |
+ } |
+} |
+ |
+void ExclusiveAccessControllerBase::Observe( |
int type, |
const content::NotificationSource& source, |
const content::NotificationDetails& details) { |
DCHECK_EQ(content::NOTIFICATION_NAV_ENTRY_COMMITTED, type); |
- ProcessCommittedEntry(source, details); |
+ if (content::Details<content::LoadCommittedDetails>(details) |
+ ->is_navigation_to_different_page()) |
+ ExitExclusiveAccessIfNecessary(); |
+} |
+ |
+void ExclusiveAccessControllerBase::SetTabWithExclusiveAccess( |
+ WebContents* tab) { |
+ // Tab should never be replaced with another tab, or |
+ // UpdateNotificationRegistrations would need updating. |
+ DCHECK(tab_with_exclusive_access_ == tab || |
+ tab_with_exclusive_access_ == nullptr || tab == nullptr); |
+ tab_with_exclusive_access_ = tab; |
+ UpdateNotificationRegistrations(); |
+} |
+ |
+void ExclusiveAccessControllerBase::UpdateNotificationRegistrations() { |
+ if (tab_with_exclusive_access_ && registrar_.IsEmpty()) { |
+ registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
+ content::Source<content::NavigationController>( |
+ &tab_with_exclusive_access_->GetController())); |
+ } else if (!tab_with_exclusive_access_ && !registrar_.IsEmpty()) { |
+ registrar_.RemoveAll(); |
+ } |
} |