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() override; |
| 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) |
| 97 GetHelper(old_contents)->OnTabDeactivating(); |
| 98 GetHelper(new_contents)->OnTabActivating(); |
| 99 } |
| 100 |
| 101 void TabReactivationTracker::NotifyTabDeactivating( |
| 102 content::WebContents* contents) { |
| 103 delegate_->OnTabDeactivated(contents); |
| 104 } |
| 105 |
| 106 void TabReactivationTracker::NotifyTabReactivating( |
| 107 content::WebContents* contents) { |
| 108 delegate_->OnTabReactivated(contents); |
| 109 } |
| 110 |
| 111 TabReactivationTracker::WebContentsHelper* TabReactivationTracker::GetHelper( |
| 112 content::WebContents* contents) { |
| 113 // Make sure it exists. |
| 114 if (!base::ContainsKey(helper_map_, contents)) { |
| 115 helper_map_.insert(std::make_pair( |
| 116 contents, base::MakeUnique<WebContentsHelper>(this, contents))); |
| 117 } |
| 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 |