File: recently_closed_tabs_bridge.h

package info (click to toggle)
chromium 135.0.7049.95-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 5,959,392 kB
  • sloc: cpp: 34,198,526; ansic: 7,100,035; javascript: 3,985,800; python: 1,395,489; asm: 896,754; xml: 722,891; pascal: 180,504; sh: 94,909; perl: 88,388; objc: 79,739; sql: 53,020; cs: 41,358; fortran: 24,137; makefile: 22,501; php: 13,699; tcl: 10,142; yacc: 8,822; ruby: 7,350; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; awk: 197; sed: 36
file content (130 lines) | stat: -rw-r--r-- 4,604 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_ANDROID_RECENTLY_CLOSED_TABS_BRIDGE_H_
#define CHROME_BROWSER_ANDROID_RECENTLY_CLOSED_TABS_BRIDGE_H_

#include <map>
#include <memory>
#include <optional>
#include <vector>

#include "base/android/scoped_java_ref.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/raw_ref.h"
#include "chrome/browser/ui/android/tab_model/android_live_tab_context_wrapper.h"
#include "components/sessions/core/tab_restore_service.h"
#include "components/sessions/core/tab_restore_service_observer.h"

class Profile;

namespace recent_tabs {

// Used to iterating over sessions::TabRestoreService::Entries in most recently
// added tab to least recently added tab order.
class TabIterator {
 public:
  using iterator_category = std::forward_iterator_tag;
  using difference_type = size_t;
  using value_type = sessions::tab_restore::Tab;
  using pointer = value_type*;
  using reference = value_type&;

  TabIterator(const sessions::TabRestoreService::Entries& entries,
              sessions::TabRestoreService::Entries::const_iterator it);

  ~TabIterator();

  static TabIterator begin(const sessions::TabRestoreService::Entries& entries);

  static TabIterator end(const sessions::TabRestoreService::Entries& entries);

  // Whether the current entry is a sessions::tab_restore::Tab.
  bool IsCurrentEntryTab() const;

  // Gets an iterator to the current entry being traversed.
  sessions::TabRestoreService::Entries::const_iterator CurrentEntry() const;

  TabIterator& operator++();
  TabIterator operator++(int);
  bool operator==(TabIterator other) const;
  bool operator!=(TabIterator other) const;
  const sessions::tab_restore::Tab& operator*() const;
  const sessions::tab_restore::Tab* operator->() const;

 private:
  void SetupInnerTabList();

  const raw_ref<const sessions::TabRestoreService::Entries> entries_;
  sessions::TabRestoreService::Entries::const_iterator current_entry_;
  raw_ptr<const std::vector<std::unique_ptr<sessions::tab_restore::Tab>>>
      tabs_ = nullptr;
  std::optional<std::vector<
      std::unique_ptr<sessions::tab_restore::Tab>>::const_reverse_iterator>
      current_tab_ = std::nullopt;
};

// Provides the list of recently closed tabs to Java.
class RecentlyClosedTabsBridge : public sessions::TabRestoreServiceObserver {
 public:
  RecentlyClosedTabsBridge(base::android::ScopedJavaGlobalRef<jobject> jbridge,
                           Profile* profile);

  RecentlyClosedTabsBridge(const RecentlyClosedTabsBridge&) = delete;
  RecentlyClosedTabsBridge& operator=(const RecentlyClosedTabsBridge&) = delete;

  void Destroy(JNIEnv* env);

  jboolean GetRecentlyClosedEntries(
      JNIEnv* env,
      const base::android::JavaParamRef<jobject>& jentries,
      jint max_entry_count);
  jboolean OpenRecentlyClosedTab(
      JNIEnv* env,
      const base::android::JavaParamRef<jobject>& jtab_model,
      jint tab_session_id,
      jint j_disposition);
  jboolean OpenRecentlyClosedEntry(
      JNIEnv* env,
      const base::android::JavaParamRef<jobject>& jtab_model,
      jint session_id);
  jboolean OpenMostRecentlyClosedEntry(
      JNIEnv* env,
      const base::android::JavaParamRef<jobject>& jtab_model);
  void ClearRecentlyClosedEntries(JNIEnv* env);

  // Observer callback for TabRestoreServiceObserver. Notifies the Java bridge
  // that the recently closed tabs list has changed.
  void TabRestoreServiceChanged(sessions::TabRestoreService* service) override;

  // Observer callback when our associated TabRestoreService is destroyed.
  void TabRestoreServiceDestroyed(
      sessions::TabRestoreService* service) override;

 private:
  ~RecentlyClosedTabsBridge() override;

  // Construct and initialize tab_restore_service_ if it's NULL.
  // tab_restore_service_ may still be NULL, however, in incognito mode.
  void EnsureTabRestoreService();

  void RestoreAndroidTabGroups(
      JNIEnv* env,
      const base::android::JavaParamRef<jobject>& jtab_model,
      const std::map<tab_groups::TabGroupId,
                     AndroidLiveTabContextRestoreWrapper::TabGroup>& groups);

  // The Java RecentlyClosedBridge.
  base::android::ScopedJavaGlobalRef<jobject> bridge_;

  // The profile whose recently closed tabs are being monitored.
  raw_ptr<Profile> profile_;

  // TabRestoreService that we are observing.
  raw_ptr<sessions::TabRestoreService> tab_restore_service_;
};

}  // namespace recent_tabs

#endif  // CHROME_BROWSER_ANDROID_RECENTLY_CLOSED_TABS_BRIDGE_H_