Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/metrics/tab_reactivation_tracker.h" | |
| 6 | |
| 7 #include "base/memory/ptr_util.h" | |
| 8 #include "base/stl_util.h" | |
| 9 #include "content/public/browser/web_contents_observer.h" | |
| 10 | |
| 11 namespace metrics { | |
| 12 | |
| 13 // This class is used to track the activation/deactivation cycle per | |
| 14 // WebContents. | |
| 15 class TabReactivationTracker::WebContentsHelper | |
| 16 : public content::WebContentsObserver { | |
| 17 public: | |
| 18 WebContentsHelper(TabReactivationTracker* tab_reactivation_tracker, | |
| 19 content::WebContents* contents); | |
| 20 ~WebContentsHelper(); | |
| 21 | |
| 22 // content::WebContentsObserver: | |
| 23 void WebContentsDestroyed() override; | |
| 24 | |
| 25 void OnTabActivating(); | |
| 26 void OnTabDeactivating(); | |
| 27 void OnTabClosing(); | |
| 28 | |
| 29 private: | |
| 30 // The owning TabReactivationTracker. | |
| 31 TabReactivationTracker* tab_reactivation_tracker_; | |
| 32 | |
| 33 // Indicates if the tab has been deactivated before as to only count | |
| 34 // reactivations. | |
| 35 bool was_deactivated_once_; | |
| 36 | |
| 37 // The deactivation metric is not recorded for closing tabs. | |
| 38 bool is_closing_; | |
| 39 | |
| 40 DISALLOW_COPY_AND_ASSIGN(WebContentsHelper); | |
| 41 }; | |
| 42 | |
| 43 TabReactivationTracker::WebContentsHelper::WebContentsHelper( | |
| 44 TabReactivationTracker* tab_reactivation_tracker, | |
| 45 content::WebContents* contents) | |
| 46 : content::WebContentsObserver(contents), | |
| 47 tab_reactivation_tracker_(tab_reactivation_tracker), | |
| 48 was_deactivated_once_(false), | |
| 49 is_closing_(false) {} | |
| 50 | |
| 51 TabReactivationTracker::WebContentsHelper::~WebContentsHelper() = default; | |
| 52 | |
| 53 void TabReactivationTracker::WebContentsHelper::WebContentsDestroyed() { | |
| 54 tab_reactivation_tracker_->OnWebContentsDestroyed(web_contents()); | |
| 55 } | |
| 56 | |
| 57 void TabReactivationTracker::WebContentsHelper::OnTabActivating() { | |
| 58 if (was_deactivated_once_) | |
| 59 tab_reactivation_tracker_->NotifyTabReactivating(web_contents()); | |
| 60 } | |
| 61 | |
| 62 void TabReactivationTracker::WebContentsHelper::OnTabDeactivating() { | |
| 63 was_deactivated_once_ = true; | |
| 64 if (!is_closing_) | |
| 65 tab_reactivation_tracker_->NotifyTabDeactivating(web_contents()); | |
| 66 } | |
| 67 | |
| 68 void TabReactivationTracker::WebContentsHelper::OnTabClosing() { | |
| 69 is_closing_ = true; | |
| 70 } | |
| 71 | |
| 72 TabReactivationTracker::TabReactivationTracker(Delegate* delegate) | |
| 73 : delegate_(delegate), browser_tab_strip_tracker_(this, nullptr, nullptr) { | |
| 74 browser_tab_strip_tracker_.Init( | |
| 75 BrowserTabStripTracker::InitWith::ALL_BROWERS); | |
| 76 } | |
| 77 | |
| 78 TabReactivationTracker::~TabReactivationTracker() = default; | |
| 79 | |
| 80 void TabReactivationTracker::TabInsertedAt(TabStripModel* tab_strip_model, | |
| 81 content::WebContents* contents, | |
| 82 int index, | |
| 83 bool foreground) {} | |
| 84 | |
| 85 void TabReactivationTracker::TabClosingAt(TabStripModel* tab_strip_model, | |
| 86 content::WebContents* contents, | |
| 87 int index) { | |
| 88 GetHelper(contents)->OnTabClosing(); | |
| 89 } | |
| 90 | |
| 91 void TabReactivationTracker::ActiveTabChanged( | |
| 92 content::WebContents* old_contents, | |
| 93 content::WebContents* new_contents, | |
| 94 int index, | |
| 95 int reason) { | |
| 96 if (old_contents) { | |
|
Georges Khalil
2016/09/22 18:38:38
nit: no braces
Patrick Monette
2016/09/22 20:18:52
Done.
| |
| 97 GetHelper(old_contents)->OnTabDeactivating(); | |
| 98 } | |
| 99 GetHelper(new_contents)->OnTabActivating(); | |
| 100 } | |
| 101 | |
| 102 void TabReactivationTracker::NotifyTabDeactivating( | |
| 103 content::WebContents* contents) { | |
| 104 delegate_->OnTabDeactivated(contents); | |
| 105 } | |
| 106 | |
| 107 void TabReactivationTracker::NotifyTabReactivating( | |
| 108 content::WebContents* contents) { | |
| 109 delegate_->OnTabReactivated(contents); | |
| 110 } | |
| 111 | |
| 112 TabReactivationTracker::WebContentsHelper* TabReactivationTracker::GetHelper( | |
| 113 content::WebContents* contents) { | |
| 114 // Make sure it exists. | |
| 115 if (!base::ContainsKey(helper_map_, contents)) | |
|
Georges Khalil
2016/09/22 18:38:38
nit: braces
Patrick Monette
2016/09/22 20:18:52
Done.
| |
| 116 helper_map_.insert(std::make_pair( | |
| 117 contents, base::MakeUnique<WebContentsHelper>(this, contents))); | |
| 118 | |
| 119 return helper_map_[contents].get(); | |
| 120 } | |
| 121 | |
| 122 void TabReactivationTracker::OnWebContentsDestroyed( | |
| 123 content::WebContents* contents) { | |
| 124 helper_map_.erase(contents); | |
| 125 } | |
| 126 | |
| 127 } // namespace metrics | |
| OLD | NEW |