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_
|