| 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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 void SetUp() override { | 118 void SetUp() override { |
| 111 // This is needed to avoid log spam due to ArcSessionManager's | 119 // This is needed to avoid log spam due to ArcSessionManager's |
| 112 // RemoveArcData() calls failing. | 120 // RemoveArcData() calls failing. |
| 113 if (DBusThreadManager::IsInitialized()) | 121 if (DBusThreadManager::IsInitialized()) |
| 114 DBusThreadManager::Shutdown(); | 122 DBusThreadManager::Shutdown(); |
| 115 session_manager_client_ = new FakeSessionManagerClient(); | 123 session_manager_client_ = new FakeSessionManagerClient(); |
| 116 session_manager_client_->set_arc_available(true); | 124 session_manager_client_->set_arc_available(true); |
| 117 DBusThreadManager::GetSetterForTesting()->SetSessionManagerClient( | 125 DBusThreadManager::GetSetterForTesting()->SetSessionManagerClient( |
| 118 std::unique_ptr<SessionManagerClient>(session_manager_client_)); | 126 std::unique_ptr<SessionManagerClient>(session_manager_client_)); |
| 119 | 127 |
| 128 profile_manager_.reset( |
| 129 new TestingProfileManager(TestingBrowserProcess::GetGlobal())); |
| 130 ASSERT_TRUE(profile_manager_->SetUp()); |
| 120 BrowserWithTestWindowTest::SetUp(); | 131 BrowserWithTestWindowTest::SetUp(); |
| 121 | 132 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 } | 133 } |
| 130 | 134 |
| 131 void TearDown() override { | 135 void TearDown() override { |
| 132 if (initialized_) { | 136 if (initialized_) { |
| 133 NoteTakingHelper::Shutdown(); | 137 NoteTakingHelper::Shutdown(); |
| 134 arc_test_.TearDown(); | 138 arc_test_.TearDown(); |
| 135 } | 139 } |
| 136 extensions::ExtensionSystem::Get(profile())->Shutdown(); | 140 extensions::ExtensionSystem::Get(profile())->Shutdown(); |
| 137 BrowserWithTestWindowTest::TearDown(); | 141 BrowserWithTestWindowTest::TearDown(); |
| 138 DBusThreadManager::Shutdown(); | 142 DBusThreadManager::Shutdown(); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 .Build()) | 200 .Build()) |
| 197 .Build()) | 201 .Build()) |
| 198 .Build()) | 202 .Build()) |
| 199 .Build(); | 203 .Build(); |
| 200 return extensions::ExtensionBuilder() | 204 return extensions::ExtensionBuilder() |
| 201 .SetManifest(std::move(manifest)) | 205 .SetManifest(std::move(manifest)) |
| 202 .SetID(id) | 206 .SetID(id) |
| 203 .Build(); | 207 .Build(); |
| 204 } | 208 } |
| 205 | 209 |
| 206 // Installs or uninstalls the passed-in extension. | 210 // Initializes extensions-related objects for |profile|. Tests only need to |
| 207 void InstallExtension(const extensions::Extension* extension) { | 211 // call this if they create additional profiles of their own. |
| 208 extensions::ExtensionSystem::Get(profile()) | 212 void InitExtensionService(Profile* profile) { |
| 213 extensions::TestExtensionSystem* extension_system = |
| 214 static_cast<extensions::TestExtensionSystem*>( |
| 215 extensions::ExtensionSystem::Get(profile)); |
| 216 extension_system->CreateExtensionService( |
| 217 base::CommandLine::ForCurrentProcess(), |
| 218 base::FilePath() /* install_directory */, |
| 219 false /* autoupdate_enabled */); |
| 220 } |
| 221 |
| 222 // Installs or uninstalls |extension| in |profile|. |
| 223 void InstallExtension(const extensions::Extension* extension, |
| 224 Profile* profile) { |
| 225 extensions::ExtensionSystem::Get(profile) |
| 209 ->extension_service() | 226 ->extension_service() |
| 210 ->AddExtension(extension); | 227 ->AddExtension(extension); |
| 211 } | 228 } |
| 212 void UninstallExtension(const extensions::Extension* extension) { | 229 void UninstallExtension(const extensions::Extension* extension, |
| 213 extensions::ExtensionSystem::Get(profile()) | 230 Profile* profile) { |
| 231 extensions::ExtensionSystem::Get(profile) |
| 214 ->extension_service() | 232 ->extension_service() |
| 215 ->UnloadExtension(extension->id(), | 233 ->UnloadExtension(extension->id(), |
| 216 extensions::UnloadedExtensionInfo::REASON_UNINSTALL); | 234 extensions::UnloadedExtensionInfo::REASON_UNINSTALL); |
| 217 } | 235 } |
| 218 | 236 |
| 237 // BrowserWithTestWindowTest: |
| 238 TestingProfile* CreateProfile() override { |
| 239 // Ensure that the profile created by BrowserWithTestWindowTest is |
| 240 // registered with |profile_manager_|. |
| 241 return profile_manager_->CreateTestingProfile(kTestProfileName); |
| 242 } |
| 243 void DestroyProfile(TestingProfile* profile) override { |
| 244 return profile_manager_->DeleteTestingProfile(kTestProfileName); |
| 245 } |
| 246 |
| 219 // Info about launched Chrome apps, in the order they were launched. | 247 // Info about launched Chrome apps, in the order they were launched. |
| 220 std::vector<ChromeAppLaunchInfo> launched_chrome_apps_; | 248 std::vector<ChromeAppLaunchInfo> launched_chrome_apps_; |
| 221 | 249 |
| 222 arc::FakeIntentHelperInstance intent_helper_; | 250 arc::FakeIntentHelperInstance intent_helper_; |
| 251 std::unique_ptr<TestingProfileManager> profile_manager_; |
| 223 | 252 |
| 224 private: | 253 private: |
| 225 // Callback registered with the helper to record Chrome app launch requests. | 254 // Callback registered with the helper to record Chrome app launch requests. |
| 226 void LaunchChromeApp(Profile* passed_profile, | 255 void LaunchChromeApp(Profile* passed_profile, |
| 227 const extensions::Extension* extension, | 256 const extensions::Extension* extension, |
| 228 std::unique_ptr<app_runtime::ActionData> action_data, | 257 std::unique_ptr<app_runtime::ActionData> action_data, |
| 229 const base::FilePath& path) { | 258 const base::FilePath& path) { |
| 230 EXPECT_EQ(profile(), passed_profile); | 259 EXPECT_EQ(profile(), passed_profile); |
| 231 EXPECT_EQ(app_runtime::ActionType::ACTION_TYPE_NEW_NOTE, | 260 EXPECT_EQ(app_runtime::ActionType::ACTION_TYPE_NEW_NOTE, |
| 232 action_data->action_type); | 261 action_data->action_type); |
| 233 launched_chrome_apps_.push_back(ChromeAppLaunchInfo{extension->id(), path}); | 262 launched_chrome_apps_.push_back(ChromeAppLaunchInfo{extension->id(), path}); |
| 234 } | 263 } |
| 235 | 264 |
| 236 // Has Init() been called? | 265 // Has Init() been called? |
| 237 bool initialized_ = false; | 266 bool initialized_ = false; |
| 238 | 267 |
| 239 FakeSessionManagerClient* session_manager_client_ = nullptr; // Not owned. | 268 FakeSessionManagerClient* session_manager_client_ = nullptr; // Not owned. |
| 240 | |
| 241 ArcAppTest arc_test_; | 269 ArcAppTest arc_test_; |
| 242 | 270 |
| 243 DISALLOW_COPY_AND_ASSIGN(NoteTakingHelperTest); | 271 DISALLOW_COPY_AND_ASSIGN(NoteTakingHelperTest); |
| 244 }; | 272 }; |
| 245 | 273 |
| 246 TEST_F(NoteTakingHelperTest, PaletteNotEnabled) { | 274 TEST_F(NoteTakingHelperTest, PaletteNotEnabled) { |
| 247 // Without the palette enabled, IsAppAvailable() should return false. | 275 // Without the palette enabled, IsAppAvailable() should return false. |
| 248 Init(0); | 276 Init(0); |
| 249 auto extension = | 277 auto extension = |
| 250 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, "Keep"); | 278 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, "Keep"); |
| 251 InstallExtension(extension.get()); | 279 InstallExtension(extension.get(), profile()); |
| 252 EXPECT_FALSE(helper()->IsAppAvailable(profile())); | 280 EXPECT_FALSE(helper()->IsAppAvailable(profile())); |
| 253 } | 281 } |
| 254 | 282 |
| 255 TEST_F(NoteTakingHelperTest, ListChromeApps) { | 283 TEST_F(NoteTakingHelperTest, ListChromeApps) { |
| 256 Init(ENABLE_PALETTE); | 284 Init(ENABLE_PALETTE); |
| 257 | 285 |
| 258 // Start out without any note-taking apps installed. | 286 // Start out without any note-taking apps installed. |
| 259 EXPECT_FALSE(helper()->IsAppAvailable(profile())); | 287 EXPECT_FALSE(helper()->IsAppAvailable(profile())); |
| 260 EXPECT_TRUE(helper()->GetAvailableApps(profile()).empty()); | 288 EXPECT_TRUE(helper()->GetAvailableApps(profile()).empty()); |
| 261 | 289 |
| 262 // If only the prod version of the app is installed, it should be returned. | 290 // If only the prod version of the app is installed, it should be returned. |
| 263 const std::string kProdName = "Google Keep [prod]"; | 291 const std::string kProdName = "Google Keep [prod]"; |
| 264 auto prod_extension = | 292 auto prod_extension = |
| 265 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, kProdName); | 293 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, kProdName); |
| 266 InstallExtension(prod_extension.get()); | 294 InstallExtension(prod_extension.get(), profile()); |
| 267 EXPECT_TRUE(helper()->IsAppAvailable(profile())); | 295 EXPECT_TRUE(helper()->IsAppAvailable(profile())); |
| 268 std::vector<NoteTakingAppInfo> apps = helper()->GetAvailableApps(profile()); | 296 std::vector<NoteTakingAppInfo> apps = helper()->GetAvailableApps(profile()); |
| 269 ASSERT_EQ(1u, apps.size()); | 297 ASSERT_EQ(1u, apps.size()); |
| 270 EXPECT_EQ( | 298 EXPECT_EQ( |
| 271 GetAppString(NoteTakingHelper::kProdKeepExtensionId, kProdName, false), | 299 GetAppString(NoteTakingHelper::kProdKeepExtensionId, kProdName, false), |
| 272 GetAppString(apps[0])); | 300 GetAppString(apps[0])); |
| 273 | 301 |
| 274 // If the dev version is also installed, it should be listed before the prod | 302 // If the dev version is also installed, it should be listed before the prod |
| 275 // version. | 303 // version. |
| 276 const std::string kDevName = "Google Keep [dev]"; | 304 const std::string kDevName = "Google Keep [dev]"; |
| 277 auto dev_extension = | 305 auto dev_extension = |
| 278 CreateExtension(NoteTakingHelper::kDevKeepExtensionId, kDevName); | 306 CreateExtension(NoteTakingHelper::kDevKeepExtensionId, kDevName); |
| 279 InstallExtension(dev_extension.get()); | 307 InstallExtension(dev_extension.get(), profile()); |
| 280 apps = helper()->GetAvailableApps(profile()); | 308 apps = helper()->GetAvailableApps(profile()); |
| 281 ASSERT_EQ(2u, apps.size()); | 309 ASSERT_EQ(2u, apps.size()); |
| 282 EXPECT_EQ( | 310 EXPECT_EQ( |
| 283 GetAppString(NoteTakingHelper::kDevKeepExtensionId, kDevName, false), | 311 GetAppString(NoteTakingHelper::kDevKeepExtensionId, kDevName, false), |
| 284 GetAppString(apps[0])); | 312 GetAppString(apps[0])); |
| 285 EXPECT_EQ( | 313 EXPECT_EQ( |
| 286 GetAppString(NoteTakingHelper::kProdKeepExtensionId, kProdName, false), | 314 GetAppString(NoteTakingHelper::kProdKeepExtensionId, kProdName, false), |
| 287 GetAppString(apps[1])); | 315 GetAppString(apps[1])); |
| 288 | 316 |
| 289 // Now install a random extension and check that it's ignored. | 317 // Now install a random extension and check that it's ignored. |
| 290 const extensions::ExtensionId kOtherId = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; | 318 const extensions::ExtensionId kOtherId = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; |
| 291 const std::string kOtherName = "Some Other App"; | 319 const std::string kOtherName = "Some Other App"; |
| 292 auto other_extension = CreateExtension(kOtherId, kOtherName); | 320 auto other_extension = CreateExtension(kOtherId, kOtherName); |
| 293 InstallExtension(other_extension.get()); | 321 InstallExtension(other_extension.get(), profile()); |
| 294 apps = helper()->GetAvailableApps(profile()); | 322 apps = helper()->GetAvailableApps(profile()); |
| 295 ASSERT_EQ(2u, apps.size()); | 323 ASSERT_EQ(2u, apps.size()); |
| 296 EXPECT_EQ( | 324 EXPECT_EQ( |
| 297 GetAppString(NoteTakingHelper::kDevKeepExtensionId, kDevName, false), | 325 GetAppString(NoteTakingHelper::kDevKeepExtensionId, kDevName, false), |
| 298 GetAppString(apps[0])); | 326 GetAppString(apps[0])); |
| 299 EXPECT_EQ( | 327 EXPECT_EQ( |
| 300 GetAppString(NoteTakingHelper::kProdKeepExtensionId, kProdName, false), | 328 GetAppString(NoteTakingHelper::kProdKeepExtensionId, kProdName, false), |
| 301 GetAppString(apps[1])); | 329 GetAppString(apps[1])); |
| 302 | 330 |
| 303 // Mark the prod version as preferred. | 331 // Mark the prod version as preferred. |
| 304 helper()->SetPreferredApp(profile(), NoteTakingHelper::kProdKeepExtensionId); | 332 helper()->SetPreferredApp(profile(), NoteTakingHelper::kProdKeepExtensionId); |
| 305 apps = helper()->GetAvailableApps(profile()); | 333 apps = helper()->GetAvailableApps(profile()); |
| 306 ASSERT_EQ(2u, apps.size()); | 334 ASSERT_EQ(2u, apps.size()); |
| 307 EXPECT_EQ( | 335 EXPECT_EQ( |
| 308 GetAppString(NoteTakingHelper::kDevKeepExtensionId, kDevName, false), | 336 GetAppString(NoteTakingHelper::kDevKeepExtensionId, kDevName, false), |
| 309 GetAppString(apps[0])); | 337 GetAppString(apps[0])); |
| 310 EXPECT_EQ( | 338 EXPECT_EQ( |
| 311 GetAppString(NoteTakingHelper::kProdKeepExtensionId, kProdName, true), | 339 GetAppString(NoteTakingHelper::kProdKeepExtensionId, kProdName, true), |
| 312 GetAppString(apps[1])); | 340 GetAppString(apps[1])); |
| 313 } | 341 } |
| 314 | 342 |
| 315 TEST_F(NoteTakingHelperTest, LaunchChromeApp) { | 343 TEST_F(NoteTakingHelperTest, LaunchChromeApp) { |
| 316 Init(ENABLE_PALETTE); | 344 Init(ENABLE_PALETTE); |
| 317 auto extension = | 345 auto extension = |
| 318 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, "Keep"); | 346 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, "Keep"); |
| 319 InstallExtension(extension.get()); | 347 InstallExtension(extension.get(), profile()); |
| 320 | 348 |
| 321 // Check the Chrome app is launched with the correct parameters. | 349 // Check the Chrome app is launched with the correct parameters. |
| 322 const base::FilePath kPath("/foo/bar/photo.jpg"); | 350 const base::FilePath kPath("/foo/bar/photo.jpg"); |
| 323 helper()->LaunchAppForNewNote(profile(), kPath); | 351 helper()->LaunchAppForNewNote(profile(), kPath); |
| 324 ASSERT_EQ(1u, launched_chrome_apps_.size()); | 352 ASSERT_EQ(1u, launched_chrome_apps_.size()); |
| 325 EXPECT_EQ(NoteTakingHelper::kProdKeepExtensionId, | 353 EXPECT_EQ(NoteTakingHelper::kProdKeepExtensionId, |
| 326 launched_chrome_apps_[0].id); | 354 launched_chrome_apps_[0].id); |
| 327 EXPECT_EQ(kPath, launched_chrome_apps_[0].path); | 355 EXPECT_EQ(kPath, launched_chrome_apps_[0].path); |
| 328 } | 356 } |
| 329 | 357 |
| 330 TEST_F(NoteTakingHelperTest, FallBackIfPreferredAppUnavailable) { | 358 TEST_F(NoteTakingHelperTest, FallBackIfPreferredAppUnavailable) { |
| 331 Init(ENABLE_PALETTE); | 359 Init(ENABLE_PALETTE); |
| 332 auto prod_extension = | 360 auto prod_extension = |
| 333 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, "prod"); | 361 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, "prod"); |
| 334 InstallExtension(prod_extension.get()); | 362 InstallExtension(prod_extension.get(), profile()); |
| 335 auto dev_extension = | 363 auto dev_extension = |
| 336 CreateExtension(NoteTakingHelper::kDevKeepExtensionId, "dev"); | 364 CreateExtension(NoteTakingHelper::kDevKeepExtensionId, "dev"); |
| 337 InstallExtension(dev_extension.get()); | 365 InstallExtension(dev_extension.get(), profile()); |
| 338 | 366 |
| 339 // Set the prod app as the default and check that it's launched. | 367 // Set the prod app as the default and check that it's launched. |
| 340 helper()->SetPreferredApp(profile(), NoteTakingHelper::kProdKeepExtensionId); | 368 helper()->SetPreferredApp(profile(), NoteTakingHelper::kProdKeepExtensionId); |
| 341 helper()->LaunchAppForNewNote(profile(), base::FilePath()); | 369 helper()->LaunchAppForNewNote(profile(), base::FilePath()); |
| 342 ASSERT_EQ(1u, launched_chrome_apps_.size()); | 370 ASSERT_EQ(1u, launched_chrome_apps_.size()); |
| 343 ASSERT_EQ(NoteTakingHelper::kProdKeepExtensionId, | 371 ASSERT_EQ(NoteTakingHelper::kProdKeepExtensionId, |
| 344 launched_chrome_apps_[0].id); | 372 launched_chrome_apps_[0].id); |
| 345 | 373 |
| 346 // Now uninstall the prod app and check that we fall back to the dev app. | 374 // Now uninstall the prod app and check that we fall back to the dev app. |
| 347 UninstallExtension(prod_extension.get()); | 375 UninstallExtension(prod_extension.get(), profile()); |
| 348 launched_chrome_apps_.clear(); | 376 launched_chrome_apps_.clear(); |
| 349 helper()->LaunchAppForNewNote(profile(), base::FilePath()); | 377 helper()->LaunchAppForNewNote(profile(), base::FilePath()); |
| 350 ASSERT_EQ(1u, launched_chrome_apps_.size()); | 378 ASSERT_EQ(1u, launched_chrome_apps_.size()); |
| 351 EXPECT_EQ(NoteTakingHelper::kDevKeepExtensionId, launched_chrome_apps_[0].id); | 379 EXPECT_EQ(NoteTakingHelper::kDevKeepExtensionId, launched_chrome_apps_[0].id); |
| 352 } | 380 } |
| 353 | 381 |
| 354 TEST_F(NoteTakingHelperTest, ArcInitiallyDisabled) { | 382 TEST_F(NoteTakingHelperTest, ArcInitiallyDisabled) { |
| 355 Init(ENABLE_PALETTE); | 383 Init(ENABLE_PALETTE); |
| 356 EXPECT_FALSE(helper()->android_enabled()); | 384 EXPECT_FALSE(helper()->android_enabled()); |
| 357 EXPECT_FALSE(helper()->android_apps_received()); | 385 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)), | 497 EXPECT_EQ(GetIntentString(kPackage, GetArcUrl(kRemovablePath)), |
| 470 GetIntentString(intent_helper_.handled_intents()[0])); | 498 GetIntentString(intent_helper_.handled_intents()[0])); |
| 471 | 499 |
| 472 // When a path that isn't accessible to ARC is passed, the request should be | 500 // When a path that isn't accessible to ARC is passed, the request should be |
| 473 // dropped. | 501 // dropped. |
| 474 intent_helper_.clear_handled_intents(); | 502 intent_helper_.clear_handled_intents(); |
| 475 helper()->LaunchAppForNewNote(profile(), base::FilePath("/bad/path.jpg")); | 503 helper()->LaunchAppForNewNote(profile(), base::FilePath("/bad/path.jpg")); |
| 476 EXPECT_TRUE(intent_helper_.handled_intents().empty()); | 504 EXPECT_TRUE(intent_helper_.handled_intents().empty()); |
| 477 } | 505 } |
| 478 | 506 |
| 479 TEST_F(NoteTakingHelperTest, NotifyObserver) { | 507 TEST_F(NoteTakingHelperTest, NotifyObserverAboutAndroidApps) { |
| 480 Init(ENABLE_PALETTE | ENABLE_ARC); | 508 Init(ENABLE_PALETTE | ENABLE_ARC); |
| 481 TestObserver observer; | 509 TestObserver observer; |
| 482 | 510 |
| 483 // Let the app-fetching callback run and check that the observer is notified. | 511 // Let the app-fetching callback run and check that the observer is notified. |
| 484 base::RunLoop().RunUntilIdle(); | 512 base::RunLoop().RunUntilIdle(); |
| 485 EXPECT_EQ(1, observer.num_updates()); | 513 EXPECT_EQ(1, observer.num_updates()); |
| 486 | 514 |
| 487 // Disabling and enabling ARC should also notify the observer (and enabling | 515 // Disabling and enabling ARC should also notify the observer (and enabling |
| 488 // should request apps again). | 516 // should request apps again). |
| 489 profile()->GetPrefs()->SetBoolean(prefs::kArcEnabled, false); | 517 profile()->GetPrefs()->SetBoolean(prefs::kArcEnabled, false); |
| 490 EXPECT_EQ(2, observer.num_updates()); | 518 EXPECT_EQ(2, observer.num_updates()); |
| 491 profile()->GetPrefs()->SetBoolean(prefs::kArcEnabled, true); | 519 profile()->GetPrefs()->SetBoolean(prefs::kArcEnabled, true); |
| 492 EXPECT_EQ(3, observer.num_updates()); | 520 EXPECT_EQ(3, observer.num_updates()); |
| 493 base::RunLoop().RunUntilIdle(); | 521 base::RunLoop().RunUntilIdle(); |
| 494 EXPECT_EQ(4, observer.num_updates()); | 522 EXPECT_EQ(4, observer.num_updates()); |
| 495 | 523 |
| 496 // Update intent filters and check that the observer is notified again after | 524 // Update intent filters and check that the observer is notified again after |
| 497 // apps are received. | 525 // apps are received. |
| 498 helper()->OnIntentFiltersUpdated(); | 526 helper()->OnIntentFiltersUpdated(); |
| 499 EXPECT_EQ(4, observer.num_updates()); | 527 EXPECT_EQ(4, observer.num_updates()); |
| 500 base::RunLoop().RunUntilIdle(); | 528 base::RunLoop().RunUntilIdle(); |
| 501 EXPECT_EQ(5, observer.num_updates()); | 529 EXPECT_EQ(5, observer.num_updates()); |
| 502 } | 530 } |
| 503 | 531 |
| 532 TEST_F(NoteTakingHelperTest, NotifyObserverAboutChromeApps) { |
| 533 Init(ENABLE_PALETTE); |
| 534 TestObserver observer; |
| 535 ASSERT_EQ(0, observer.num_updates()); |
| 536 |
| 537 // Notify that the prod Keep app was installed for the initial profile. Chrome |
| 538 // extensions are queried dynamically when GetAvailableApps() is called, so we |
| 539 // don't need to actually install it. |
| 540 auto keep_extension = |
| 541 CreateExtension(NoteTakingHelper::kProdKeepExtensionId, "Keep"); |
| 542 InstallExtension(keep_extension.get(), profile()); |
| 543 EXPECT_EQ(1, observer.num_updates()); |
| 544 |
| 545 // Unloading the extension should also trigger a notification. |
| 546 UninstallExtension(keep_extension.get(), profile()); |
| 547 EXPECT_EQ(2, observer.num_updates()); |
| 548 |
| 549 // Non-whitelisted apps shouldn't trigger notifications. |
| 550 auto other_extension = |
| 551 CreateExtension("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "Some Other App"); |
| 552 InstallExtension(other_extension.get(), profile()); |
| 553 EXPECT_EQ(2, observer.num_updates()); |
| 554 UninstallExtension(other_extension.get(), profile()); |
| 555 EXPECT_EQ(2, observer.num_updates()); |
| 556 |
| 557 // Add a second profile and check that it triggers notifications too. |
| 558 const std::string kSecondProfileName = "second-profile"; |
| 559 TestingProfile* second_profile = |
| 560 profile_manager_->CreateTestingProfile(kSecondProfileName); |
| 561 InitExtensionService(second_profile); |
| 562 ASSERT_EQ(2, observer.num_updates()); |
| 563 InstallExtension(keep_extension.get(), second_profile); |
| 564 EXPECT_EQ(3, observer.num_updates()); |
| 565 UninstallExtension(keep_extension.get(), second_profile); |
| 566 EXPECT_EQ(4, observer.num_updates()); |
| 567 profile_manager_->DeleteTestingProfile(kSecondProfileName); |
| 568 } |
| 569 |
| 504 } // namespace chromeos | 570 } // namespace chromeos |
| OLD | NEW |