Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(99)

Side by Side Diff: chrome/browser/extensions/extension_toolbar_model_unittest.cc

Issue 726813002: [Extensions Toolbar] Make the ExtensionToolbarModel icon count more stable (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/files/file_util.h" 5 #include "base/files/file_util.h"
6 #include "base/macros.h" 6 #include "base/macros.h"
7 #include "base/memory/ref_counted.h" 7 #include "base/memory/ref_counted.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/strings/stringprintf.h" 9 #include "base/strings/stringprintf.h"
10 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h" 10 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 105
106 // Creates a new ExtensionToolbarModel for the given |context|. 106 // Creates a new ExtensionToolbarModel for the given |context|.
107 KeyedService* BuildToolbarModel(content::BrowserContext* context) { 107 KeyedService* BuildToolbarModel(content::BrowserContext* context) {
108 return new ExtensionToolbarModel(Profile::FromBrowserContext(context), 108 return new ExtensionToolbarModel(Profile::FromBrowserContext(context),
109 ExtensionPrefs::Get(context)); 109 ExtensionPrefs::Get(context));
110 } 110 }
111 111
112 // Given a |profile|, assigns the testing keyed service function to 112 // Given a |profile|, assigns the testing keyed service function to
113 // BuildToolbarModel() and uses it to create and initialize a new 113 // BuildToolbarModel() and uses it to create and initialize a new
114 // ExtensionToolbarModel. 114 // ExtensionToolbarModel.
115 ExtensionToolbarModel* CreateToolbarModelForProfile(Profile* profile) { 115 // |wait_for_ready| indicates whether or not to post the ExtensionSystem's
116 // ready task.
117 ExtensionToolbarModel* CreateToolbarModelForProfile(Profile* profile,
118 bool wait_for_ready) {
116 ExtensionToolbarModel* model = ExtensionToolbarModel::Get(profile); 119 ExtensionToolbarModel* model = ExtensionToolbarModel::Get(profile);
117 if (model) 120 if (model)
118 return model; 121 return model;
119 122
120 // No existing model means it's a new profile (since we, by default, don't 123 // No existing model means it's a new profile (since we, by default, don't
121 // create the ToolbarModel in testing). 124 // create the ToolbarModel in testing).
122 ExtensionToolbarModelFactory::GetInstance()->SetTestingFactory( 125 ExtensionToolbarModelFactory::GetInstance()->SetTestingFactory(
123 profile, &BuildToolbarModel); 126 profile, &BuildToolbarModel);
124 model = ExtensionToolbarModel::Get(profile); 127 model = ExtensionToolbarModel::Get(profile);
125 // Fake the extension system ready signal. 128 if (wait_for_ready) {
126 // HACK ALERT! In production, the ready task on ExtensionSystem (and most 129 // Fake the extension system ready signal.
127 // everything else on it, too) is shared between incognito and normal 130 // HACK ALERT! In production, the ready task on ExtensionSystem (and most
128 // profiles, but a TestExtensionSystem doesn't have the concept of "shared". 131 // everything else on it, too) is shared between incognito and normal
129 // Because of this, we have to set any new profile's TestExtensionSystem's 132 // profiles, but a TestExtensionSystem doesn't have the concept of "shared".
130 // ready task, too. 133 // Because of this, we have to set any new profile's TestExtensionSystem's
131 static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile))->SetReady(); 134 // ready task, too.
132 // Run tasks posted to TestExtensionSystem. 135 static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile))->
133 base::RunLoop().RunUntilIdle(); 136 SetReady();
137 // Run tasks posted to TestExtensionSystem.
138 base::RunLoop().RunUntilIdle();
139 }
134 140
135 return model; 141 return model;
136 } 142 }
137 143
138 // Create an extension. If |action_key| is non-NULL, it should point to either 144 // Create an extension. If |action_key| is non-NULL, it should point to either
139 // kBrowserAction or kPageAction, and the extension will have the associated 145 // kBrowserAction or kPageAction, and the extension will have the associated
140 // action. 146 // action.
141 scoped_refptr<const Extension> GetActionExtension(const std::string& name, 147 scoped_refptr<const Extension> GetActionExtension(const std::string& name,
142 const char* action_key) { 148 const char* action_key) {
143 DictionaryBuilder manifest; 149 DictionaryBuilder manifest;
(...skipping 13 matching lines...) Expand all
157 class ExtensionToolbarModelTestObserver 163 class ExtensionToolbarModelTestObserver
158 : public ExtensionToolbarModel::Observer { 164 : public ExtensionToolbarModel::Observer {
159 public: 165 public:
160 explicit ExtensionToolbarModelTestObserver(ExtensionToolbarModel* model); 166 explicit ExtensionToolbarModelTestObserver(ExtensionToolbarModel* model);
161 ~ExtensionToolbarModelTestObserver() override; 167 ~ExtensionToolbarModelTestObserver() override;
162 168
163 size_t inserted_count() const { return inserted_count_; } 169 size_t inserted_count() const { return inserted_count_; }
164 size_t removed_count() const { return removed_count_; } 170 size_t removed_count() const { return removed_count_; }
165 size_t moved_count() const { return moved_count_; } 171 size_t moved_count() const { return moved_count_; }
166 int highlight_mode_count() const { return highlight_mode_count_; } 172 int highlight_mode_count() const { return highlight_mode_count_; }
173 size_t initialized_count() const { return initialized_count_; }
167 size_t reorder_count() const { return reorder_count_; } 174 size_t reorder_count() const { return reorder_count_; }
168 175
169 private: 176 private:
170 // ExtensionToolbarModel::Observer: 177 // ExtensionToolbarModel::Observer:
171 void ToolbarExtensionAdded(const Extension* extension, int index) override { 178 void ToolbarExtensionAdded(const Extension* extension, int index) override {
172 ++inserted_count_; 179 ++inserted_count_;
173 } 180 }
174 181
175 void ToolbarExtensionRemoved(const Extension* extension) override { 182 void ToolbarExtensionRemoved(const Extension* extension) override {
176 ++removed_count_; 183 ++removed_count_;
(...skipping 10 matching lines...) Expand all
187 return false; 194 return false;
188 } 195 }
189 196
190 void ToolbarVisibleCountChanged() override {} 197 void ToolbarVisibleCountChanged() override {}
191 198
192 void ToolbarHighlightModeChanged(bool is_highlighting) override { 199 void ToolbarHighlightModeChanged(bool is_highlighting) override {
193 // Add one if highlighting, subtract one if not. 200 // Add one if highlighting, subtract one if not.
194 highlight_mode_count_ += is_highlighting ? 1 : -1; 201 highlight_mode_count_ += is_highlighting ? 1 : -1;
195 } 202 }
196 203
197 void OnToolbarModelInitialized() override {} 204 void OnToolbarModelInitialized() override { ++initialized_count_; }
198 205
199 void OnToolbarReorderNecessary(content::WebContents* web_contents) override { 206 void OnToolbarReorderNecessary(content::WebContents* web_contents) override {
200 ++reorder_count_; 207 ++reorder_count_;
201 } 208 }
202 209
203 Browser* GetBrowser() override { return NULL; } 210 Browser* GetBrowser() override { return NULL; }
204 211
205 ExtensionToolbarModel* model_; 212 ExtensionToolbarModel* model_;
206 213
207 size_t inserted_count_; 214 size_t inserted_count_;
208 size_t removed_count_; 215 size_t removed_count_;
209 size_t moved_count_; 216 size_t moved_count_;
210 // Int because it could become negative (if something goes wrong). 217 // Int because it could become negative (if something goes wrong).
211 int highlight_mode_count_; 218 int highlight_mode_count_;
219 size_t initialized_count_;
212 size_t reorder_count_; 220 size_t reorder_count_;
213 }; 221 };
214 222
215 ExtensionToolbarModelTestObserver::ExtensionToolbarModelTestObserver( 223 ExtensionToolbarModelTestObserver::ExtensionToolbarModelTestObserver(
216 ExtensionToolbarModel* model) : model_(model), 224 ExtensionToolbarModel* model) : model_(model),
217 inserted_count_(0), 225 inserted_count_(0),
218 removed_count_(0), 226 removed_count_(0),
219 moved_count_(0), 227 moved_count_(0),
220 highlight_mode_count_(0), 228 highlight_mode_count_(0),
229 initialized_count_(0),
221 reorder_count_(0) { 230 reorder_count_(0) {
222 model_->AddObserver(this); 231 model_->AddObserver(this);
223 } 232 }
224 233
225 ExtensionToolbarModelTestObserver::~ExtensionToolbarModelTestObserver() { 234 ExtensionToolbarModelTestObserver::~ExtensionToolbarModelTestObserver() {
226 model_->RemoveObserver(this); 235 model_->RemoveObserver(this);
227 } 236 }
228 237
229 } // namespace 238 } // namespace
230 239
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 scoped_refptr<const Extension> browser_action_c_; 301 scoped_refptr<const Extension> browser_action_c_;
293 302
294 // Sample extensions with different kinds of actions. 303 // Sample extensions with different kinds of actions.
295 scoped_refptr<const Extension> browser_action_extension_; 304 scoped_refptr<const Extension> browser_action_extension_;
296 scoped_refptr<const Extension> page_action_extension_; 305 scoped_refptr<const Extension> page_action_extension_;
297 scoped_refptr<const Extension> no_action_extension_; 306 scoped_refptr<const Extension> no_action_extension_;
298 }; 307 };
299 308
300 void ExtensionToolbarModelUnitTest::Init() { 309 void ExtensionToolbarModelUnitTest::Init() {
301 InitializeEmptyExtensionService(); 310 InitializeEmptyExtensionService();
302 toolbar_model_ = CreateToolbarModelForProfile(profile()); 311 toolbar_model_ = CreateToolbarModelForProfile(profile(), true);
303 model_observer_.reset(new ExtensionToolbarModelTestObserver(toolbar_model_)); 312 model_observer_.reset(new ExtensionToolbarModelTestObserver(toolbar_model_));
304 } 313 }
305 314
306 void ExtensionToolbarModelUnitTest::TearDown() { 315 void ExtensionToolbarModelUnitTest::TearDown() {
307 model_observer_.reset(); 316 model_observer_.reset();
308 ExtensionServiceTestBase::TearDown(); 317 ExtensionServiceTestBase::TearDown();
309 } 318 }
310 319
311 testing::AssertionResult ExtensionToolbarModelUnitTest::AddExtension( 320 testing::AssertionResult ExtensionToolbarModelUnitTest::AddExtension(
312 const scoped_refptr<const Extension>& extension) { 321 const scoped_refptr<const Extension>& extension) {
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after
880 util::SetIsIncognitoEnabled(browser_action_c()->id(), profile(), true); 889 util::SetIsIncognitoEnabled(browser_action_c()->id(), profile(), true);
881 890
882 // Move C to the second index. 891 // Move C to the second index.
883 toolbar_model()->MoveExtensionIcon(browser_action_c()->id(), 1u); 892 toolbar_model()->MoveExtensionIcon(browser_action_c()->id(), 1u);
884 // Set visible count to 2 so that c is overflowed. State is A C [B]. 893 // Set visible count to 2 so that c is overflowed. State is A C [B].
885 toolbar_model()->SetVisibleIconCount(2); 894 toolbar_model()->SetVisibleIconCount(2);
886 EXPECT_EQ(1u, observer()->moved_count()); 895 EXPECT_EQ(1u, observer()->moved_count());
887 896
888 // Get an incognito profile and toolbar. 897 // Get an incognito profile and toolbar.
889 ExtensionToolbarModel* incognito_model = 898 ExtensionToolbarModel* incognito_model =
890 CreateToolbarModelForProfile(profile()->GetOffTheRecordProfile()); 899 CreateToolbarModelForProfile(profile()->GetOffTheRecordProfile(), true);
891 900
892 ExtensionToolbarModelTestObserver incognito_observer(incognito_model); 901 ExtensionToolbarModelTestObserver incognito_observer(incognito_model);
893 EXPECT_EQ(0u, incognito_observer.moved_count()); 902 EXPECT_EQ(0u, incognito_observer.moved_count());
894 903
895 // We should have two items, C and B, and the order should be preserved from 904 // We should have two items, C and B, and the order should be preserved from
896 // the original model. 905 // the original model.
897 EXPECT_EQ(2u, incognito_model->toolbar_items().size()); 906 EXPECT_EQ(2u, incognito_model->toolbar_items().size());
898 EXPECT_EQ(browser_action_c(), GetExtensionAtIndex(0u, incognito_model)); 907 EXPECT_EQ(browser_action_c(), GetExtensionAtIndex(0u, incognito_model));
899 EXPECT_EQ(browser_action_b(), GetExtensionAtIndex(1u, incognito_model)); 908 EXPECT_EQ(browser_action_b(), GetExtensionAtIndex(1u, incognito_model));
900 909
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 // The first model should have both extensions visible. 994 // The first model should have both extensions visible.
986 EXPECT_EQ(2u, toolbar_model()->toolbar_items().size()); 995 EXPECT_EQ(2u, toolbar_model()->toolbar_items().size());
987 EXPECT_EQ(extension_a, GetExtensionAtIndex(0)->id()); 996 EXPECT_EQ(extension_a, GetExtensionAtIndex(0)->id());
988 EXPECT_EQ(extension_b, GetExtensionAtIndex(1)->id()); 997 EXPECT_EQ(extension_b, GetExtensionAtIndex(1)->id());
989 998
990 // Set the model to only show one extension, so the order is A [B]. 999 // Set the model to only show one extension, so the order is A [B].
991 toolbar_model()->SetVisibleIconCount(1u); 1000 toolbar_model()->SetVisibleIconCount(1u);
992 1001
993 // Get an incognito profile and toolbar. 1002 // Get an incognito profile and toolbar.
994 ExtensionToolbarModel* incognito_model = 1003 ExtensionToolbarModel* incognito_model =
995 CreateToolbarModelForProfile(profile()->GetOffTheRecordProfile()); 1004 CreateToolbarModelForProfile(profile()->GetOffTheRecordProfile(), true);
996 ExtensionToolbarModelTestObserver incognito_observer(incognito_model); 1005 ExtensionToolbarModelTestObserver incognito_observer(incognito_model);
997 1006
998 // Right now, no extensions are enabled in incognito mode. 1007 // Right now, no extensions are enabled in incognito mode.
999 EXPECT_EQ(0u, incognito_model->toolbar_items().size()); 1008 EXPECT_EQ(0u, incognito_model->toolbar_items().size());
1000 1009
1001 // Set extension b (which is overflowed) to be enabled in incognito. This 1010 // Set extension b (which is overflowed) to be enabled in incognito. This
1002 // results in b reloading, so wait for it. 1011 // results in b reloading, so wait for it.
1003 { 1012 {
1004 TestExtensionRegistryObserver observer(registry(), extension_b); 1013 TestExtensionRegistryObserver observer(registry(), extension_b);
1005 util::SetIsIncognitoEnabled(extension_b, profile(), true); 1014 util::SetIsIncognitoEnabled(extension_b, profile(), true);
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
1268 extension_action_api->NotifyChange(action, web_contents, profile()); 1277 extension_action_api->NotifyChange(action, web_contents, profile());
1269 tab_order = toolbar_model()->GetItemOrderForTab(web_contents); 1278 tab_order = toolbar_model()->GetItemOrderForTab(web_contents);
1270 ASSERT_EQ(3u, tab_order.size()); 1279 ASSERT_EQ(3u, tab_order.size());
1271 EXPECT_EQ(page_action(), tab_order[0].get()); 1280 EXPECT_EQ(page_action(), tab_order[0].get());
1272 EXPECT_EQ(browser_action(), tab_order[1].get()); 1281 EXPECT_EQ(browser_action(), tab_order[1].get());
1273 EXPECT_EQ(no_action(), tab_order[2].get()); 1282 EXPECT_EQ(no_action(), tab_order[2].get());
1274 EXPECT_EQ(1u, toolbar_model()->GetVisibleIconCountForTab(web_contents)); 1283 EXPECT_EQ(1u, toolbar_model()->GetVisibleIconCountForTab(web_contents));
1275 EXPECT_EQ(3u, observer()->reorder_count()); 1284 EXPECT_EQ(3u, observer()->reorder_count());
1276 } 1285 }
1277 1286
1287 // Test that observers receive no Added notifications until after the
1288 // ExtensionSystem has initialized.
1289 TEST_F(ExtensionToolbarModelUnitTest, ModelWaitsForExtensionSystemReady) {
1290 InitializeEmptyExtensionService();
1291 ExtensionToolbarModel* toolbar_model =
1292 CreateToolbarModelForProfile(profile(), false);
1293 ExtensionToolbarModelTestObserver model_observer(toolbar_model);
1294 EXPECT_TRUE(AddBrowserActionExtensions());
1295
1296 // Since the model hasn't been initialized (the ExtensionSystem::ready task
1297 // hasn't been run), there should be no insertion notifications.
1298 EXPECT_EQ(0u, model_observer.inserted_count());
1299 EXPECT_EQ(0u, model_observer.initialized_count());
1300 EXPECT_FALSE(toolbar_model->extensions_initialized());
1301
1302 // Run the ready task.
1303 static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile()))->
1304 SetReady();
1305 // Run tasks posted to TestExtensionSystem.
1306 base::RunLoop().RunUntilIdle();
1307
1308 // We should still have no insertions, but should have an initialized count.
1309 EXPECT_TRUE(toolbar_model->extensions_initialized());
1310 EXPECT_EQ(0u, model_observer.inserted_count());
1311 EXPECT_EQ(1u, model_observer.initialized_count());
1312 }
1313
1278 } // namespace extensions 1314 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698