OLD | NEW |
---|---|
1 // Copyright (c) 2014 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/google/google_search_counter_android.h" | 5 #include "chrome/browser/ui/exclusive_access/exclusive_access_controller_base.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "chrome/browser/chrome_notification_types.h" |
8 #include "chrome/browser/google/google_search_counter.h" | 8 #include "chrome/browser/profiles/profile.h" |
9 #include "chrome/browser/prerender/prerender_manager.h" | 9 #include "chrome/browser/ui/browser.h" |
10 #include "chrome/browser/prerender/prerender_manager_factory.h" | 10 #include "chrome/browser/ui/browser_window.h" |
11 #include "components/google/core/browser/google_search_metrics.h" | |
12 #include "content/public/browser/navigation_details.h" | 11 #include "content/public/browser/navigation_details.h" |
13 #include "content/public/browser/navigation_entry.h" | 12 #include "content/public/browser/navigation_entry.h" |
14 #include "content/public/browser/notification_service.h" | 13 #include "content/public/browser/notification_service.h" |
15 #include "content/public/browser/notification_types.h" | 14 #include "content/public/browser/web_contents.h" |
16 | 15 |
17 GoogleSearchCounterAndroid::GoogleSearchCounterAndroid(Profile* profile) | 16 using content::WebContents; |
18 : profile_(profile) { | 17 |
19 // We always listen for all COMMITTED navigations from all sources, as any | 18 ExclusiveAccessControllerBase::ExclusiveAccessControllerBase( |
20 // one of them could be a navigation of interest. | 19 ExclusiveAccessControllerManager* manager, |
21 registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, | 20 Browser* browser) |
22 content::NotificationService::AllSources()); | 21 : manager_(manager), |
22 browser_(browser), | |
23 window_(browser->window()), | |
24 profile_(browser->profile()), | |
25 tab_with_exclusive_access_(nullptr) { | |
26 DCHECK(window_); | |
27 DCHECK(profile_); | |
23 } | 28 } |
24 | 29 |
25 GoogleSearchCounterAndroid::~GoogleSearchCounterAndroid() { | 30 ExclusiveAccessControllerBase::~ExclusiveAccessControllerBase() { |
26 } | 31 } |
27 | 32 |
28 void GoogleSearchCounterAndroid::ProcessCommittedEntry( | 33 GURL ExclusiveAccessControllerBase::GetExclusiveAccessBubbleURL() const { |
29 const content::NotificationSource& source, | 34 return manager_->GetExclusiveAccessBubbleURL(); |
30 const content::NotificationDetails& details) { | |
31 GoogleSearchCounter* counter = GoogleSearchCounter::GetInstance(); | |
32 DCHECK(counter); | |
33 if (!counter->ShouldRecordCommittedDetails(details)) | |
34 return; | |
35 | |
36 const content::NavigationEntry& entry = | |
37 *content::Details<content::LoadCommittedDetails>(details)->entry; | |
38 prerender::PrerenderManager* prerender_manager = | |
39 prerender::PrerenderManagerFactory::GetForProfile(profile_); | |
40 // |prerender_manager| is NULL when prerendering is disabled. | |
41 bool prerender_enabled = | |
42 prerender_manager ? prerender_manager->IsEnabled() : false; | |
43 counter->search_metrics()->RecordAndroidGoogleSearch( | |
44 counter->GetGoogleSearchAccessPointForSearchNavEntry(entry), | |
45 prerender_enabled); | |
46 } | 35 } |
47 | 36 |
48 void GoogleSearchCounterAndroid::Observe( | 37 GURL ExclusiveAccessControllerBase::GetURLForExclusiveAccessBubble() const { |
38 if (tab_with_exclusive_access_) | |
39 return tab_with_exclusive_access_->GetURL(); | |
40 return GURL(); | |
41 } | |
42 | |
43 void ExclusiveAccessControllerBase::OnTabDeactivated( | |
44 WebContents* web_contents) { | |
45 if (web_contents == tab_with_exclusive_access_) | |
46 ExitExclusiveAccessIfNecessary(); | |
47 } | |
48 | |
49 void ExclusiveAccessControllerBase::OnTabDetachedFromView( | |
50 WebContents* old_contents) { | |
51 // Derived class will to actually implement if necessary. | |
scheib
2015/01/14 22:37:59
"will have to implement if"
Sriram
2015/01/15 00:34:28
Done.
| |
52 } | |
53 | |
54 void ExclusiveAccessControllerBase::OnTabClosing( | |
55 content::WebContents* web_contents) { | |
56 if (web_contents == tab_with_exclusive_access_) { | |
57 ExitExclusiveAccessIfNecessary(); | |
58 | |
59 // The call to exit exclusive access may result in asynchronous notification | |
60 // of state change (e.g. fullscreen change on Linux). We don't want to rely | |
61 // on it to call NotifyTabOfExitIfNecessary(), because at that point | |
62 // |tab_with_exclusive_access_| may not be valid. Instead, we call it here | |
63 // to clean up tab fullscreen related state. | |
64 NotifyTabOfExclusiveAccessChange(); | |
65 } | |
66 } | |
67 | |
68 void ExclusiveAccessControllerBase::Observe( | |
49 int type, | 69 int type, |
50 const content::NotificationSource& source, | 70 const content::NotificationSource& source, |
51 const content::NotificationDetails& details) { | 71 const content::NotificationDetails& details) { |
52 DCHECK_EQ(content::NOTIFICATION_NAV_ENTRY_COMMITTED, type); | 72 DCHECK_EQ(content::NOTIFICATION_NAV_ENTRY_COMMITTED, type); |
53 ProcessCommittedEntry(source, details); | 73 if (content::Details<content::LoadCommittedDetails>(details) |
74 ->is_navigation_to_different_page()) | |
75 ExitExclusiveAccessIfNecessary(); | |
54 } | 76 } |
77 | |
78 void ExclusiveAccessControllerBase::SetTabWithExclusiveAccess( | |
79 WebContents* tab) { | |
80 tab_with_exclusive_access_ = tab; | |
81 UpdateNotificationRegistrations(); | |
82 } | |
83 | |
84 WebContents* ExclusiveAccessControllerBase::GetExclusiveAccessTab() const { | |
85 return tab_with_exclusive_access_; | |
86 } | |
87 | |
88 ExclusiveAccessControllerManager* ExclusiveAccessControllerBase::GetManager() | |
89 const { | |
90 return manager_; | |
91 } | |
92 | |
93 Browser* ExclusiveAccessControllerBase::GetBrowser() const { | |
94 return browser_; | |
95 } | |
96 | |
97 Profile* ExclusiveAccessControllerBase::GetProfile() const { | |
98 return profile_; | |
99 } | |
100 | |
101 BrowserWindow* ExclusiveAccessControllerBase::GetWindow() const { | |
102 return window_; | |
103 } | |
104 | |
105 void ExclusiveAccessControllerBase::UpdateExclusiveAccessExitBubbleContent() { | |
106 manager_->UpdateExclusiveAccessExitBubbleContent(); | |
scheib
2015/01/14 22:37:59
For any Base method that just calls to a manager m
Sriram
2015/01/15 00:34:28
Done.
| |
107 } | |
108 | |
109 ExclusiveAccessBubbleType | |
110 ExclusiveAccessControllerBase::GetExclusiveAccessExitBubbleType() { | |
111 return manager_->GetExclusiveAccessExitBubbleType(); | |
112 } | |
113 | |
114 void ExclusiveAccessControllerBase::UpdateNotificationRegistrations() { | |
115 if (tab_with_exclusive_access_ && registrar_.IsEmpty()) { | |
116 registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, | |
117 content::Source<content::NavigationController>( | |
118 &tab_with_exclusive_access_->GetController())); | |
119 } else if (!tab_with_exclusive_access_ && !registrar_.IsEmpty()) { | |
120 registrar_.RemoveAll(); | |
121 } | |
122 } | |
OLD | NEW |