| 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..b538c0c3d310e53f2123acf632fe3c385f2ac2b6 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 pointer 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));
|
| + SessionID::id_type tab_id) const {
|
| 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));
|
| +void DataUseUITabModel::ReportTabClosure(SessionID::id_type tab_id) {
|
| 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);
|
| @@ -48,14 +80,42 @@ void DataUseUITabModel::ReportTabClosure(int32_t tab_id) {
|
| }
|
|
|
| void DataUseUITabModel::ReportCustomTabInitialNavigation(
|
| - int32_t tab_id,
|
| + SessionID::id_type 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(SessionID::id_type 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(SessionID::id_type tab_id) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
| if (MaybeCreateTabEvent(tab_id, DATA_USE_TRACKING_ENDED))
|
| @@ -76,8 +135,7 @@ void DataUseUITabModel::OnTrackingEnded(int32_t tab_id) {
|
| RemoveTabEvent(tab_id, DATA_USE_TRACKING_STARTED);
|
| }
|
|
|
| -bool DataUseUITabModel::HasDataUseTrackingStarted(int32_t tab_id) {
|
| - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| +bool DataUseUITabModel::HasDataUseTrackingStarted(SessionID::id_type tab_id) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
| TabEvents::iterator it = tab_events_.find(tab_id);
|
| @@ -87,8 +145,7 @@ bool DataUseUITabModel::HasDataUseTrackingStarted(int32_t tab_id) {
|
| return RemoveTabEvent(tab_id, DATA_USE_TRACKING_STARTED);
|
| }
|
|
|
| -bool DataUseUITabModel::HasDataUseTrackingEnded(int32_t tab_id) {
|
| - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| +bool DataUseUITabModel::HasDataUseTrackingEnded(SessionID::id_type tab_id) {
|
| 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(
|
| + 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
|
|
|