Index: chrome/browser/android/data_usage/data_use_ui_tab_model.cc |
diff --git a/chrome/browser/android/data_usage/data_use_ui_tab_model.cc b/chrome/browser/android/data_usage/data_use_ui_tab_model.cc |
index 9b113a4227dc876939dc562507cd76655f048ec9..f7b924140470dbaa3cbfdb8051e7c8c4c6033ae7 100644 |
--- a/chrome/browser/android/data_usage/data_use_ui_tab_model.cc |
+++ b/chrome/browser/android/data_usage/data_use_ui_tab_model.cc |
@@ -16,13 +16,42 @@ namespace chrome { |
namespace android { |
+// Notifies |data_use_tab_model| of navigation event on IO thread. |
+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.
|
+ base::WeakPtr<DataUseTabModel> data_use_tab_model, |
+ int32_t tab_id, |
+ DataUseTabModel::TransitionType transition, |
+ const GURL gurl) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
+ |
+ if (!data_use_tab_model) |
+ return; |
+ data_use_tab_model->OnNavigationEvent(tab_id, transition, gurl); |
+} |
+ |
+// Notifies |data_use_tab_model| of tab closure on IO thread. |
+void OnTabCloseEventOnIOThread( |
+ base::WeakPtr<DataUseTabModel> data_use_tab_model, |
+ int32_t tab_id) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
+ |
+ if (!data_use_tab_model) |
+ return; |
+ data_use_tab_model->OnTabCloseEvent(tab_id); |
+} |
+ |
DataUseUITabModel::DataUseUITabModel( |
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner) |
- : io_task_runner_(io_task_runner) { |
+ : registered_as_observer_(false), io_task_runner_(io_task_runner) { |
DCHECK(io_task_runner_); |
} |
-DataUseUITabModel::~DataUseUITabModel() {} |
+DataUseUITabModel::~DataUseUITabModel() { |
+ if (registered_as_observer_ && ui_data_use_tab_model_) { |
+ registered_as_observer_ = false; |
+ ui_data_use_tab_model_->RemoveObserver(this); |
+ } |
+} |
void DataUseUITabModel::ReportBrowserNavigation( |
const GURL& gurl, |
@@ -31,14 +60,23 @@ void DataUseUITabModel::ReportBrowserNavigation( |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
DCHECK(thread_checker_.CalledOnValidThread()); |
- // TODO(tbansal): Post to DataUseTabModel on IO thread. |
+ DataUseTabModel::TransitionType transition_type; |
+ |
+ if (ConvertTransitionType(page_transition, &transition_type)) { |
+ io_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&OnNavigationEventOnIOThread, io_data_use_tab_model_, tab_id, |
+ transition_type, gurl)); |
+ } |
} |
void DataUseUITabModel::ReportTabClosure(int32_t tab_id) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
DCHECK(thread_checker_.CalledOnValidThread()); |
- // TODO(tbansal): Post to DataUseTabModel on IO thread. |
+ io_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&OnTabCloseEventOnIOThread, io_data_use_tab_model_, tab_id)); |
// Clear out local state. |
TabEvents::iterator it = tab_events_.find(tab_id); |
@@ -47,7 +85,7 @@ void DataUseUITabModel::ReportTabClosure(int32_t tab_id) { |
tab_events_.erase(it); |
} |
-void DataUseUITabModel::OnTrackingStarted(int32_t tab_id) { |
+void DataUseUITabModel::NotifyTrackingStarting(int32_t tab_id) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
DCHECK(thread_checker_.CalledOnValidThread()); |
@@ -58,7 +96,7 @@ void DataUseUITabModel::OnTrackingStarted(int32_t tab_id) { |
RemoveTabEvent(tab_id, DATA_USE_TRACKING_ENDED); |
} |
-void DataUseUITabModel::OnTrackingEnded(int32_t tab_id) { |
+void DataUseUITabModel::NotifyTrackingEnding(int32_t tab_id) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
DCHECK(thread_checker_.CalledOnValidThread()); |
@@ -91,6 +129,26 @@ bool DataUseUITabModel::HasDataUseTrackingEnded(int32_t tab_id) { |
return RemoveTabEvent(tab_id, DATA_USE_TRACKING_ENDED); |
} |
+void DataUseUITabModel::SetIODataUseTabModel( |
+ base::WeakPtr<DataUseTabModel> io_data_use_tab_model) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ io_data_use_tab_model_ = io_data_use_tab_model; |
+} |
+ |
+void DataUseUITabModel::SetUIDataUseTabModel( |
+ base::WeakPtr<DataUseTabModel> ui_data_use_tab_model) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ ui_data_use_tab_model_ = ui_data_use_tab_model; |
+ if (registered_as_observer_ || !ui_data_use_tab_model_) |
+ return; |
+ registered_as_observer_ = true; |
+ ui_data_use_tab_model_->AddObserver(this); |
+} |
+ |
bool DataUseUITabModel::MaybeCreateTabEvent(int32_t tab_id, |
DataUseTrackingEvent event) { |
TabEvents::iterator it = tab_events_.find(tab_id); |
@@ -112,6 +170,48 @@ bool DataUseUITabModel::RemoveTabEvent(int32_t tab_id, |
return false; |
} |
+bool DataUseUITabModel::ConvertTransitionType( |
+ ui::PageTransition page_transition, |
+ DataUseTabModel::TransitionType* transition_type) const { |
+ if (!ui::PageTransitionIsValidType(page_transition) || |
+ !ui::PageTransitionIsMainFrame(page_transition) || |
+ !ui::PageTransitionIsNewNavigation(page_transition)) { |
+ return false; |
+ } |
+ |
+ const int32_t mask = 0xFFFFFFFF ^ ui::PAGE_TRANSITION_QUALIFIER_MASK; |
+ |
+ switch (page_transition & mask) { |
+ case ui::PAGE_TRANSITION_LINK: |
+ if ((page_transition & ui::PAGE_TRANSITION_FROM_API) != 0) { |
+ // Clicking on bookmarks. |
+ *transition_type = DataUseTabModel::TRANSITION_BOOKMARK; |
+ return true; |
+ } |
+ return false; // Newtab, clicking on a link. |
+ case ui::PAGE_TRANSITION_TYPED: |
+ *transition_type = DataUseTabModel::TRANSITION_OMNIBOX_NAVIGATION; |
+ return true; |
+ case ui::PAGE_TRANSITION_AUTO_BOOKMARK: |
+ // Auto bookmark from newtab page. |
+ *transition_type = DataUseTabModel::TRANSITION_BOOKMARK; |
+ return true; |
+ case ui::PAGE_TRANSITION_AUTO_TOPLEVEL: |
+ // History menu. |
+ *transition_type = DataUseTabModel::TRANSITION_HISTORY_ITEM; |
+ return true; |
+ case ui::PAGE_TRANSITION_GENERATED: |
+ // Omnibox search (e.g., searching for "tacos"). |
+ *transition_type = DataUseTabModel::TRANSITION_OMNIBOX_SEARCH; |
+ return true; |
+ case ui::PAGE_TRANSITION_RELOAD: |
+ // Restored tabs. |
+ return false; |
+ default: |
+ return false; |
+ } |
+} |
+ |
} // namespace android |
} // namespace chrome |