Chromium Code Reviews| 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 95e86286088001fabe436cda92c6f9375ccb4a8d..d49b4a4f3a60a3c842da59f7249ef03e6daed677 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 |
| @@ -9,6 +9,9 @@ |
| #include "base/logging.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/single_thread_task_runner.h" |
| +#include "base/thread_task_runner_handle.h" |
| +#include "chrome/browser/android/data_usage/external_data_use_observer.h" |
| +#include "chrome/browser/io_thread.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "url/gurl.h" |
| @@ -16,29 +19,58 @@ namespace chrome { |
| namespace android { |
| +namespace { |
| + |
| +// Returns the weak pointr to DataUseTabModel which can be used on IO thread. |
| +base::WeakPtr<DataUseTabModel> GetDataUseTabModel( |
| + base::WeakPtr<DataUseUITabModel> tab_model, |
| + IOThread* io_thread) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| + return io_thread->globals() |
| + ->external_data_use_observer->data_use_tab_model_weak_ptr(); |
| +} |
| + |
| +} // namespace |
| + |
| DataUseUITabModel::DataUseUITabModel( |
| scoped_refptr<base::SingleThreadTaskRunner> io_task_runner) |
| - : io_task_runner_(io_task_runner) { |
| + : io_task_runner_(io_task_runner), weak_factory_(this) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| DCHECK(io_task_runner_); |
| } |
| -DataUseUITabModel::~DataUseUITabModel() {} |
| +DataUseUITabModel::~DataUseUITabModel() { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + |
| + io_task_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&DataUseTabModel::RemoveObserver, data_use_tab_model_, this)); |
| +} |
| void DataUseUITabModel::ReportBrowserNavigation( |
| const GURL& gurl, |
| ui::PageTransition page_transition, |
| int32_t tab_id) const { |
| - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| + DCHECK_LE(0, tab_id); |
| - // 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(&DataUseTabModel::OnNavigationEvent, data_use_tab_model_, |
| + tab_id, transition_type, gurl, std::string())); |
| + } |
| } |
| void DataUseUITabModel::ReportTabClosure(int32_t tab_id) { |
| - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| + DCHECK_LE(0, tab_id); |
| - // TODO(tbansal): Post to DataUseTabModel on IO thread. |
| + io_task_runner_->PostTask(FROM_HERE, |
| + base::Bind(&DataUseTabModel::OnTabCloseEvent, |
| + data_use_tab_model_, tab_id)); |
| // Clear out local state. |
| TabEvents::iterator it = tab_events_.find(tab_id); |
| @@ -51,11 +83,39 @@ void DataUseUITabModel::ReportCustomTabInitialNavigation( |
| int32_t tab_id, |
| const std::string& url, |
| const std::string& package_name) { |
| - // TODO(tbansal): Post to DataUseTabModel on IO thread. |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + |
| + if (tab_id <= 0) |
| + return; |
| + |
| + io_task_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&DataUseTabModel::OnNavigationEvent, data_use_tab_model_, |
| + tab_id, DataUseTabModel::TRANSITION_FROM_EXTERNAL_APP, |
| + GURL(url), package_name)); |
| } |
| -void DataUseUITabModel::OnTrackingStarted(int32_t tab_id) { |
| - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| +void DataUseUITabModel::SetIOThread(IOThread* io_thread) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + |
| + PostTaskAndReplyWithResult( |
| + io_task_runner_.get(), FROM_HERE, |
| + base::Bind(&GetDataUseTabModel, weak_factory_.GetWeakPtr(), io_thread), |
| + base::Bind(&DataUseUITabModel::SetDataUseTabModel, |
| + weak_factory_.GetWeakPtr())); |
| +} |
| + |
| +void DataUseUITabModel::SetDataUseTabModel( |
| + base::WeakPtr<DataUseTabModel> data_use_tab_model) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + |
| + data_use_tab_model_ = data_use_tab_model; |
| + io_task_runner_->PostTask( |
| + FROM_HERE, base::Bind(&DataUseTabModel::AddObserver, data_use_tab_model_, |
| + this, weak_factory_.GetWeakPtr())); |
| +} |
| + |
| +void DataUseUITabModel::NotifyTrackingStarting(int32_t tab_id) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| if (MaybeCreateTabEvent(tab_id, DATA_USE_TRACKING_STARTED)) |
| @@ -65,8 +125,7 @@ void DataUseUITabModel::OnTrackingStarted(int32_t tab_id) { |
| RemoveTabEvent(tab_id, DATA_USE_TRACKING_ENDED); |
| } |
| -void DataUseUITabModel::OnTrackingEnded(int32_t tab_id) { |
| - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| +void DataUseUITabModel::NotifyTrackingEnding(int32_t tab_id) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| if (MaybeCreateTabEvent(tab_id, DATA_USE_TRACKING_ENDED)) |
| @@ -77,7 +136,6 @@ void DataUseUITabModel::OnTrackingEnded(int32_t tab_id) { |
| } |
| bool DataUseUITabModel::HasDataUseTrackingStarted(int32_t tab_id) { |
| - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| TabEvents::iterator it = tab_events_.find(tab_id); |
| @@ -88,7 +146,6 @@ bool DataUseUITabModel::HasDataUseTrackingStarted(int32_t tab_id) { |
| } |
| bool DataUseUITabModel::HasDataUseTrackingEnded(int32_t tab_id) { |
| - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| TabEvents::iterator it = tab_events_.find(tab_id); |
| @@ -100,16 +157,13 @@ bool DataUseUITabModel::HasDataUseTrackingEnded(int32_t tab_id) { |
| bool DataUseUITabModel::MaybeCreateTabEvent(int32_t tab_id, |
| DataUseTrackingEvent event) { |
| - TabEvents::iterator it = tab_events_.find(tab_id); |
| - if (it == tab_events_.end()) { |
| - tab_events_.insert(std::make_pair(tab_id, event)); |
| - return true; |
| - } |
| - return false; |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + return tab_events_.insert(std::make_pair(tab_id, event)).second; |
| } |
| bool DataUseUITabModel::RemoveTabEvent(int32_t tab_id, |
| DataUseTrackingEvent event) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| TabEvents::iterator it = tab_events_.find(tab_id); |
| DCHECK(it != tab_events_.end()); |
| if (it->second == event) { |
| @@ -119,6 +173,47 @@ bool DataUseUITabModel::RemoveTabEvent(int32_t tab_id, |
| return false; |
| } |
| +bool DataUseUITabModel::ConvertTransitionType( |
|
bengr
2015/11/23 18:26:25
Can this be a method in an anonymous namespace, in
tbansal1
2015/11/23 19:58:08
Needed for Testing.
|
| + ui::PageTransition page_transition, |
| + DataUseTabModel::TransitionType* transition_type) const { |
| + if (!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 |