File: recently_closed_tabs_bridge.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (129 lines) | stat: -rw-r--r-- 4,560 bytes parent folder | download | duplicates (5)
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
// 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;
  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_