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::HasDataUseTrackingStarted(SessionID::id_type tab_id) { |
110 DCHECK(thread_checker_.CalledOnValidThread()); | 123 DCHECK(thread_checker_.CalledOnValidThread()); |
111 | 124 |
112 TabEvents::iterator it = tab_events_.find(tab_id); | 125 TabEvents::iterator it = tab_events_.find(tab_id); |
113 if (it == tab_events_.end()) | 126 if (it == tab_events_.end()) |
114 return false; | 127 return false; |
115 | 128 |
116 return RemoveTabEvent(tab_id, DATA_USE_TRACKING_STARTED); | 129 return RemoveTabEvent(tab_id, DATA_USE_TRACKING_STARTED); |
117 } | 130 } |
118 | 131 |
| 132 bool DataUseUITabModel::WouldDataUseTrackingEnd( |
| 133 const std::string& url, |
| 134 int page_transition, |
| 135 SessionID::id_type tab_id) const { |
| 136 DCHECK(thread_checker_.CalledOnValidThread()); |
| 137 |
| 138 TabEvents::const_iterator it = tab_events_.find(tab_id); |
| 139 |
| 140 if (it != tab_events_.end() && it->second == DATA_USE_CONTINUE_CLICKED) |
| 141 return false; |
| 142 |
| 143 DataUseTabModel::TransitionType transition_type; |
| 144 |
| 145 if (!ConvertTransitionType(ui::PageTransitionFromInt(page_transition), |
| 146 &transition_type)) { |
| 147 return false; |
| 148 } |
| 149 |
| 150 if (!data_use_tab_model_) |
| 151 return false; |
| 152 |
| 153 return data_use_tab_model_->WouldNavigationEventEndTracking( |
| 154 tab_id, transition_type, GURL(url)); |
| 155 } |
| 156 |
| 157 void DataUseUITabModel::UserClickedContinueOnDialogBox( |
| 158 SessionID::id_type tab_id) { |
| 159 DCHECK(thread_checker_.CalledOnValidThread()); |
| 160 |
| 161 TabEvents::iterator it = tab_events_.find(tab_id); |
| 162 if (it != tab_events_.end()) |
| 163 tab_events_.erase(it); |
| 164 |
| 165 MaybeCreateTabEvent(tab_id, DATA_USE_CONTINUE_CLICKED); |
| 166 } |
| 167 |
119 bool DataUseUITabModel::HasDataUseTrackingEnded(SessionID::id_type tab_id) { | 168 bool DataUseUITabModel::HasDataUseTrackingEnded(SessionID::id_type tab_id) { |
120 DCHECK(thread_checker_.CalledOnValidThread()); | 169 DCHECK(thread_checker_.CalledOnValidThread()); |
121 | 170 |
122 TabEvents::iterator it = tab_events_.find(tab_id); | 171 TabEvents::iterator it = tab_events_.find(tab_id); |
123 if (it == tab_events_.end()) | 172 if (it == tab_events_.end()) |
124 return false; | 173 return false; |
125 | 174 |
126 return RemoveTabEvent(tab_id, DATA_USE_TRACKING_ENDED); | 175 return RemoveTabEvent(tab_id, DATA_USE_TRACKING_ENDED); |
127 } | 176 } |
128 | 177 |
129 bool DataUseUITabModel::MaybeCreateTabEvent(SessionID::id_type tab_id, | 178 bool DataUseUITabModel::MaybeCreateTabEvent(SessionID::id_type tab_id, |
130 DataUseTrackingEvent event) { | 179 DataUseTrackingEvent event) { |
131 DCHECK(thread_checker_.CalledOnValidThread()); | 180 DCHECK(thread_checker_.CalledOnValidThread()); |
132 return tab_events_.insert(std::make_pair(tab_id, event)).second; | 181 return tab_events_.insert(std::make_pair(tab_id, event)).second; |
133 } | 182 } |
134 | 183 |
135 bool DataUseUITabModel::RemoveTabEvent(SessionID::id_type tab_id, | 184 bool DataUseUITabModel::RemoveTabEvent(SessionID::id_type tab_id, |
136 DataUseTrackingEvent event) { | 185 DataUseTrackingEvent event) { |
137 DCHECK(thread_checker_.CalledOnValidThread()); | 186 DCHECK(thread_checker_.CalledOnValidThread()); |
138 TabEvents::iterator it = tab_events_.find(tab_id); | 187 TabEvents::iterator it = tab_events_.find(tab_id); |
139 DCHECK(it != tab_events_.end()); | 188 if (it == tab_events_.end()) |
| 189 return false; |
| 190 |
140 if (it->second == event) { | 191 if (it->second == event) { |
141 tab_events_.erase(it); | 192 tab_events_.erase(it); |
142 return true; | 193 return true; |
143 } | 194 } |
144 return false; | 195 return false; |
145 } | 196 } |
146 | 197 |
147 bool DataUseUITabModel::ConvertTransitionType( | 198 bool DataUseUITabModel::ConvertTransitionType( |
148 ui::PageTransition page_transition, | 199 ui::PageTransition page_transition, |
149 DataUseTabModel::TransitionType* transition_type) const { | 200 DataUseTabModel::TransitionType* transition_type) const { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 } | 242 } |
192 return false; | 243 return false; |
193 default: | 244 default: |
194 return false; | 245 return false; |
195 } | 246 } |
196 } | 247 } |
197 | 248 |
198 } // namespace android | 249 } // namespace android |
199 | 250 |
200 } // namespace chrome | 251 } // namespace chrome |
OLD | NEW |