OLD | NEW |
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 "content/public/browser/browser_thread.h" | 10 #include "content/public/browser/browser_thread.h" |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 | 49 |
50 // Clear out local state. | 50 // Clear out local state. |
51 TabEvents::iterator it = tab_events_.find(tab_id); | 51 TabEvents::iterator it = tab_events_.find(tab_id); |
52 if (it == tab_events_.end()) | 52 if (it == tab_events_.end()) |
53 return; | 53 return; |
54 tab_events_.erase(it); | 54 tab_events_.erase(it); |
55 } | 55 } |
56 | 56 |
57 void DataUseUITabModel::ReportCustomTabInitialNavigation( | 57 void DataUseUITabModel::ReportCustomTabInitialNavigation( |
58 SessionID::id_type tab_id, | 58 SessionID::id_type tab_id, |
59 const std::string& url, | 59 const std::string& package_name, |
60 const std::string& package_name) { | 60 const std::string& url) { |
61 DCHECK(thread_checker_.CalledOnValidThread()); | 61 DCHECK(thread_checker_.CalledOnValidThread()); |
62 | 62 |
63 if (tab_id <= 0) | 63 if (tab_id <= 0) |
64 return; | 64 return; |
65 | 65 |
66 if (data_use_tab_model_) { | 66 if (data_use_tab_model_) { |
67 data_use_tab_model_->OnNavigationEvent( | 67 data_use_tab_model_->OnNavigationEvent( |
68 tab_id, DataUseTabModel::TRANSITION_CUSTOM_TAB, GURL(url), | 68 tab_id, DataUseTabModel::TRANSITION_CUSTOM_TAB, GURL(url), |
69 package_name); | 69 package_name); |
70 } | 70 } |
(...skipping 11 matching lines...) Expand all Loading... |
82 } | 82 } |
83 | 83 |
84 base::WeakPtr<DataUseUITabModel> DataUseUITabModel::GetWeakPtr() { | 84 base::WeakPtr<DataUseUITabModel> DataUseUITabModel::GetWeakPtr() { |
85 DCHECK(thread_checker_.CalledOnValidThread()); | 85 DCHECK(thread_checker_.CalledOnValidThread()); |
86 return weak_factory_.GetWeakPtr(); | 86 return weak_factory_.GetWeakPtr(); |
87 } | 87 } |
88 | 88 |
89 void DataUseUITabModel::NotifyTrackingStarting(SessionID::id_type tab_id) { | 89 void DataUseUITabModel::NotifyTrackingStarting(SessionID::id_type tab_id) { |
90 DCHECK(thread_checker_.CalledOnValidThread()); | 90 DCHECK(thread_checker_.CalledOnValidThread()); |
91 | 91 |
| 92 // Clear out the previous state if is equal to DATA_USE_CONTINUE_CLICKED. This |
| 93 // ensures that MaybeCreateTabEvent can successfully insert |tab_id| into the |
| 94 // map, and update its value to DATA_USE_TRACKING_STARTED. |
| 95 RemoveTabEvent(tab_id, DATA_USE_CONTINUE_CLICKED); |
| 96 |
92 if (MaybeCreateTabEvent(tab_id, DATA_USE_TRACKING_STARTED)) | 97 if (MaybeCreateTabEvent(tab_id, DATA_USE_TRACKING_STARTED)) |
93 return; | 98 return; |
94 // Since tracking started before the UI could indicate that it ended, it is | 99 // Since tracking started before the UI could indicate that it ended, it is |
95 // not useful for UI to show that it started again. | 100 // not useful for UI to show that it started again. |
96 RemoveTabEvent(tab_id, DATA_USE_TRACKING_ENDED); | 101 RemoveTabEvent(tab_id, DATA_USE_TRACKING_ENDED); |
97 } | 102 } |
98 | 103 |
99 void DataUseUITabModel::NotifyTrackingEnding(SessionID::id_type tab_id) { | 104 void DataUseUITabModel::NotifyTrackingEnding(SessionID::id_type tab_id) { |
100 DCHECK(thread_checker_.CalledOnValidThread()); | 105 DCHECK(thread_checker_.CalledOnValidThread()); |
101 | 106 |
102 if (MaybeCreateTabEvent(tab_id, DATA_USE_TRACKING_ENDED)) | 107 if (MaybeCreateTabEvent(tab_id, DATA_USE_TRACKING_ENDED)) |
103 return; | 108 return; |
104 // Since tracking ended before the UI could indicate that it stated, it is not | 109 // Since tracking ended before the UI could indicate that it stated, it is not |
105 // useful for UI to show that it ended. | 110 // useful for UI to show that it ended. |
106 RemoveTabEvent(tab_id, DATA_USE_TRACKING_STARTED); | 111 RemoveTabEvent(tab_id, DATA_USE_TRACKING_STARTED); |
| 112 |
| 113 // If the user clicked "Continue" before this navigation, then |tab_id| value |
| 114 // would be set to DATA_USE_CONTINUE_CLICKED. In that case, |
| 115 // MaybeCreateTabEvent above would have returned false. So, removing tab_id |
| 116 // from the map below ensures that no UI is shown on the tab. This also |
| 117 // resets the state of |tab_id|, so that dialog box or snackbar may be shown |
| 118 // for future navigations. |
| 119 RemoveTabEvent(tab_id, DATA_USE_CONTINUE_CLICKED); |
107 } | 120 } |
108 | 121 |
109 bool DataUseUITabModel::HasDataUseTrackingStarted(SessionID::id_type tab_id) { | 122 bool DataUseUITabModel::CheckAndResetDataUseTrackingStarted( |
| 123 SessionID::id_type tab_id) { |
110 DCHECK(thread_checker_.CalledOnValidThread()); | 124 DCHECK(thread_checker_.CalledOnValidThread()); |
111 | 125 |
112 TabEvents::iterator it = tab_events_.find(tab_id); | 126 TabEvents::iterator it = tab_events_.find(tab_id); |
113 if (it == tab_events_.end()) | 127 if (it == tab_events_.end()) |
114 return false; | 128 return false; |
115 | 129 |
116 return RemoveTabEvent(tab_id, DATA_USE_TRACKING_STARTED); | 130 return RemoveTabEvent(tab_id, DATA_USE_TRACKING_STARTED); |
117 } | 131 } |
118 | 132 |
119 bool DataUseUITabModel::HasDataUseTrackingEnded(SessionID::id_type tab_id) { | 133 bool DataUseUITabModel::WouldDataUseTrackingEnd( |
| 134 const std::string& url, |
| 135 int page_transition, |
| 136 SessionID::id_type tab_id) const { |
| 137 DCHECK(thread_checker_.CalledOnValidThread()); |
| 138 |
| 139 TabEvents::const_iterator it = tab_events_.find(tab_id); |
| 140 |
| 141 if (it != tab_events_.end() && it->second == DATA_USE_CONTINUE_CLICKED) |
| 142 return false; |
| 143 |
| 144 DataUseTabModel::TransitionType transition_type; |
| 145 |
| 146 if (!ConvertTransitionType(ui::PageTransitionFromInt(page_transition), |
| 147 &transition_type)) { |
| 148 return false; |
| 149 } |
| 150 |
| 151 if (!data_use_tab_model_) |
| 152 return false; |
| 153 |
| 154 return data_use_tab_model_->WouldNavigationEventEndTracking( |
| 155 tab_id, transition_type, GURL(url)); |
| 156 } |
| 157 |
| 158 void DataUseUITabModel::UserClickedContinueOnDialogBox( |
| 159 SessionID::id_type tab_id) { |
120 DCHECK(thread_checker_.CalledOnValidThread()); | 160 DCHECK(thread_checker_.CalledOnValidThread()); |
121 | 161 |
122 TabEvents::iterator it = tab_events_.find(tab_id); | 162 TabEvents::iterator it = tab_events_.find(tab_id); |
| 163 if (it != tab_events_.end()) |
| 164 tab_events_.erase(it); |
| 165 |
| 166 MaybeCreateTabEvent(tab_id, DATA_USE_CONTINUE_CLICKED); |
| 167 } |
| 168 |
| 169 bool DataUseUITabModel::CheckAndResetDataUseTrackingEnded( |
| 170 SessionID::id_type tab_id) { |
| 171 DCHECK(thread_checker_.CalledOnValidThread()); |
| 172 |
| 173 TabEvents::iterator it = tab_events_.find(tab_id); |
123 if (it == tab_events_.end()) | 174 if (it == tab_events_.end()) |
124 return false; | 175 return false; |
125 | 176 |
126 return RemoveTabEvent(tab_id, DATA_USE_TRACKING_ENDED); | 177 return RemoveTabEvent(tab_id, DATA_USE_TRACKING_ENDED); |
127 } | 178 } |
128 | 179 |
129 bool DataUseUITabModel::MaybeCreateTabEvent(SessionID::id_type tab_id, | 180 bool DataUseUITabModel::MaybeCreateTabEvent(SessionID::id_type tab_id, |
130 DataUseTrackingEvent event) { | 181 DataUseTrackingEvent event) { |
131 DCHECK(thread_checker_.CalledOnValidThread()); | 182 DCHECK(thread_checker_.CalledOnValidThread()); |
132 return tab_events_.insert(std::make_pair(tab_id, event)).second; | 183 return tab_events_.insert(std::make_pair(tab_id, event)).second; |
133 } | 184 } |
134 | 185 |
135 bool DataUseUITabModel::RemoveTabEvent(SessionID::id_type tab_id, | 186 bool DataUseUITabModel::RemoveTabEvent(SessionID::id_type tab_id, |
136 DataUseTrackingEvent event) { | 187 DataUseTrackingEvent event) { |
137 DCHECK(thread_checker_.CalledOnValidThread()); | 188 DCHECK(thread_checker_.CalledOnValidThread()); |
138 TabEvents::iterator it = tab_events_.find(tab_id); | 189 TabEvents::iterator it = tab_events_.find(tab_id); |
139 DCHECK(it != tab_events_.end()); | 190 if (it == tab_events_.end()) |
| 191 return false; |
| 192 |
140 if (it->second == event) { | 193 if (it->second == event) { |
141 tab_events_.erase(it); | 194 tab_events_.erase(it); |
142 return true; | 195 return true; |
143 } | 196 } |
144 return false; | 197 return false; |
145 } | 198 } |
146 | 199 |
147 bool DataUseUITabModel::ConvertTransitionType( | 200 bool DataUseUITabModel::ConvertTransitionType( |
148 ui::PageTransition page_transition, | 201 ui::PageTransition page_transition, |
149 DataUseTabModel::TransitionType* transition_type) const { | 202 DataUseTabModel::TransitionType* transition_type) const { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 } | 244 } |
192 return false; | 245 return false; |
193 default: | 246 default: |
194 return false; | 247 return false; |
195 } | 248 } |
196 } | 249 } |
197 | 250 |
198 } // namespace android | 251 } // namespace android |
199 | 252 |
200 } // namespace chrome | 253 } // namespace chrome |
OLD | NEW |