OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "chrome/browser/chromeos/note_taking_helper.h" | 5 #include "chrome/browser/chromeos/note_taking_helper.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "ash/common/ash_switches.h" | 9 #include "ash/common/ash_switches.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
12 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "base/run_loop.h" | 14 #include "base/run_loop.h" |
15 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
| 16 #include "chrome/browser/chrome_notification_types.h" |
16 #include "chrome/browser/chromeos/file_manager/path_util.h" | 17 #include "chrome/browser/chromeos/file_manager/path_util.h" |
17 #include "chrome/browser/extensions/extension_service.h" | 18 #include "chrome/browser/extensions/extension_service.h" |
18 #include "chrome/browser/extensions/test_extension_system.h" | 19 #include "chrome/browser/extensions/test_extension_system.h" |
19 #include "chrome/browser/ui/app_list/arc/arc_app_test.h" | 20 #include "chrome/browser/ui/app_list/arc/arc_app_test.h" |
20 #include "chrome/common/pref_names.h" | 21 #include "chrome/common/pref_names.h" |
21 #include "chrome/test/base/browser_with_test_window_test.h" | 22 #include "chrome/test/base/browser_with_test_window_test.h" |
| 23 #include "chrome/test/base/testing_browser_process.h" |
| 24 #include "chrome/test/base/testing_profile_manager.h" |
22 #include "chromeos/dbus/dbus_thread_manager.h" | 25 #include "chromeos/dbus/dbus_thread_manager.h" |
23 #include "chromeos/dbus/fake_session_manager_client.h" | 26 #include "chromeos/dbus/fake_session_manager_client.h" |
24 #include "components/arc/arc_bridge_service.h" | 27 #include "components/arc/arc_bridge_service.h" |
25 #include "components/arc/arc_service_manager.h" | 28 #include "components/arc/arc_service_manager.h" |
26 #include "components/arc/common/intent_helper.mojom.h" | 29 #include "components/arc/common/intent_helper.mojom.h" |
27 #include "components/arc/test/fake_intent_helper_instance.h" | 30 #include "components/arc/test/fake_intent_helper_instance.h" |
| 31 #include "content/public/browser/notification_service.h" |
| 32 #include "content/public/browser/notification_source.h" |
28 #include "extensions/common/api/app_runtime.h" | 33 #include "extensions/common/api/app_runtime.h" |
29 #include "extensions/common/extension_builder.h" | 34 #include "extensions/common/extension_builder.h" |
30 #include "extensions/common/extension_id.h" | 35 #include "extensions/common/extension_id.h" |
31 #include "extensions/common/value_builder.h" | 36 #include "extensions/common/value_builder.h" |
32 #include "url/gurl.h" | 37 #include "url/gurl.h" |
33 | 38 |
34 namespace app_runtime = extensions::api::app_runtime; | 39 namespace app_runtime = extensions::api::app_runtime; |
35 | 40 |
36 using arc::mojom::IntentHandlerInfo; | 41 using arc::mojom::IntentHandlerInfo; |
37 using arc::mojom::IntentHandlerInfoPtr; | 42 using arc::mojom::IntentHandlerInfoPtr; |
38 using HandledIntent = arc::FakeIntentHelperInstance::HandledIntent; | 43 using HandledIntent = arc::FakeIntentHelperInstance::HandledIntent; |
39 | 44 |
40 namespace chromeos { | 45 namespace chromeos { |
41 namespace { | 46 namespace { |
42 | 47 |
| 48 // Name of default profile. |
| 49 const char kTestProfileName[] = "test-profile"; |
| 50 |
43 // Helper functions returning strings that can be used to compare information | 51 // Helper functions returning strings that can be used to compare information |
44 // about available note-taking apps. | 52 // about available note-taking apps. |
45 std::string GetAppString(const std::string& id, | 53 std::string GetAppString(const std::string& id, |
46 const std::string& name, | 54 const std::string& name, |
47 bool preferred) { | 55 bool preferred) { |
48 return base::StringPrintf("%s %s %d", id.c_str(), name.c_str(), preferred); | 56 return base::StringPrintf("%s %s %d", id.c_str(), name.c_str(), preferred); |
49 } | 57 } |
50 std::string GetAppString(const NoteTakingAppInfo& info) { | 58 std::string GetAppString(const NoteTakingAppInfo& info) { |
51 return GetAppString(info.app_id, info.name, info.preferred); | 59 return GetAppString(info.app_id, info.name, info.preferred); |
52 } | 60 } |
(...skipping 29 matching lines...) Expand all Loading... |
82 return url.spec(); | 90 return url.spec(); |
83 } | 91 } |
84 | 92 |
85 // Implementation of NoteTakingHelper::Observer for testing. | 93 // Implementation of NoteTakingHelper::Observer for testing. |
86 class TestObserver : public NoteTakingHelper::Observer { | 94 class TestObserver : public NoteTakingHelper::Observer { |
87 public: | 95 public: |
88 TestObserver() { NoteTakingHelper::Get()->AddObserver(this); } | 96 TestObserver() { NoteTakingHelper::Get()->AddObserver(this); } |
89 ~TestObserver() override { NoteTakingHelper::Get()->RemoveObserver(this); } | 97 ~TestObserver() override { NoteTakingHelper::Get()->RemoveObserver(this); } |
90 | 98 |
91 int num_updates() const { return num_updates_; } | 99 int num_updates() const { return num_updates_; } |
| 100 void reset_num_updates() { num_updates_ = 0; } |
92 | 101 |
93 private: | 102 private: |
94 // NoteTakingHelper::Observer: | 103 // NoteTakingHelper::Observer: |
95 void OnAvailableNoteTakingAppsUpdated() override { num_updates_++; } | 104 void OnAvailableNoteTakingAppsUpdated() override { num_updates_++; } |
96 | 105 |
97 // Number of times that OnAvailableNoteTakingAppsUpdated() has been called. | 106 // Number of times that OnAvailableNoteTakingAppsUpdated() has been called. |
98 int num_updates_ = 0; | 107 int num_updates_ = 0; |
99 | 108 |
100 DISALLOW_COPY_AND_ASSIGN(TestObserver); | 109 DISALLOW_COPY_AND_ASSIGN(TestObserver); |
101 }; | 110 }; |
102 | 111 |
103 } // namespace | 112 } // namespace |
104 | 113 |
105 class NoteTakingHelperTest : public BrowserWithTestWindowTest { | 114 class NoteTakingHelperTest : public BrowserWithTestWindowTest { |
106 public: | 115 public: |
107 NoteTakingHelperTest() = default; | 116 NoteTakingHelperTest() = default; |
108 ~NoteTakingHelperTest() override = default; | 117 ~NoteTakingHelperTest() override = default; |
109 | 118 |
110 void SetUp() override { | 119 void SetUp() override { |
111 // This is needed to avoid log spam due to ArcSessionManager's | 120 // This is needed to avoid log spam due to ArcSessionManager's |
112 // RemoveArcData() calls failing. | 121 // RemoveArcData() calls failing. |
113 if (DBusThreadManager::IsInitialized()) | 122 if (DBusThreadManager::IsInitialized()) |
114 DBusThreadManager::Shutdown(); | 123 DBusThreadManager::Shutdown(); |
115 session_manager_client_ = new FakeSessionManagerClient(); | 124 session_manager_client_ = new FakeSessionManagerClient(); |
116 session_manager_client_->set_arc_available(true); | 125 session_manager_client_->set_arc_available(true); |
117 DBusThreadManager::GetSetterForTesting()->SetSessionManagerClient( | 126 DBusThreadManager::GetSetterForTesting()->SetSessionManagerClient( |
118 std::unique_ptr<SessionManagerClient>(session_manager_client_)); | 127 std::unique_ptr<SessionManagerClient>(session_manager_client_)); |
119 | 128 |
| 129 profile_manager_.reset( |
| 130 new TestingProfileManager(TestingBrowserProcess::GetGlobal())); |
| 131 ASSERT_TRUE(profile_manager_->SetUp()); |
120 BrowserWithTestWindowTest::SetUp(); | 132 BrowserWithTestWindowTest::SetUp(); |
121 | 133 InitExtensionService(profile()); |
122 extensions::TestExtensionSystem* extension_system = | |
123 static_cast<extensions::TestExtensionSystem*>( | |
124 extensions::ExtensionSystem::Get(profile())); | |
125 extension_system->CreateExtensionService( | |
126 base::CommandLine::ForCurrentProcess(), | |
127 base::FilePath() /* install_directory */, | |
128 false /* autoupdate_enabled */); | |
129 } | 134 } |
130 | 135 |
131 void TearDown() override { | 136 void TearDown() override { |
132 if (initialized_) { | 137 if (initialized_) { |
133 NoteTakingHelper::Shutdown(); | 138 NoteTakingHelper::Shutdown(); |
134 arc_test_.TearDown(); | 139 arc_test_.TearDown(); |
135 } | 140 } |
136 extensions::ExtensionSystem::Get(profile())->Shutdown(); | 141 extensions::ExtensionSystem::Get(profile())->Shutdown(); |
137 BrowserWithTestWindowTest::TearDown(); | 142 BrowserWithTestWindowTest::TearDown(); |
138 DBusThreadManager::Shutdown(); | 143 DBusThreadManager::Shutdown(); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 .Build()) | 201 .Build()) |
197 .Build()) | 202 .Build()) |
198 .Build()) | 203 .Build()) |
199 .Build(); | 204 .Build(); |
200 return extensions::ExtensionBuilder() | 205 return extensions::ExtensionBuilder() |
201 .SetManifest(std::move(manifest)) | 206 .SetManifest(std::move(manifest)) |
202 .SetID(id) | 207 .SetID(id) |
203 .Build(); | 208 .Build(); |
204 } | 209 } |
205 | 210 |
206 // Installs or uninstalls the passed-in extension. | 211 // Initializes extensions-related objects for |profile|. Tests only need to |
207 void InstallExtension(const extensions::Extension* extension) { | 212 // call this if they create additional profiles of their own. |
208 extensions::ExtensionSystem::Get(profile()) | 213 void InitExtensionService(Profile* profile) { |
| 214 extensions::TestExtensionSystem* extension_system = |
| 215 static_cast<extensions::TestExtensionSystem*>( |
| 216 extensions::ExtensionSystem::Get(profile)); |
| 217 extension_system->CreateExtensionService( |
| 218 base::CommandLine::ForCurrentProcess(), |
| 219 base::FilePath() /* install_directory */, |
| 220 false /* autoupdate_enabled */); |
| 221 } |
| 222 |
| 223 // Installs or uninstalls |extension| in |profile|. |
| 224 void InstallExtension(const extensions::Extension* extension, |
| 225 Profile* profile) { |
| 226 extensions::ExtensionSystem::Get(profile) |
209 ->extension_service() | 227 ->extension_service() |
210 ->AddExtension(extension); | 228 ->AddExtension(extension); |
211 } | 229 } |
212 void UninstallExtension(const extensions::Extension* extension) { | 230 void UninstallExtension(const extensions::Extension* extension, |
213 extensions::ExtensionSystem::Get(profile()) | 231 Profile* profile) { |
| 232 extensions::ExtensionSystem::Get(profile) |
214 ->extension_service() | 233 ->extension_service() |
215 ->UnloadExtension(extension->id(), | 234 ->UnloadExtension(extension->id(), |
216 extensions::UnloadedExtensionInfo::REASON_UNINSTALL); | 235 extensions::UnloadedExtensionInfo::REASON_UNINSTALL); |
217 } | 236 } |
218 | 237 |
| 238 // BrowserWithTestWindowTest: |
| 239 TestingProfile* CreateProfile() override { |
| 240 // Ensure that the profile created by BrowserWithTestWindowTest is |
| 241 // registered with |profile_manager_|. |
| 242 return profile_manager_->CreateTestingProfile(kTestProfileName); |
| 243 } |
| 244 void DestroyProfile(TestingProfile* profile) override { |
| 245 return profile_manager_->DeleteTestingProfile(kTestProfileName); |
| 246 } |
| 247 |
219 // Info about launched Chrome apps, in the order they were launched. | 248 // Info about launched Chrome apps, in the order they were launched. |
220 std::vector<ChromeAppLaunchInfo> launched_chrome_apps_; | 249 std::vector<ChromeAppLaunchInfo> launched_chrome_apps_; |
221 | 250 |
222 arc::FakeIntentHelperInstance intent_helper_; | 251 arc::FakeIntentHelperInstance intent_helper_; |
| 252 std::unique_ptr<TestingProfileManager> profile_manager_; |
223 | 253 |
224 private: | 254 private: |
225 // Callback registered with the helper to record Chrome app launch requests. | 255 // Callback registered with the helper to record Chrome app launch requests. |
226 void LaunchChromeApp(Profile* passed_profile, | 256 void LaunchChromeApp(Profile* passed_profile, |
227 const extensions::Extension* extension, | 257 const extensions::Extension* extension, |
228 std::unique_ptr<app_runtime::ActionData> action_data, | 258 std::unique_ptr<app_runtime::ActionData> action_data, |
229 const base::FilePath& path) { | 259 const base::FilePath& path) { |
230 EXPECT_EQ(profile(), passed_profile); | 260 EXPECT_EQ(profile(), passed_profile); |
231 EXPECT_EQ(app_runtime::ActionType::ACTION_TYPE_NEW_NOTE, | 261 EXPECT_EQ(app_runtime::ActionType::ACTION_TYPE_NEW_NOTE, |
232 action_data->action_type); | 262 action_data->action_type); |
233 launched_chrome_apps_.push_back(ChromeAppLaunchInfo{extension->id(), path}); | 263 launched_chrome_apps_.push_back(ChromeAppLaunchInfo{extension->id(), path}); |
234 } | 264 } |
235 | 265 |
236 // Has Init() been called? | 266 // Has Init() been called? |
237 bool initialized_ = false; | 267 bool initialized_ = false; |
238 | 268 |
239 FakeSessionManagerClient* session_manager_client_ = nullptr; // Not owned. | 269 FakeSessionManagerClient* session_manager_client_ = nullptr; // Not owned. |
240 | |
241 ArcAppTest arc_test_; | 270 ArcAppTest arc_test_; |
242 | 271 |
243 DISALLOW_COPY_AND_ASSIGN(NoteTakingHelperTest); | 272 DISALLOW_COPY_AND_ASSIGN(NoteTakingHelperTest); |
244 }; | 273 }; |
245 | 274 |
246 TEST_F(NoteTakingHelperTest, PaletteNotEnabled) { | 275 TEST_F(NoteTakingHelperTest, PaletteNotEnabled) { |
247 // Without the palette enabled, IsAppAvailable() should return false. | 276 // Without the palette enabled, IsAppAvailable() should return false. |
248 Init(0); | 277 Init(0); |
249 auto extension = | 278 auto extension = |
250 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, "Keep"); | 279 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, "Keep"); |
251 InstallExtension(extension.get()); | 280 InstallExtension(extension.get(), profile()); |
252 EXPECT_FALSE(helper()->IsAppAvailable(profile())); | 281 EXPECT_FALSE(helper()->IsAppAvailable(profile())); |
253 } | 282 } |
254 | 283 |
255 TEST_F(NoteTakingHelperTest, ListChromeApps) { | 284 TEST_F(NoteTakingHelperTest, ListChromeApps) { |
256 Init(ENABLE_PALETTE); | 285 Init(ENABLE_PALETTE); |
257 | 286 |
258 // Start out without any note-taking apps installed. | 287 // Start out without any note-taking apps installed. |
259 EXPECT_FALSE(helper()->IsAppAvailable(profile())); | 288 EXPECT_FALSE(helper()->IsAppAvailable(profile())); |
260 EXPECT_TRUE(helper()->GetAvailableApps(profile()).empty()); | 289 EXPECT_TRUE(helper()->GetAvailableApps(profile()).empty()); |
261 | 290 |
262 // If only the prod version of the app is installed, it should be returned. | 291 // If only the prod version of the app is installed, it should be returned. |
263 const std::string kProdName = "Google Keep [prod]"; | 292 const std::string kProdName = "Google Keep [prod]"; |
264 auto prod_extension = | 293 auto prod_extension = |
265 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, kProdName); | 294 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, kProdName); |
266 InstallExtension(prod_extension.get()); | 295 InstallExtension(prod_extension.get(), profile()); |
267 EXPECT_TRUE(helper()->IsAppAvailable(profile())); | 296 EXPECT_TRUE(helper()->IsAppAvailable(profile())); |
268 std::vector<NoteTakingAppInfo> apps = helper()->GetAvailableApps(profile()); | 297 std::vector<NoteTakingAppInfo> apps = helper()->GetAvailableApps(profile()); |
269 ASSERT_EQ(1u, apps.size()); | 298 ASSERT_EQ(1u, apps.size()); |
270 EXPECT_EQ( | 299 EXPECT_EQ( |
271 GetAppString(NoteTakingHelper::kProdKeepExtensionId, kProdName, false), | 300 GetAppString(NoteTakingHelper::kProdKeepExtensionId, kProdName, false), |
272 GetAppString(apps[0])); | 301 GetAppString(apps[0])); |
273 | 302 |
274 // If the dev version is also installed, it should be listed before the prod | 303 // If the dev version is also installed, it should be listed before the prod |
275 // version. | 304 // version. |
276 const std::string kDevName = "Google Keep [dev]"; | 305 const std::string kDevName = "Google Keep [dev]"; |
277 auto dev_extension = | 306 auto dev_extension = |
278 CreateExtension(NoteTakingHelper::kDevKeepExtensionId, kDevName); | 307 CreateExtension(NoteTakingHelper::kDevKeepExtensionId, kDevName); |
279 InstallExtension(dev_extension.get()); | 308 InstallExtension(dev_extension.get(), profile()); |
280 apps = helper()->GetAvailableApps(profile()); | 309 apps = helper()->GetAvailableApps(profile()); |
281 ASSERT_EQ(2u, apps.size()); | 310 ASSERT_EQ(2u, apps.size()); |
282 EXPECT_EQ( | 311 EXPECT_EQ( |
283 GetAppString(NoteTakingHelper::kDevKeepExtensionId, kDevName, false), | 312 GetAppString(NoteTakingHelper::kDevKeepExtensionId, kDevName, false), |
284 GetAppString(apps[0])); | 313 GetAppString(apps[0])); |
285 EXPECT_EQ( | 314 EXPECT_EQ( |
286 GetAppString(NoteTakingHelper::kProdKeepExtensionId, kProdName, false), | 315 GetAppString(NoteTakingHelper::kProdKeepExtensionId, kProdName, false), |
287 GetAppString(apps[1])); | 316 GetAppString(apps[1])); |
288 | 317 |
289 // Now install a random extension and check that it's ignored. | 318 // Now install a random extension and check that it's ignored. |
290 const extensions::ExtensionId kOtherId = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; | 319 const extensions::ExtensionId kOtherId = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; |
291 const std::string kOtherName = "Some Other App"; | 320 const std::string kOtherName = "Some Other App"; |
292 auto other_extension = CreateExtension(kOtherId, kOtherName); | 321 auto other_extension = CreateExtension(kOtherId, kOtherName); |
293 InstallExtension(other_extension.get()); | 322 InstallExtension(other_extension.get(), profile()); |
294 apps = helper()->GetAvailableApps(profile()); | 323 apps = helper()->GetAvailableApps(profile()); |
295 ASSERT_EQ(2u, apps.size()); | 324 ASSERT_EQ(2u, apps.size()); |
296 EXPECT_EQ( | 325 EXPECT_EQ( |
297 GetAppString(NoteTakingHelper::kDevKeepExtensionId, kDevName, false), | 326 GetAppString(NoteTakingHelper::kDevKeepExtensionId, kDevName, false), |
298 GetAppString(apps[0])); | 327 GetAppString(apps[0])); |
299 EXPECT_EQ( | 328 EXPECT_EQ( |
300 GetAppString(NoteTakingHelper::kProdKeepExtensionId, kProdName, false), | 329 GetAppString(NoteTakingHelper::kProdKeepExtensionId, kProdName, false), |
301 GetAppString(apps[1])); | 330 GetAppString(apps[1])); |
302 | 331 |
303 // Mark the prod version as preferred. | 332 // Mark the prod version as preferred. |
304 helper()->SetPreferredApp(profile(), NoteTakingHelper::kProdKeepExtensionId); | 333 helper()->SetPreferredApp(profile(), NoteTakingHelper::kProdKeepExtensionId); |
305 apps = helper()->GetAvailableApps(profile()); | 334 apps = helper()->GetAvailableApps(profile()); |
306 ASSERT_EQ(2u, apps.size()); | 335 ASSERT_EQ(2u, apps.size()); |
307 EXPECT_EQ( | 336 EXPECT_EQ( |
308 GetAppString(NoteTakingHelper::kDevKeepExtensionId, kDevName, false), | 337 GetAppString(NoteTakingHelper::kDevKeepExtensionId, kDevName, false), |
309 GetAppString(apps[0])); | 338 GetAppString(apps[0])); |
310 EXPECT_EQ( | 339 EXPECT_EQ( |
311 GetAppString(NoteTakingHelper::kProdKeepExtensionId, kProdName, true), | 340 GetAppString(NoteTakingHelper::kProdKeepExtensionId, kProdName, true), |
312 GetAppString(apps[1])); | 341 GetAppString(apps[1])); |
313 } | 342 } |
314 | 343 |
315 TEST_F(NoteTakingHelperTest, LaunchChromeApp) { | 344 TEST_F(NoteTakingHelperTest, LaunchChromeApp) { |
316 Init(ENABLE_PALETTE); | 345 Init(ENABLE_PALETTE); |
317 auto extension = | 346 auto extension = |
318 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, "Keep"); | 347 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, "Keep"); |
319 InstallExtension(extension.get()); | 348 InstallExtension(extension.get(), profile()); |
320 | 349 |
321 // Check the Chrome app is launched with the correct parameters. | 350 // Check the Chrome app is launched with the correct parameters. |
322 const base::FilePath kPath("/foo/bar/photo.jpg"); | 351 const base::FilePath kPath("/foo/bar/photo.jpg"); |
323 helper()->LaunchAppForNewNote(profile(), kPath); | 352 helper()->LaunchAppForNewNote(profile(), kPath); |
324 ASSERT_EQ(1u, launched_chrome_apps_.size()); | 353 ASSERT_EQ(1u, launched_chrome_apps_.size()); |
325 EXPECT_EQ(NoteTakingHelper::kProdKeepExtensionId, | 354 EXPECT_EQ(NoteTakingHelper::kProdKeepExtensionId, |
326 launched_chrome_apps_[0].id); | 355 launched_chrome_apps_[0].id); |
327 EXPECT_EQ(kPath, launched_chrome_apps_[0].path); | 356 EXPECT_EQ(kPath, launched_chrome_apps_[0].path); |
328 } | 357 } |
329 | 358 |
330 TEST_F(NoteTakingHelperTest, FallBackIfPreferredAppUnavailable) { | 359 TEST_F(NoteTakingHelperTest, FallBackIfPreferredAppUnavailable) { |
331 Init(ENABLE_PALETTE); | 360 Init(ENABLE_PALETTE); |
332 auto prod_extension = | 361 auto prod_extension = |
333 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, "prod"); | 362 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, "prod"); |
334 InstallExtension(prod_extension.get()); | 363 InstallExtension(prod_extension.get(), profile()); |
335 auto dev_extension = | 364 auto dev_extension = |
336 CreateExtension(NoteTakingHelper::kDevKeepExtensionId, "dev"); | 365 CreateExtension(NoteTakingHelper::kDevKeepExtensionId, "dev"); |
337 InstallExtension(dev_extension.get()); | 366 InstallExtension(dev_extension.get(), profile()); |
338 | 367 |
339 // Set the prod app as the default and check that it's launched. | 368 // Set the prod app as the default and check that it's launched. |
340 helper()->SetPreferredApp(profile(), NoteTakingHelper::kProdKeepExtensionId); | 369 helper()->SetPreferredApp(profile(), NoteTakingHelper::kProdKeepExtensionId); |
341 helper()->LaunchAppForNewNote(profile(), base::FilePath()); | 370 helper()->LaunchAppForNewNote(profile(), base::FilePath()); |
342 ASSERT_EQ(1u, launched_chrome_apps_.size()); | 371 ASSERT_EQ(1u, launched_chrome_apps_.size()); |
343 ASSERT_EQ(NoteTakingHelper::kProdKeepExtensionId, | 372 ASSERT_EQ(NoteTakingHelper::kProdKeepExtensionId, |
344 launched_chrome_apps_[0].id); | 373 launched_chrome_apps_[0].id); |
345 | 374 |
346 // Now uninstall the prod app and check that we fall back to the dev app. | 375 // Now uninstall the prod app and check that we fall back to the dev app. |
347 UninstallExtension(prod_extension.get()); | 376 UninstallExtension(prod_extension.get(), profile()); |
348 launched_chrome_apps_.clear(); | 377 launched_chrome_apps_.clear(); |
349 helper()->LaunchAppForNewNote(profile(), base::FilePath()); | 378 helper()->LaunchAppForNewNote(profile(), base::FilePath()); |
350 ASSERT_EQ(1u, launched_chrome_apps_.size()); | 379 ASSERT_EQ(1u, launched_chrome_apps_.size()); |
351 EXPECT_EQ(NoteTakingHelper::kDevKeepExtensionId, launched_chrome_apps_[0].id); | 380 EXPECT_EQ(NoteTakingHelper::kDevKeepExtensionId, launched_chrome_apps_[0].id); |
352 } | 381 } |
353 | 382 |
354 TEST_F(NoteTakingHelperTest, ArcInitiallyDisabled) { | 383 TEST_F(NoteTakingHelperTest, ArcInitiallyDisabled) { |
355 Init(ENABLE_PALETTE); | 384 Init(ENABLE_PALETTE); |
356 EXPECT_FALSE(helper()->android_enabled()); | 385 EXPECT_FALSE(helper()->android_enabled()); |
357 EXPECT_FALSE(helper()->android_apps_received()); | 386 EXPECT_FALSE(helper()->android_apps_received()); |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
469 EXPECT_EQ(GetIntentString(kPackage, GetArcUrl(kRemovablePath)), | 498 EXPECT_EQ(GetIntentString(kPackage, GetArcUrl(kRemovablePath)), |
470 GetIntentString(intent_helper_.handled_intents()[0])); | 499 GetIntentString(intent_helper_.handled_intents()[0])); |
471 | 500 |
472 // When a path that isn't accessible to ARC is passed, the request should be | 501 // When a path that isn't accessible to ARC is passed, the request should be |
473 // dropped. | 502 // dropped. |
474 intent_helper_.clear_handled_intents(); | 503 intent_helper_.clear_handled_intents(); |
475 helper()->LaunchAppForNewNote(profile(), base::FilePath("/bad/path.jpg")); | 504 helper()->LaunchAppForNewNote(profile(), base::FilePath("/bad/path.jpg")); |
476 EXPECT_TRUE(intent_helper_.handled_intents().empty()); | 505 EXPECT_TRUE(intent_helper_.handled_intents().empty()); |
477 } | 506 } |
478 | 507 |
479 TEST_F(NoteTakingHelperTest, NotifyObserver) { | 508 TEST_F(NoteTakingHelperTest, NotifyObserverAboutAndroidApps) { |
480 Init(ENABLE_PALETTE | ENABLE_ARC); | 509 Init(ENABLE_PALETTE | ENABLE_ARC); |
481 TestObserver observer; | 510 TestObserver observer; |
482 | 511 |
483 // Let the app-fetching callback run and check that the observer is notified. | 512 // Let the app-fetching callback run and check that the observer is notified. |
484 base::RunLoop().RunUntilIdle(); | 513 base::RunLoop().RunUntilIdle(); |
485 EXPECT_EQ(1, observer.num_updates()); | 514 EXPECT_EQ(1, observer.num_updates()); |
486 | 515 |
487 // Disabling and enabling ARC should also notify the observer (and enabling | 516 // Disabling and enabling ARC should also notify the observer (and enabling |
488 // should request apps again). | 517 // should request apps again). |
489 profile()->GetPrefs()->SetBoolean(prefs::kArcEnabled, false); | 518 profile()->GetPrefs()->SetBoolean(prefs::kArcEnabled, false); |
490 EXPECT_EQ(2, observer.num_updates()); | 519 EXPECT_EQ(2, observer.num_updates()); |
491 profile()->GetPrefs()->SetBoolean(prefs::kArcEnabled, true); | 520 profile()->GetPrefs()->SetBoolean(prefs::kArcEnabled, true); |
492 EXPECT_EQ(3, observer.num_updates()); | 521 EXPECT_EQ(3, observer.num_updates()); |
493 base::RunLoop().RunUntilIdle(); | 522 base::RunLoop().RunUntilIdle(); |
494 EXPECT_EQ(4, observer.num_updates()); | 523 EXPECT_EQ(4, observer.num_updates()); |
495 | 524 |
496 // Update intent filters and check that the observer is notified again after | 525 // Update intent filters and check that the observer is notified again after |
497 // apps are received. | 526 // apps are received. |
498 helper()->OnIntentFiltersUpdated(); | 527 helper()->OnIntentFiltersUpdated(); |
499 EXPECT_EQ(4, observer.num_updates()); | 528 EXPECT_EQ(4, observer.num_updates()); |
500 base::RunLoop().RunUntilIdle(); | 529 base::RunLoop().RunUntilIdle(); |
501 EXPECT_EQ(5, observer.num_updates()); | 530 EXPECT_EQ(5, observer.num_updates()); |
502 } | 531 } |
503 | 532 |
| 533 TEST_F(NoteTakingHelperTest, NotifyObserverAboutChromeApps) { |
| 534 Init(ENABLE_PALETTE); |
| 535 TestObserver observer; |
| 536 ASSERT_EQ(0, observer.num_updates()); |
| 537 |
| 538 // Notify that the prod Keep app was installed for the initial profile. Chrome |
| 539 // extensions are queried dynamically when GetAvailableApps() is called, so we |
| 540 // don't need to actually install it. |
| 541 auto keep_extension = |
| 542 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, "Keep"); |
| 543 InstallExtension(keep_extension.get(), profile()); |
| 544 EXPECT_EQ(1, observer.num_updates()); |
| 545 |
| 546 // Unloading the extension should also trigger a notification. |
| 547 UninstallExtension(keep_extension.get(), profile()); |
| 548 EXPECT_EQ(2, observer.num_updates()); |
| 549 |
| 550 // Non-whitelisted apps shouldn't trigger notifications. |
| 551 auto other_extension = |
| 552 CreateExtension("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "Some Other App"); |
| 553 InstallExtension(other_extension.get(), profile()); |
| 554 EXPECT_EQ(2, observer.num_updates()); |
| 555 UninstallExtension(other_extension.get(), profile()); |
| 556 EXPECT_EQ(2, observer.num_updates()); |
| 557 |
| 558 // Add a second profile and check that it triggers notifications too. |
| 559 observer.reset_num_updates(); |
| 560 const std::string kSecondProfileName = "second-profile"; |
| 561 TestingProfile* second_profile = |
| 562 profile_manager_->CreateTestingProfile(kSecondProfileName); |
| 563 InitExtensionService(second_profile); |
| 564 EXPECT_EQ(0, observer.num_updates()); |
| 565 InstallExtension(keep_extension.get(), second_profile); |
| 566 EXPECT_EQ(1, observer.num_updates()); |
| 567 UninstallExtension(keep_extension.get(), second_profile); |
| 568 EXPECT_EQ(2, observer.num_updates()); |
| 569 profile_manager_->DeleteTestingProfile(kSecondProfileName); |
| 570 } |
| 571 |
504 } // namespace chromeos | 572 } // namespace chromeos |
OLD | NEW |