blob: 7490951e6ab942e999b87908e1cfe58fd84900fe [file] [log] [blame]
Mei Liangda912622018-07-19 20:17:121// Copyright 2018 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
Mei Liang2efb9d132019-01-16 05:39:285#ifndef CHROME_BROWSER_COMPLEX_TASKS_TASK_TAB_HELPER_H_
6#define CHROME_BROWSER_COMPLEX_TASKS_TASK_TAB_HELPER_H_
Mei Liangda912622018-07-19 20:17:127
8#include <map>
Lei Zhangdd52b5f2021-04-27 23:08:419#include <unordered_map>
Mei Liangda912622018-07-19 20:17:1210
Jan Wilken Dörrieb5a41c32020-12-09 18:55:4711#include "base/containers/contains.h"
Mei Liangda912622018-07-19 20:17:1212#include "base/macros.h"
David Maunder445c72b2019-05-02 16:14:2013#include "build/build_config.h"
David Maunder93160462019-07-12 17:02:0914#include "components/sessions/content/navigation_task_id.h"
Mei Liangda912622018-07-19 20:17:1215#include "content/public/browser/navigation_details.h"
16#include "content/public/browser/web_contents_observer.h"
17#include "content/public/browser/web_contents_user_data.h"
18
David Maunder445c72b2019-05-02 16:14:2019namespace sessions {
David Maunder93160462019-07-12 17:02:0920class NavigationTaskId;
David Maunder445c72b2019-05-02 16:14:2021}
22
Mei Liangda912622018-07-19 20:17:1223namespace tasks {
24
Mei Liang2efb9d132019-01-16 05:39:2825// This is a tab helper that collects navigation state information of a
26// complex task.
Mei Liangda912622018-07-19 20:17:1227class TaskTabHelper : public content::WebContentsObserver,
28 public content::WebContentsUserData<TaskTabHelper> {
29 public:
Peter Boström53c6c5952021-09-17 09:41:2630 TaskTabHelper(const TaskTabHelper&) = delete;
31 TaskTabHelper& operator=(const TaskTabHelper&) = delete;
32
Mei Liangda912622018-07-19 20:17:1233 ~TaskTabHelper() override;
34
35 // WebContentsObserver
36 void NavigationEntryCommitted(
37 const content::LoadCommittedDetails& load_details) override;
38 void NavigationListPruned(
39 const content::PrunedDetails& pruned_details) override;
David Maunder93160462019-07-12 17:02:0940 static sessions::NavigationTaskId* GetCurrentTaskId(
David Maunder445c72b2019-05-02 16:14:2041 content::WebContents* web_contents);
David Maunder93160462019-07-12 17:02:0942 const sessions::NavigationTaskId* get_task_id_for_navigation(
David Maunder9a2945a2019-05-08 00:04:3543 int nav_id) const {
David Maunder93160462019-07-12 17:02:0944 if (!base::Contains(local_navigation_task_id_map_, nav_id))
David Maunder9a2945a2019-05-08 00:04:3545 return nullptr;
David Maunder93160462019-07-12 17:02:0946 return &local_navigation_task_id_map_.find(nav_id)->second;
David Maunder9a2945a2019-05-08 00:04:3547 }
Mei Liangda912622018-07-19 20:17:1248
49 protected:
50 explicit TaskTabHelper(content::WebContents* web_contents);
51
52 enum class HubType { DEFAULT_SEARCH_ENGINE, FORM_SUBMIT, OTHER };
53
54 virtual HubType GetSpokeEntryHubType() const;
55
56 // For testing
57 int GetSpokesForTesting(int id) {
58 return entry_index_to_spoke_count_map_[id];
59 }
60
61 private:
62 friend class content::WebContentsUserData<TaskTabHelper>;
David Maunder9a2945a2019-05-08 00:04:3563 void UpdateAndRecordTaskIds(
64 const content::LoadCommittedDetails& load_details);
Mei Liangda912622018-07-19 20:17:1265
66 void RecordHubAndSpokeNavigationUsage(int sample);
67
David Maunder445c72b2019-05-02 16:14:2068 int64_t GetParentTaskId();
69 int64_t GetParentRootTaskId();
David Maunder445c72b2019-05-02 16:14:2070
Mei Liangda912622018-07-19 20:17:1271 int last_pruned_navigation_entry_index_;
72 std::map<int, int> entry_index_to_spoke_count_map_;
David Maunder93160462019-07-12 17:02:0973 std::unordered_map<int, sessions::NavigationTaskId>
74 local_navigation_task_id_map_;
Mei Liangda912622018-07-19 20:17:1275
François Doray4f51d5d2018-12-03 22:26:2476 WEB_CONTENTS_USER_DATA_KEY_DECL();
Mei Liangda912622018-07-19 20:17:1277};
78
79} // namespace tasks
80
Mei Liang2efb9d132019-01-16 05:39:2881#endif // CHROME_BROWSER_COMPLEX_TASKS_TASK_TAB_HELPER_H_