1 // Copyright 2014 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.
5 #include "cc/resources/ui_resource_bitmap.h"
6 #include "content/browser/android/system_ui_resource_manager_impl.h"
7 #include "content/public/browser/android/ui_resource_client_android.h"
8 #include "content/public/browser/android/ui_resource_provider.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "third_party/skia/include/core/SkBitmap.h"
11 #include "third_party/skia/include/core/SkCanvas.h"
15 class TestSystemUIResourceManagerImpl
16 : public content::SystemUIResourceManagerImpl {
18 TestSystemUIResourceManagerImpl(content::UIResourceProvider* provider)
19 : SystemUIResourceManagerImpl(provider) {}
21 virtual ~TestSystemUIResourceManagerImpl() {}
23 virtual void BuildResource(
24 ui::SystemUIResourceManager::ResourceType type) OVERRIDE {}
26 void SetResourceAsLoaded(ui::SystemUIResourceManager::ResourceType type) {
27 SkBitmap small_bitmap;
28 SkCanvas canvas(small_bitmap);
29 small_bitmap.allocPixels(
30 SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kOpaque_SkAlphaType));
31 canvas.drawColor(SK_ColorWHITE);
32 small_bitmap.setImmutable();
33 OnFinishedLoadBitmap(type, &small_bitmap);
39 const ui::SystemUIResourceManager::ResourceType TEST_RESOURCE_TYPE =
40 ui::SystemUIResourceManager::OVERSCROLL_GLOW;
42 class MockUIResourceProvider : public content::UIResourceProvider {
44 MockUIResourceProvider()
45 : next_ui_resource_id_(1),
46 has_layer_tree_host_(true),
47 system_ui_resource_manager_(this) {}
49 virtual ~MockUIResourceProvider() {}
51 virtual cc::UIResourceId CreateUIResource(
52 content::UIResourceClientAndroid* client) OVERRIDE {
53 if (!has_layer_tree_host_)
55 cc::UIResourceId id = next_ui_resource_id_++;
56 client->GetBitmap(id, false);
57 ui_resource_client_map_[id] = client;
61 virtual void DeleteUIResource(cc::UIResourceId id) OVERRIDE {
62 CHECK(has_layer_tree_host_);
63 ui_resource_client_map_.erase(id);
66 void LayerTreeHostCleared() {
67 has_layer_tree_host_ = false;
68 UIResourceClientMap client_map = ui_resource_client_map_;
69 ui_resource_client_map_.clear();
70 for (UIResourceClientMap::iterator iter = client_map.begin();
71 iter != client_map.end();
73 iter->second->UIResourceIsInvalid();
77 void LayerTreeHostReturned() { has_layer_tree_host_ = true; }
79 TestSystemUIResourceManagerImpl& GetSystemUIResourceManager() {
80 return system_ui_resource_manager_;
83 cc::UIResourceId next_ui_resource_id() const { return next_ui_resource_id_; }
86 typedef base::hash_map<cc::UIResourceId, content::UIResourceClientAndroid*>
89 cc::UIResourceId next_ui_resource_id_;
90 UIResourceClientMap ui_resource_client_map_;
91 bool has_layer_tree_host_;
93 // The UIResourceProvider owns the SystemUIResourceManager.
94 TestSystemUIResourceManagerImpl system_ui_resource_manager_;
99 class SystemUIResourceManagerImplTest : public testing::Test {
101 void PreloadResource(ui::SystemUIResourceManager::ResourceType type) {
102 ui_resource_provider_.GetSystemUIResourceManager().PreloadResource(type);
105 cc::UIResourceId GetUIResourceId(
106 ui::SystemUIResourceManager::ResourceType type) {
107 return ui_resource_provider_.GetSystemUIResourceManager().GetUIResourceId(
111 void LayerTreeHostCleared() { ui_resource_provider_.LayerTreeHostCleared(); }
113 void LayerTreeHostReturned() {
114 ui_resource_provider_.LayerTreeHostReturned();
117 void SetResourceAsLoaded(ui::SystemUIResourceManager::ResourceType type) {
118 ui_resource_provider_.GetSystemUIResourceManager().SetResourceAsLoaded(
122 cc::UIResourceId GetNextUIResourceId() const {
123 return ui_resource_provider_.next_ui_resource_id();
127 MockUIResourceProvider ui_resource_provider_;
130 TEST_F(SystemUIResourceManagerImplTest, GetResourceAfterBitmapLoaded) {
131 SetResourceAsLoaded(TEST_RESOURCE_TYPE);
132 EXPECT_NE(0, GetUIResourceId(TEST_RESOURCE_TYPE));
135 TEST_F(SystemUIResourceManagerImplTest, GetResourceBeforeLoadBitmap) {
136 EXPECT_EQ(0, GetUIResourceId(TEST_RESOURCE_TYPE));
137 SetResourceAsLoaded(TEST_RESOURCE_TYPE);
138 EXPECT_NE(0, GetUIResourceId(TEST_RESOURCE_TYPE));
141 TEST_F(SystemUIResourceManagerImplTest, PreloadEnsureResource) {
142 // Preloading the resource should trigger bitmap loading, but the actual
143 // resource id will not be generated until it is explicitly requested.
144 cc::UIResourceId first_resource_id = GetNextUIResourceId();
145 PreloadResource(TEST_RESOURCE_TYPE);
146 SetResourceAsLoaded(TEST_RESOURCE_TYPE);
147 EXPECT_EQ(first_resource_id, GetNextUIResourceId());
148 EXPECT_NE(0, GetUIResourceId(TEST_RESOURCE_TYPE));
149 EXPECT_NE(first_resource_id, GetNextUIResourceId());
152 TEST_F(SystemUIResourceManagerImplTest, ResetLayerTreeHost) {
153 EXPECT_EQ(0, GetUIResourceId(TEST_RESOURCE_TYPE));
154 LayerTreeHostCleared();
155 EXPECT_EQ(0, GetUIResourceId(TEST_RESOURCE_TYPE));
156 LayerTreeHostReturned();
157 EXPECT_EQ(0, GetUIResourceId(TEST_RESOURCE_TYPE));
159 SetResourceAsLoaded(TEST_RESOURCE_TYPE);
160 EXPECT_NE(0, GetUIResourceId(TEST_RESOURCE_TYPE));
161 LayerTreeHostCleared();
162 EXPECT_EQ(0, GetUIResourceId(TEST_RESOURCE_TYPE));
163 LayerTreeHostReturned();
164 EXPECT_NE(0, GetUIResourceId(TEST_RESOURCE_TYPE));
167 } // namespace content