Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / content / browser / android / system_ui_resource_manager_impl_unittest.cc
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.
4
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"
12
13 namespace content {
14
15 class TestSystemUIResourceManagerImpl
16     : public content::SystemUIResourceManagerImpl {
17  public:
18   TestSystemUIResourceManagerImpl(content::UIResourceProvider* provider)
19       : SystemUIResourceManagerImpl(provider) {}
20
21   virtual ~TestSystemUIResourceManagerImpl() {}
22
23   virtual void BuildResource(
24       ui::SystemUIResourceManager::ResourceType type) OVERRIDE {}
25
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);
34   }
35 };
36
37 namespace {
38
39 const ui::SystemUIResourceManager::ResourceType TEST_RESOURCE_TYPE =
40     ui::SystemUIResourceManager::OVERSCROLL_GLOW;
41
42 class MockUIResourceProvider : public content::UIResourceProvider {
43  public:
44   MockUIResourceProvider()
45       : next_ui_resource_id_(1),
46         has_layer_tree_host_(true),
47         system_ui_resource_manager_(this) {}
48
49   virtual ~MockUIResourceProvider() {}
50
51   virtual cc::UIResourceId CreateUIResource(
52       content::UIResourceClientAndroid* client) OVERRIDE {
53     if (!has_layer_tree_host_)
54       return 0;
55     cc::UIResourceId id = next_ui_resource_id_++;
56     client->GetBitmap(id, false);
57     ui_resource_client_map_[id] = client;
58     return id;
59   }
60
61   virtual void DeleteUIResource(cc::UIResourceId id) OVERRIDE {
62     CHECK(has_layer_tree_host_);
63     ui_resource_client_map_.erase(id);
64   }
65
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();
72          iter++) {
73       iter->second->UIResourceIsInvalid();
74     }
75   }
76
77   void LayerTreeHostReturned() { has_layer_tree_host_ = true; }
78
79   TestSystemUIResourceManagerImpl& GetSystemUIResourceManager() {
80     return system_ui_resource_manager_;
81   }
82
83   cc::UIResourceId next_ui_resource_id() const { return next_ui_resource_id_; }
84
85  private:
86   typedef base::hash_map<cc::UIResourceId, content::UIResourceClientAndroid*>
87       UIResourceClientMap;
88
89   cc::UIResourceId next_ui_resource_id_;
90   UIResourceClientMap ui_resource_client_map_;
91   bool has_layer_tree_host_;
92
93   // The UIResourceProvider owns the SystemUIResourceManager.
94   TestSystemUIResourceManagerImpl system_ui_resource_manager_;
95 };
96
97 }  // namespace
98
99 class SystemUIResourceManagerImplTest : public testing::Test {
100  public:
101   void PreloadResource(ui::SystemUIResourceManager::ResourceType type) {
102     ui_resource_provider_.GetSystemUIResourceManager().PreloadResource(type);
103   }
104
105   cc::UIResourceId GetUIResourceId(
106       ui::SystemUIResourceManager::ResourceType type) {
107     return ui_resource_provider_.GetSystemUIResourceManager().GetUIResourceId(
108         type);
109   }
110
111   void LayerTreeHostCleared() { ui_resource_provider_.LayerTreeHostCleared(); }
112
113   void LayerTreeHostReturned() {
114     ui_resource_provider_.LayerTreeHostReturned();
115   }
116
117   void SetResourceAsLoaded(ui::SystemUIResourceManager::ResourceType type) {
118     ui_resource_provider_.GetSystemUIResourceManager().SetResourceAsLoaded(
119         type);
120   }
121
122   cc::UIResourceId GetNextUIResourceId() const {
123     return ui_resource_provider_.next_ui_resource_id();
124   }
125
126  private:
127   MockUIResourceProvider ui_resource_provider_;
128 };
129
130 TEST_F(SystemUIResourceManagerImplTest, GetResourceAfterBitmapLoaded) {
131   SetResourceAsLoaded(TEST_RESOURCE_TYPE);
132   EXPECT_NE(0, GetUIResourceId(TEST_RESOURCE_TYPE));
133 }
134
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));
139 }
140
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());
150 }
151
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));
158
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));
165 }
166
167 }  // namespace content