Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(197)

Unified Diff: chrome/browser/android/data_usage/data_use_ui_tab_model.cc

Issue 1443683002: Notify DataUseTabModel of navigations and tab closures (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698