1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
|
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "apps/app_restore_service.h"
#include "apps/app_restore_service_factory.h"
#include "apps/saved_files_service.h"
#include "base/files/file_util.h"
#include "base/threading/thread_restrictions.h"
#include "build/build_config.h"
#include "chrome/browser/apps/platform_apps/app_browsertest_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "content/public/browser/browser_context.h"
#include "content/public/test/browser_test.h"
#include "extensions/browser/api/file_system/file_system_api.h"
#include "extensions/browser/api/file_system/saved_file_entry.h"
#include "extensions/browser/extension_host.h"
#include "extensions/browser/extension_host_test_helper.h"
#include "extensions/browser/extension_prefs.h"
#include "extensions/common/extension.h"
#include "extensions/test/extension_test_message_listener.h"
using extensions::Extension;
using extensions::ExtensionPrefs;
using extensions::ExtensionSystem;
using extensions::FileSystemChooseEntryFunction;
using extensions::SavedFileEntry;
// TODO(benwells): Move PlatformAppBrowserTest to apps namespace in apps
// component.
using extensions::PlatformAppBrowserTest;
namespace apps {
// Tests that a running app is recorded in the preferences as such.
IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, RunningAppsAreRecorded) {
extensions::ExtensionHostTestHelper host_helper(profile());
const Extension* extension = LoadExtension(
test_data_dir_.AppendASCII("platform_apps/restart_test"));
ASSERT_TRUE(extension);
ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(browser()->profile());
// App is running.
ASSERT_TRUE(extension_prefs->IsExtensionRunning(extension->id()));
// Wait for the extension to get suspended.
host_helper.WaitForHostDestroyed();
// App isn't running because it got suspended.
ASSERT_FALSE(extension_prefs->IsExtensionRunning(extension->id()));
// Pretend that the app is supposed to be running.
extension_prefs->SetExtensionRunning(extension->id(), true);
ExtensionTestMessageListener restart_listener("onRestarted");
apps::AppRestoreServiceFactory::GetForBrowserContext(browser()->profile())
->HandleStartup(true);
EXPECT_TRUE(restart_listener.WaitUntilSatisfied());
}
// Tests that apps are recorded in the preferences as active when and only when
// they have visible windows.
IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, ActiveAppsAreRecorded) {
ExtensionTestMessageListener ready_listener("ready",
ReplyBehavior::kWillReply);
const Extension* extension =
LoadExtension(test_data_dir_.AppendASCII("platform_apps/active_test"));
ASSERT_TRUE(extension);
ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(browser()->profile());
ASSERT_TRUE(ready_listener.WaitUntilSatisfied());
// Open a visible window and check the app is marked active.
ready_listener.Reply("create");
ready_listener.Reset();
ASSERT_TRUE(ready_listener.WaitUntilSatisfied());
ASSERT_TRUE(extension_prefs->IsActive(extension->id()));
// Close the window, then open a minimized window and check the app is active.
ready_listener.Reply("closeLastWindow");
ready_listener.Reset();
ASSERT_TRUE(ready_listener.WaitUntilSatisfied());
ready_listener.Reply("createMinimized");
ready_listener.Reset();
ASSERT_TRUE(ready_listener.WaitUntilSatisfied());
ASSERT_TRUE(extension_prefs->IsActive(extension->id()));
// Close the window, then open a hidden window and check the app is not
// marked active.
ready_listener.Reply("closeLastWindow");
ready_listener.Reset();
ASSERT_TRUE(ready_listener.WaitUntilSatisfied());
ready_listener.Reply("createHidden");
ready_listener.Reset();
ASSERT_TRUE(ready_listener.WaitUntilSatisfied());
ASSERT_FALSE(extension_prefs->IsActive(extension->id()));
// Open another window and check the app is marked active.
ready_listener.Reply("create");
ready_listener.Reset();
ASSERT_TRUE(ready_listener.WaitUntilSatisfied());
ASSERT_TRUE(extension_prefs->IsActive(extension->id()));
// Close the visible window and check the app has been marked inactive.
ready_listener.Reply("closeLastWindow");
ready_listener.Reset();
ASSERT_TRUE(ready_listener.WaitUntilSatisfied());
ASSERT_FALSE(extension_prefs->IsActive(extension->id()));
// Close the last window and exit.
ready_listener.Reply("closeLastWindow");
ready_listener.Reset();
ASSERT_TRUE(ready_listener.WaitUntilSatisfied());
ready_listener.Reply("exit");
}
IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, FileAccessIsSavedToPrefs) {
base::ScopedAllowBlockingForTesting allow_blocking;
base::ScopedTempDir temp_directory;
ASSERT_TRUE(temp_directory.CreateUniqueTempDir());
base::FilePath temp_file;
ASSERT_TRUE(
base::CreateTemporaryFileInDir(temp_directory.GetPath(), &temp_file));
const FileSystemChooseEntryFunction::TestOptions test_options{
.path_to_be_picked = &temp_file};
auto reset_options =
FileSystemChooseEntryFunction::SetOptionsForTesting(test_options);
FileSystemChooseEntryFunction::RegisterTempExternalFileSystemForTest(
"temp", temp_directory.GetPath());
extensions::ExtensionHostTestHelper host_helper(profile());
const Extension* extension = LoadAndLaunchPlatformApp(
"file_access_saved_to_prefs_test", "fileWritten");
ASSERT_TRUE(extension);
SavedFilesService* saved_files_service = SavedFilesService::Get(profile());
std::vector<SavedFileEntry> file_entries =
saved_files_service->GetAllFileEntries(extension->id());
// One for the read-only file entry and one for the writable file entry.
ASSERT_EQ(2u, file_entries.size());
host_helper.WaitForHostDestroyed();
file_entries = saved_files_service->GetAllFileEntries(extension->id());
// File entries should be cleared when the extension is suspended.
ASSERT_TRUE(file_entries.empty());
}
// Flaky: crbug.com/269613
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN)
#define MAYBE_FileAccessIsRestored DISABLED_FileAccessIsRestored
#else
#define MAYBE_FileAccessIsRestored FileAccessIsRestored
#endif
IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, MAYBE_FileAccessIsRestored) {
base::ScopedAllowBlockingForTesting allow_blocking;
base::ScopedTempDir temp_directory;
ASSERT_TRUE(temp_directory.CreateUniqueTempDir());
base::FilePath temp_file;
ASSERT_TRUE(
base::CreateTemporaryFileInDir(temp_directory.GetPath(), &temp_file));
const FileSystemChooseEntryFunction::TestOptions test_options{
.path_to_be_picked = &temp_file};
auto reset_options =
FileSystemChooseEntryFunction::SetOptionsForTesting(test_options);
FileSystemChooseEntryFunction::RegisterTempExternalFileSystemForTest(
"temp", temp_directory.GetPath());
extensions::ExtensionHostTestHelper host_helper(profile());
ExtensionTestMessageListener access_ok_listener("restartedFileAccessOK");
const Extension* extension =
LoadAndLaunchPlatformApp("file_access_restored_test", "fileWritten");
ASSERT_TRUE(extension);
ExtensionPrefs* extension_prefs =
ExtensionPrefs::Get(browser()->profile());
SavedFilesService* saved_files_service = SavedFilesService::Get(profile());
std::vector<SavedFileEntry> file_entries =
saved_files_service->GetAllFileEntries(extension->id());
host_helper.WaitForHostDestroyed();
// Simulate a restart by populating the preferences as if the browser didn't
// get time to clean itself up.
extension_prefs->SetExtensionRunning(extension->id(), true);
for (std::vector<SavedFileEntry>::const_iterator it = file_entries.begin();
it != file_entries.end(); ++it) {
saved_files_service->RegisterFileEntry(
extension->id(), it->id, it->path, it->is_directory);
}
apps::AppRestoreServiceFactory::GetForBrowserContext(browser()->profile())
->HandleStartup(true);
EXPECT_TRUE(access_ok_listener.WaitUntilSatisfied());
}
} // namespace apps
|