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

Side by Side Diff: chrome/browser/android/data_usage/data_use_ui_tab_model.cc

Issue 1443683002: Notify DataUseTabModel of navigations and tab closures (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments, Using two weak ptrs now. Created 5 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 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/android/data_usage/data_use_ui_tab_model.h" 5 #include "chrome/browser/android/data_usage/data_use_ui_tab_model.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
11 #include "base/single_thread_task_runner.h" 11 #include "base/single_thread_task_runner.h"
12 #include "content/public/browser/browser_thread.h" 12 #include "content/public/browser/browser_thread.h"
13 #include "url/gurl.h" 13 #include "url/gurl.h"
14 14
15 namespace chrome { 15 namespace chrome {
16 16
17 namespace android { 17 namespace android {
18 18
19 // Notifies |data_use_tab_model| of navigation event on IO thread.
20 void OnNavigationEventOnIOThread(
sclittle 2015/11/16 23:13:42 Can these functions be moved to an anonymous names
tbansal1 2015/11/17 21:12:33 Done.
21 base::WeakPtr<DataUseTabModel> data_use_tab_model,
22 int32_t tab_id,
23 DataUseTabModel::TransitionType transition,
24 const GURL gurl) {
25 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
26
27 if (!data_use_tab_model)
28 return;
29 data_use_tab_model->OnNavigationEvent(tab_id, transition, gurl);
30 }
31
32 // Notifies |data_use_tab_model| of tab closure on IO thread.
33 void OnTabCloseEventOnIOThread(
34 base::WeakPtr<DataUseTabModel> data_use_tab_model,
35 int32_t tab_id) {
36 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
37
38 if (!data_use_tab_model)
39 return;
40 data_use_tab_model->OnTabCloseEvent(tab_id);
41 }
42
19 DataUseUITabModel::DataUseUITabModel( 43 DataUseUITabModel::DataUseUITabModel(
20 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner) 44 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner)
21 : io_task_runner_(io_task_runner) { 45 : registered_as_observer_(false), io_task_runner_(io_task_runner) {
22 DCHECK(io_task_runner_); 46 DCHECK(io_task_runner_);
23 } 47 }
24 48
25 DataUseUITabModel::~DataUseUITabModel() {} 49 DataUseUITabModel::~DataUseUITabModel() {
50 if (registered_as_observer_ && ui_data_use_tab_model_) {
51 registered_as_observer_ = false;
52 ui_data_use_tab_model_->RemoveObserver(this);
53 }
54 }
26 55
27 void DataUseUITabModel::ReportBrowserNavigation( 56 void DataUseUITabModel::ReportBrowserNavigation(
28 const GURL& gurl, 57 const GURL& gurl,
29 ui::PageTransition page_transition, 58 ui::PageTransition page_transition,
30 int32_t tab_id) const { 59 int32_t tab_id) const {
31 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 60 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
32 DCHECK(thread_checker_.CalledOnValidThread()); 61 DCHECK(thread_checker_.CalledOnValidThread());
33 62
34 // TODO(tbansal): Post to DataUseTabModel on IO thread. 63 DataUseTabModel::TransitionType transition_type;
64
65 if (ConvertTransitionType(page_transition, &transition_type)) {
66 io_task_runner_->PostTask(
67 FROM_HERE,
68 base::Bind(&OnNavigationEventOnIOThread, io_data_use_tab_model_, tab_id,
69 transition_type, gurl));
70 }
35 } 71 }
36 72
37 void DataUseUITabModel::ReportTabClosure(int32_t tab_id) { 73 void DataUseUITabModel::ReportTabClosure(int32_t tab_id) {
38 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 74 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
39 DCHECK(thread_checker_.CalledOnValidThread()); 75 DCHECK(thread_checker_.CalledOnValidThread());
40 76
41 // TODO(tbansal): Post to DataUseTabModel on IO thread. 77 io_task_runner_->PostTask(
78 FROM_HERE,
79 base::Bind(&OnTabCloseEventOnIOThread, io_data_use_tab_model_, tab_id));
42 80
43 // Clear out local state. 81 // Clear out local state.
44 TabEvents::iterator it = tab_events_.find(tab_id); 82 TabEvents::iterator it = tab_events_.find(tab_id);
45 if (it == tab_events_.end()) 83 if (it == tab_events_.end())
46 return; 84 return;
47 tab_events_.erase(it); 85 tab_events_.erase(it);
48 } 86 }
49 87
50 void DataUseUITabModel::OnTrackingStarted(int32_t tab_id) { 88 void DataUseUITabModel::NotifyTrackingStarting(int32_t tab_id) {
51 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 89 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
52 DCHECK(thread_checker_.CalledOnValidThread()); 90 DCHECK(thread_checker_.CalledOnValidThread());
53 91
54 if (MaybeCreateTabEvent(tab_id, DATA_USE_TRACKING_STARTED)) 92 if (MaybeCreateTabEvent(tab_id, DATA_USE_TRACKING_STARTED))
55 return; 93 return;
56 // Since tracking started before the UI could indicate that it ended, it is 94 // Since tracking started before the UI could indicate that it ended, it is
57 // not useful for UI to show that it started again. 95 // not useful for UI to show that it started again.
58 RemoveTabEvent(tab_id, DATA_USE_TRACKING_ENDED); 96 RemoveTabEvent(tab_id, DATA_USE_TRACKING_ENDED);
59 } 97 }
60 98
61 void DataUseUITabModel::OnTrackingEnded(int32_t tab_id) { 99 void DataUseUITabModel::NotifyTrackingEnding(int32_t tab_id) {
62 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 100 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
63 DCHECK(thread_checker_.CalledOnValidThread()); 101 DCHECK(thread_checker_.CalledOnValidThread());
64 102
65 if (MaybeCreateTabEvent(tab_id, DATA_USE_TRACKING_ENDED)) 103 if (MaybeCreateTabEvent(tab_id, DATA_USE_TRACKING_ENDED))
66 return; 104 return;
67 // Since tracking ended before the UI could indicate that it stated, it is not 105 // Since tracking ended before the UI could indicate that it stated, it is not
68 // useful for UI to show that it ended. 106 // useful for UI to show that it ended.
69 RemoveTabEvent(tab_id, DATA_USE_TRACKING_STARTED); 107 RemoveTabEvent(tab_id, DATA_USE_TRACKING_STARTED);
70 } 108 }
71 109
(...skipping 12 matching lines...) Expand all
84 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 122 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
85 DCHECK(thread_checker_.CalledOnValidThread()); 123 DCHECK(thread_checker_.CalledOnValidThread());
86 124
87 TabEvents::iterator it = tab_events_.find(tab_id); 125 TabEvents::iterator it = tab_events_.find(tab_id);
88 if (it == tab_events_.end()) 126 if (it == tab_events_.end())
89 return false; 127 return false;
90 128
91 return RemoveTabEvent(tab_id, DATA_USE_TRACKING_ENDED); 129 return RemoveTabEvent(tab_id, DATA_USE_TRACKING_ENDED);
92 } 130 }
93 131
132 void DataUseUITabModel::SetIODataUseTabModel(
133 base::WeakPtr<DataUseTabModel> io_data_use_tab_model) {
134 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
135 DCHECK(thread_checker_.CalledOnValidThread());
136
137 io_data_use_tab_model_ = io_data_use_tab_model;
138 }
139
140 void DataUseUITabModel::SetUIDataUseTabModel(
141 base::WeakPtr<DataUseTabModel> ui_data_use_tab_model) {
142 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
143 DCHECK(thread_checker_.CalledOnValidThread());
144
145 ui_data_use_tab_model_ = ui_data_use_tab_model;
146 if (registered_as_observer_ || !ui_data_use_tab_model_)
147 return;
148 registered_as_observer_ = true;
149 ui_data_use_tab_model_->AddObserver(this);
150 }
151
94 bool DataUseUITabModel::MaybeCreateTabEvent(int32_t tab_id, 152 bool DataUseUITabModel::MaybeCreateTabEvent(int32_t tab_id,
95 DataUseTrackingEvent event) { 153 DataUseTrackingEvent event) {
96 TabEvents::iterator it = tab_events_.find(tab_id); 154 TabEvents::iterator it = tab_events_.find(tab_id);
97 if (it == tab_events_.end()) { 155 if (it == tab_events_.end()) {
98 tab_events_.insert(std::make_pair(tab_id, event)); 156 tab_events_.insert(std::make_pair(tab_id, event));
99 return true; 157 return true;
100 } 158 }
101 return false; 159 return false;
102 } 160 }
103 161
104 bool DataUseUITabModel::RemoveTabEvent(int32_t tab_id, 162 bool DataUseUITabModel::RemoveTabEvent(int32_t tab_id,
105 DataUseTrackingEvent event) { 163 DataUseTrackingEvent event) {
106 TabEvents::iterator it = tab_events_.find(tab_id); 164 TabEvents::iterator it = tab_events_.find(tab_id);
107 DCHECK(it != tab_events_.end()); 165 DCHECK(it != tab_events_.end());
108 if (it->second == event) { 166 if (it->second == event) {
109 tab_events_.erase(it); 167 tab_events_.erase(it);
110 return true; 168 return true;
111 } 169 }
112 return false; 170 return false;
113 } 171 }
114 172
173 bool DataUseUITabModel::ConvertTransitionType(
174 ui::PageTransition page_transition,
175 DataUseTabModel::TransitionType* transition_type) const {
176 if (!ui::PageTransitionIsValidType(page_transition) ||
177 !ui::PageTransitionIsMainFrame(page_transition) ||
178 !ui::PageTransitionIsNewNavigation(page_transition)) {
179 return false;
180 }
181
182 const int32_t mask = 0xFFFFFFFF ^ ui::PAGE_TRANSITION_QUALIFIER_MASK;
183
184 switch (page_transition & mask) {
185 case ui::PAGE_TRANSITION_LINK:
186 if ((page_transition & ui::PAGE_TRANSITION_FROM_API) != 0) {
187 // Clicking on bookmarks.
188 *transition_type = DataUseTabModel::TRANSITION_BOOKMARK;
189 return true;
190 }
191 return false; // Newtab, clicking on a link.
192 case ui::PAGE_TRANSITION_TYPED:
193 *transition_type = DataUseTabModel::TRANSITION_OMNIBOX_NAVIGATION;
194 return true;
195 case ui::PAGE_TRANSITION_AUTO_BOOKMARK:
196 // Auto bookmark from newtab page.
197 *transition_type = DataUseTabModel::TRANSITION_BOOKMARK;
198 return true;
199 case ui::PAGE_TRANSITION_AUTO_TOPLEVEL:
200 // History menu.
201 *transition_type = DataUseTabModel::TRANSITION_HISTORY_ITEM;
202 return true;
203 case ui::PAGE_TRANSITION_GENERATED:
204 // Omnibox search (e.g., searching for "tacos").
205 *transition_type = DataUseTabModel::TRANSITION_OMNIBOX_SEARCH;
206 return true;
207 case ui::PAGE_TRANSITION_RELOAD:
208 // Restored tabs.
209 return false;
210 default:
211 return false;
212 }
213 }
214
115 } // namespace android 215 } // namespace android
116 216
117 } // namespace chrome 217 } // namespace chrome
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698