| 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..d07a442aaf375307997847b53da67d6256fc7a0a 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
|
| @@ -7,8 +7,8 @@
|
| #include <utility>
|
|
|
| #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 "content/public/browser/browser_thread.h"
|
| #include "url/gurl.h"
|
|
|
| @@ -18,27 +18,39 @@ namespace android {
|
|
|
| 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());
|
| +}
|
|
|
| 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);
|
| +
|
| + DataUseTabModel::TransitionType transition_type;
|
|
|
| - // TODO(tbansal): Post to DataUseTabModel on IO thread.
|
| + 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 +60,33 @@ 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::SetDataUseTabModel(
|
| + base::WeakPtr<DataUseTabModel> data_use_tab_model) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + data_use_tab_model_ = data_use_tab_model;
|
| +}
|
| +
|
| +base::WeakPtr<DataUseUITabModel> DataUseUITabModel::GetWeakPtr() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + return 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 +96,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 +106,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 +116,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);
|
| @@ -98,18 +126,15 @@ bool DataUseUITabModel::HasDataUseTrackingEnded(int32_t tab_id) {
|
| return RemoveTabEvent(tab_id, DATA_USE_TRACKING_ENDED);
|
| }
|
|
|
| -bool DataUseUITabModel::MaybeCreateTabEvent(int32_t tab_id,
|
| +bool DataUseUITabModel::MaybeCreateTabEvent(SessionID::id_type 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,
|
| +bool DataUseUITabModel::RemoveTabEvent(SessionID::id_type 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 +144,45 @@ 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;
|
| + }
|
| +
|
| + switch (page_transition & ui::PAGE_TRANSITION_CORE_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
|
|
|