File: tab_content_manager.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 (151 lines) | stat: -rw-r--r-- 5,713 bytes parent folder | download | duplicates (6)
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// Copyright 2014 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_COMPOSITOR_TAB_CONTENT_MANAGER_H_
#define CHROME_BROWSER_ANDROID_COMPOSITOR_TAB_CONTENT_MANAGER_H_

#include <jni.h>

#include <map>

#include "base/android/jni_android.h"
#include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h"
#include "base/containers/flat_map.h"
#include "base/memory/weak_ptr.h"
#include "base/task/sequenced_task_runner.h"
#include "chrome/browser/thumbnail/cc/thumbnail_cache.h"
#include "content/public/browser/render_widget_host_view.h"

using base::android::ScopedJavaLocalRef;

namespace cc::slim {
class Layer;
}

namespace ui {
class UIResourceProvider;
}

namespace android {

class ThumbnailLayer;

// A native component of the Java TabContentManager class.
class TabContentManager : public thumbnail::ThumbnailCacheObserver {
 public:
  static TabContentManager* FromJavaObject(
      const base::android::JavaRef<jobject>& jobj);

  TabContentManager(JNIEnv* env,
                    const jni_zero::JavaRef<jobject>& obj,
                    jint default_cache_size,
                    jint compression_queue_max_size,
                    jint write_queue_max_size,
                    jboolean save_jpeg_thumbnails);

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

  virtual ~TabContentManager();

  void Destroy(JNIEnv* env);

  void SetUIResourceProvider(
      base::WeakPtr<ui::UIResourceProvider> ui_resource_provider);

  // Get the live layer from the cache.
  scoped_refptr<cc::slim::Layer> GetLiveLayer(int tab_id);

  // Returns the static ThumbnailLayer for a `tab_id`. Note that the lifecycle
  // of the thumbnail is managed by the ThumbnailCache and not the
  // ThumbnailLayer. When displaying a layer it is important that
  // UpdateVisibleIds is called with all the Tab IDs that are required for
  // before calling GetStaticLayer. ThumbnailLayer's should not be retained as
  // their lifecycle is managed by this class.
  ThumbnailLayer* GetStaticLayer(int tab_id);

  // JNI methods.

  // Updates visible tab ids to page into the thumbnail cache.
  void UpdateVisibleIds(const std::vector<int>& priority_ids,
                        int primary_tab_id);

  void CaptureThumbnail(JNIEnv* env,
                        const base::android::JavaParamRef<jobject>& tab,
                        jfloat thumbnail_scale,
                        jboolean return_bitmap,
                        const base::android::JavaParamRef<jobject>& j_callback);
  void CacheTabWithBitmap(JNIEnv* env,
                          const base::android::JavaParamRef<jobject>& tab,
                          const base::android::JavaParamRef<jobject>& bitmap,
                          jfloat thumbnail_scale);
  void InvalidateIfChanged(JNIEnv* env,
                           jint tab_id,
                           const base::android::JavaParamRef<jobject>& jurl);
  void UpdateVisibleIds(JNIEnv* env,
                        const base::android::JavaParamRef<jintArray>& priority,
                        jint primary_tab_id);
  void NativeRemoveTabThumbnail(int tab_id);
  void RemoveTabThumbnail(JNIEnv* env, jint tab_id);
  void OnUIResourcesWereEvicted();
  void WaitForJpegTabThumbnail(
      JNIEnv* env,
      jint tab_id,
      const base::android::JavaParamRef<jobject>& j_callback);
  void GetEtc1TabThumbnail(
      JNIEnv* env,
      jint tab_id,
      const base::android::JavaParamRef<jobject>& j_callback);
  void SetCaptureMinRequestTimeForTesting(JNIEnv* env, jint timeMs);
  jboolean IsTabCaptureInFlightForTesting(JNIEnv* env, jint tab_id);

  // ThumbnailCacheObserver implementation;
  void OnThumbnailAddedToCache(thumbnail::TabId tab_id) override;
  void OnFinishedThumbnailRead(thumbnail::TabId tab_id) override;

 private:
  class TabReadbackRequest;
  // TODO(crbug.com/41314695) check sizes and consider using base::flat_map if
  // these layer maps are small.
  using ThumbnailLayerMap = std::map<int, scoped_refptr<ThumbnailLayer>>;
  using TabReadbackRequestMap =
      base::flat_map<int, std::unique_ptr<TabReadbackRequest>>;

  content::RenderWidgetHostView* GetRwhvForTab(
      JNIEnv* env,
      const base::android::JavaParamRef<jobject>& tab);
  std::unique_ptr<thumbnail::ThumbnailCaptureTracker, base::OnTaskRunnerDeleter>
  TrackCapture(thumbnail::TabId tab_id);
  void CleanupTrackers();
  void OnTrackingFinished(int tab_id,
                          thumbnail::ThumbnailCaptureTracker* tracker);
  void OnTabReadback(int tab_id,
                     std::unique_ptr<thumbnail::ThumbnailCaptureTracker,
                                     base::OnTaskRunnerDeleter> tracker,
                     base::android::ScopedJavaGlobalRef<jobject> j_callback,
                     bool return_bitmap,
                     float thumbnail_scale,
                     const SkBitmap& bitmap);

  void SendThumbnailToJava(
      base::android::ScopedJavaGlobalRef<jobject> j_callback,
      bool need_downsampling,
      bool result,
      const SkBitmap& bitmap);

  base::flat_map<thumbnail::TabId,
                 base::WeakPtr<thumbnail::ThumbnailCaptureTracker>>
      in_flight_captures_;
  std::unique_ptr<thumbnail::ThumbnailCache> thumbnail_cache_;
  ThumbnailLayerMap static_layer_cache_;
  TabReadbackRequestMap pending_tab_readbacks_;

  JavaObjectWeakGlobalRef weak_java_tab_content_manager_;
  base::WeakPtrFactory<TabContentManager> weak_factory_{this};
};

}  // namespace android

#endif  // CHROME_BROWSER_ANDROID_COMPOSITOR_TAB_CONTENT_MANAGER_H_