Remove lock screen app action support
This is a split from crrev.com/c/5986568. This also adds a feature flag to disable ActionData API. I'll disable it in a separate CL. Bug: 376354347 Change-Id: I3684fa9dc26c317248eeacc63f9edc2af7c51485 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6022058 Reviewed-by: Toni Barzic <tbarzic@google.com> Commit-Queue: Mitsuru Oshima <oshima@chromium.org> Reviewed-by: Finnur Thorarinsson <finnur@chromium.org> Cr-Commit-Position: refs/heads/main@{#1383878}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
8ba60787b1
commit
94b526295f
apps
chrome/browser/chromeos/extensions/action_handlers
extensions/common
@ -52,10 +52,12 @@
|
|||||||
#include "net/base/filename_util.h"
|
#include "net/base/filename_util.h"
|
||||||
#include "url/gurl.h"
|
#include "url/gurl.h"
|
||||||
|
|
||||||
#if BUILDFLAG(IS_CHROMEOS_ASH)
|
#if BUILDFLAG(IS_CHROMEOS)
|
||||||
|
#include "base/feature_list.h"
|
||||||
#include "components/app_restore/app_launch_info.h"
|
#include "components/app_restore/app_launch_info.h"
|
||||||
#include "components/app_restore/full_restore_utils.h"
|
#include "components/app_restore/full_restore_utils.h"
|
||||||
#include "components/user_manager/user_manager.h"
|
#include "components/user_manager/user_manager.h"
|
||||||
|
#include "extensions/common/extension_features.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace app_runtime = extensions::api::app_runtime;
|
namespace app_runtime = extensions::api::app_runtime;
|
||||||
@ -129,7 +131,12 @@ class PlatformAppPathLauncher
|
|||||||
PlatformAppPathLauncher& operator=(const PlatformAppPathLauncher&) = delete;
|
PlatformAppPathLauncher& operator=(const PlatformAppPathLauncher&) = delete;
|
||||||
|
|
||||||
void set_action_data(std::optional<app_runtime::ActionData> action_data) {
|
void set_action_data(std::optional<app_runtime::ActionData> action_data) {
|
||||||
action_data_ = std::move(action_data);
|
#if BUILDFLAG(IS_CHROMEOS)
|
||||||
|
if (base::FeatureList::IsEnabled(
|
||||||
|
extensions_features::kApiRuntimeActionData)) {
|
||||||
|
action_data_ = std::move(action_data);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_launch_source(extensions::AppLaunchSource launch_source) {
|
void set_launch_source(extensions::AppLaunchSource launch_source) {
|
||||||
|
@ -3,11 +3,13 @@
|
|||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "apps/launcher.h"
|
#include "apps/launcher.h"
|
||||||
|
#include "base/feature_list.h"
|
||||||
#include "base/path_service.h"
|
#include "base/path_service.h"
|
||||||
#include "chrome/browser/extensions/extension_apitest.h"
|
#include "chrome/browser/extensions/extension_apitest.h"
|
||||||
#include "chrome/browser/profiles/profile.h"
|
#include "chrome/browser/profiles/profile.h"
|
||||||
#include "chrome/common/chrome_paths.h"
|
#include "chrome/common/chrome_paths.h"
|
||||||
#include "content/public/test/browser_test.h"
|
#include "content/public/test/browser_test.h"
|
||||||
|
#include "extensions/common/extension_features.h"
|
||||||
#include "extensions/common/manifest_handlers/action_handlers_handler.h"
|
#include "extensions/common/manifest_handlers/action_handlers_handler.h"
|
||||||
#include "extensions/test/extension_test_message_listener.h"
|
#include "extensions/test/extension_test_message_listener.h"
|
||||||
|
|
||||||
@ -16,6 +18,10 @@ namespace app_runtime = extensions::api::app_runtime;
|
|||||||
using ActionHandlersBrowserTest = extensions::ExtensionApiTest;
|
using ActionHandlersBrowserTest = extensions::ExtensionApiTest;
|
||||||
|
|
||||||
IN_PROC_BROWSER_TEST_F(ActionHandlersBrowserTest, LaunchAppWithNewNote) {
|
IN_PROC_BROWSER_TEST_F(ActionHandlersBrowserTest, LaunchAppWithNewNote) {
|
||||||
|
if (!base::FeatureList::IsEnabled(
|
||||||
|
extensions_features::kApiRuntimeActionData)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
// Load the app. Make sure to wait until it is done loading.
|
// Load the app. Make sure to wait until it is done loading.
|
||||||
ExtensionTestMessageListener loader("loaded");
|
ExtensionTestMessageListener loader("loaded");
|
||||||
base::FilePath path =
|
base::FilePath path =
|
||||||
|
@ -288,16 +288,6 @@ namespace app.window {
|
|||||||
// If true, and supported by the platform, the window will be visible on all
|
// If true, and supported by the platform, the window will be visible on all
|
||||||
// workspaces.
|
// workspaces.
|
||||||
boolean? visibleOnAllWorkspaces;
|
boolean? visibleOnAllWorkspaces;
|
||||||
|
|
||||||
// <p>If set, the action that is intended to be handled by the window on
|
|
||||||
// lockscreen. This has to be set to create an app window visible on the
|
|
||||||
// lock screen. The app window should be created only in response to an
|
|
||||||
// app launch request for handling an action from the lock screen. App
|
|
||||||
// window creation will fail if the app was not launched to handle the
|
|
||||||
// action.
|
|
||||||
// </p>
|
|
||||||
// <p>This is <b>Chrome OS only</b>.</p>
|
|
||||||
[nodoc] app.runtime.ActionType? lockScreenAction;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Called in the creating window (parent) before the load event is called in
|
// Called in the creating window (parent) before the load event is called in
|
||||||
|
@ -23,6 +23,10 @@ BASE_FEATURE(kApiEnterpriseKioskInput,
|
|||||||
"ApiEnterpriseKioskInput",
|
"ApiEnterpriseKioskInput",
|
||||||
base::FEATURE_ENABLED_BY_DEFAULT);
|
base::FEATURE_ENABLED_BY_DEFAULT);
|
||||||
|
|
||||||
|
BASE_FEATURE(kApiRuntimeActionData,
|
||||||
|
"ApiRuntimeActionData",
|
||||||
|
base::FEATURE_ENABLED_BY_DEFAULT);
|
||||||
|
|
||||||
BASE_FEATURE(kApiPermissionsSiteAccessRequests,
|
BASE_FEATURE(kApiPermissionsSiteAccessRequests,
|
||||||
"ApiPermissionsSiteAccessRequests",
|
"ApiPermissionsSiteAccessRequests",
|
||||||
base::FEATURE_ENABLED_BY_DEFAULT);
|
base::FEATURE_ENABLED_BY_DEFAULT);
|
||||||
|
@ -45,6 +45,10 @@ BASE_DECLARE_FEATURE(kApiContentSettingsClipboard);
|
|||||||
// Controls the availability of the enterprise.kioskInput API.
|
// Controls the availability of the enterprise.kioskInput API.
|
||||||
BASE_DECLARE_FEATURE(kApiEnterpriseKioskInput);
|
BASE_DECLARE_FEATURE(kApiEnterpriseKioskInput);
|
||||||
|
|
||||||
|
// Controls the availability of the runtime.actionData API.
|
||||||
|
// TODO(crbug.com/376354347): Remove this when the experiment is finished.
|
||||||
|
BASE_DECLARE_FEATURE(kApiRuntimeActionData);
|
||||||
|
|
||||||
// Controls the availability of adding and removing site access requests with
|
// Controls the availability of adding and removing site access requests with
|
||||||
// the permissions API.
|
// the permissions API.
|
||||||
BASE_DECLARE_FEATURE(kApiPermissionsSiteAccessRequests);
|
BASE_DECLARE_FEATURE(kApiPermissionsSiteAccessRequests);
|
||||||
|
@ -183,8 +183,6 @@ inline constexpr char kFileSystemProviderCapabilities[] =
|
|||||||
"file_system_provider_capabilities";
|
"file_system_provider_capabilities";
|
||||||
inline constexpr char kActionHandlers[] = "action_handlers";
|
inline constexpr char kActionHandlers[] = "action_handlers";
|
||||||
inline constexpr char kActionHandlerActionKey[] = "action";
|
inline constexpr char kActionHandlerActionKey[] = "action";
|
||||||
inline constexpr char kActionHandlerEnabledOnLockScreenKey[] =
|
|
||||||
"enabled_on_lock_screen";
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} // namespace manifest_keys
|
} // namespace manifest_keys
|
||||||
|
@ -26,14 +26,6 @@ bool ActionHandlersInfo::HasActionHandler(
|
|||||||
return info && info->action_handlers.count(action_type) > 0;
|
return info && info->action_handlers.count(action_type) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ActionHandlersInfo::HasLockScreenActionHandler(
|
|
||||||
const Extension* extension,
|
|
||||||
api::app_runtime::ActionType action_type) {
|
|
||||||
ActionHandlersInfo* info = static_cast<ActionHandlersInfo*>(
|
|
||||||
extension->GetManifestData(keys::kActionHandlers));
|
|
||||||
return info && info->lock_screen_action_handlers.count(action_type) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ActionHandlersInfo::ActionHandlersInfo() = default;
|
ActionHandlersInfo::ActionHandlersInfo() = default;
|
||||||
|
|
||||||
ActionHandlersInfo::~ActionHandlersInfo() = default;
|
ActionHandlersInfo::~ActionHandlersInfo() = default;
|
||||||
@ -52,7 +44,6 @@ bool ActionHandlersHandler::Parse(Extension* extension, std::u16string* error) {
|
|||||||
auto info = std::make_unique<ActionHandlersInfo>();
|
auto info = std::make_unique<ActionHandlersInfo>();
|
||||||
for (const base::Value& wrapped_value : entries->GetList()) {
|
for (const base::Value& wrapped_value : entries->GetList()) {
|
||||||
std::string value;
|
std::string value;
|
||||||
bool enabled_on_lock_screen = false;
|
|
||||||
if (wrapped_value.is_dict()) {
|
if (wrapped_value.is_dict()) {
|
||||||
const base::Value::Dict& wrapped_dict = wrapped_value.GetDict();
|
const base::Value::Dict& wrapped_dict = wrapped_value.GetDict();
|
||||||
const std::string* action =
|
const std::string* action =
|
||||||
@ -62,11 +53,6 @@ bool ActionHandlersHandler::Parse(Extension* extension, std::u16string* error) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
value = *action;
|
value = *action;
|
||||||
std::optional<bool> enabled =
|
|
||||||
wrapped_dict.FindBool(keys::kActionHandlerEnabledOnLockScreenKey);
|
|
||||||
if (enabled) {
|
|
||||||
enabled_on_lock_screen = *enabled;
|
|
||||||
}
|
|
||||||
} else if (wrapped_value.is_string()) {
|
} else if (wrapped_value.is_string()) {
|
||||||
value = wrapped_value.GetString();
|
value = wrapped_value.GetString();
|
||||||
} else {
|
} else {
|
||||||
@ -87,8 +73,6 @@ bool ActionHandlersHandler::Parse(Extension* extension, std::u16string* error) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
info->action_handlers.insert(action_type);
|
info->action_handlers.insert(action_type);
|
||||||
if (enabled_on_lock_screen)
|
|
||||||
info->lock_screen_action_handlers.insert(action_type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension->SetManifestData(keys::kActionHandlers, std::move(info));
|
extension->SetManifestData(keys::kActionHandlers, std::move(info));
|
||||||
|
@ -20,15 +20,11 @@ struct ActionHandlersInfo : public Extension::ManifestData {
|
|||||||
// |action_type|.
|
// |action_type|.
|
||||||
static bool HasActionHandler(const Extension* extension,
|
static bool HasActionHandler(const Extension* extension,
|
||||||
api::app_runtime::ActionType action_type);
|
api::app_runtime::ActionType action_type);
|
||||||
static bool HasLockScreenActionHandler(
|
|
||||||
const Extension* extension,
|
|
||||||
api::app_runtime::ActionType action_type);
|
|
||||||
|
|
||||||
ActionHandlersInfo();
|
ActionHandlersInfo();
|
||||||
~ActionHandlersInfo() override;
|
~ActionHandlersInfo() override;
|
||||||
|
|
||||||
std::set<api::app_runtime::ActionType> action_handlers;
|
std::set<api::app_runtime::ActionType> action_handlers;
|
||||||
std::set<api::app_runtime::ActionType> lock_screen_action_handlers;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Parses the "action_handlers" manifest key.
|
// Parses the "action_handlers" manifest key.
|
||||||
|
@ -43,15 +43,6 @@ class ActionHandlersManifestTest : public ManifestTest {
|
|||||||
extension->GetManifestData(manifest_keys::kActionHandlers));
|
extension->GetManifestData(manifest_keys::kActionHandlers));
|
||||||
return info ? info->action_handlers : std::set<app_runtime::ActionType>();
|
return info ? info->action_handlers : std::set<app_runtime::ActionType>();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns all action handlers associated with |extension|.
|
|
||||||
std::set<app_runtime::ActionType> GetLockScreenActionHandlers(
|
|
||||||
const Extension* extension) {
|
|
||||||
ActionHandlersInfo* info = static_cast<ActionHandlersInfo*>(
|
|
||||||
extension->GetManifestData(manifest_keys::kActionHandlers));
|
|
||||||
return info ? info->lock_screen_action_handlers
|
|
||||||
: std::set<app_runtime::ActionType>();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
@ -67,8 +58,6 @@ TEST_F(ActionHandlersManifestTest, InvalidType) {
|
|||||||
manifest_errors::kInvalidActionHandlersActionType);
|
manifest_errors::kInvalidActionHandlersActionType);
|
||||||
LoadAndExpectError(CreateManifest("[{}]"),
|
LoadAndExpectError(CreateManifest("[{}]"),
|
||||||
manifest_errors::kInvalidActionHandlerDictionary);
|
manifest_errors::kInvalidActionHandlerDictionary);
|
||||||
LoadAndExpectError(CreateManifest(R"([{"enabled_on_lock_screen": false}])"),
|
|
||||||
manifest_errors::kInvalidActionHandlerDictionary);
|
|
||||||
LoadAndExpectError(CreateManifest(R"([{"action": "invalid_handler"}])"),
|
LoadAndExpectError(CreateManifest(R"([{"action": "invalid_handler"}])"),
|
||||||
manifest_errors::kInvalidActionHandlersActionType);
|
manifest_errors::kInvalidActionHandlersActionType);
|
||||||
}
|
}
|
||||||
@ -79,60 +68,27 @@ TEST_F(ActionHandlersManifestTest, VerifyParse) {
|
|||||||
|
|
||||||
EXPECT_FALSE(ActionHandlersInfo::HasActionHandler(
|
EXPECT_FALSE(ActionHandlersInfo::HasActionHandler(
|
||||||
none.get(), app_runtime::ActionType::kNewNote));
|
none.get(), app_runtime::ActionType::kNewNote));
|
||||||
EXPECT_FALSE(ActionHandlersInfo::HasLockScreenActionHandler(
|
|
||||||
none.get(), app_runtime::ActionType::kNewNote));
|
|
||||||
|
|
||||||
scoped_refptr<Extension> new_note =
|
scoped_refptr<Extension> new_note =
|
||||||
LoadAndExpectSuccess(CreateManifest("[\"new_note\"]"));
|
LoadAndExpectSuccess(CreateManifest("[\"new_note\"]"));
|
||||||
EXPECT_EQ(
|
EXPECT_EQ(
|
||||||
std::set<app_runtime::ActionType>{app_runtime::ActionType::kNewNote},
|
std::set<app_runtime::ActionType>{app_runtime::ActionType::kNewNote},
|
||||||
GetActionHandlers(new_note.get()));
|
GetActionHandlers(new_note.get()));
|
||||||
EXPECT_TRUE(GetLockScreenActionHandlers(new_note.get()).empty());
|
|
||||||
EXPECT_TRUE(ActionHandlersInfo::HasActionHandler(
|
EXPECT_TRUE(ActionHandlersInfo::HasActionHandler(
|
||||||
new_note.get(), app_runtime::ActionType::kNewNote));
|
new_note.get(), app_runtime::ActionType::kNewNote));
|
||||||
EXPECT_FALSE(ActionHandlersInfo::HasLockScreenActionHandler(
|
|
||||||
new_note.get(), app_runtime::ActionType::kNewNote));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ActionHandlersManifestTest, ParseDictionaryActionValues) {
|
TEST_F(ActionHandlersManifestTest, ParseDictionaryActionValues) {
|
||||||
scoped_refptr<Extension> no_enabled_on_lock_screen_key =
|
scoped_refptr<Extension> new_note_key =
|
||||||
LoadAndExpectSuccess(CreateManifest(R"([{"action": "new_note"}])"));
|
LoadAndExpectSuccess(CreateManifest(R"([{"action": "new_note"}])"));
|
||||||
EXPECT_EQ(
|
EXPECT_EQ(
|
||||||
std::set<app_runtime::ActionType>{app_runtime::ActionType::kNewNote},
|
std::set<app_runtime::ActionType>{app_runtime::ActionType::kNewNote},
|
||||||
GetActionHandlers(no_enabled_on_lock_screen_key.get()));
|
GetActionHandlers(new_note_key.get()));
|
||||||
EXPECT_TRUE(
|
|
||||||
GetLockScreenActionHandlers(no_enabled_on_lock_screen_key.get()).empty());
|
|
||||||
EXPECT_TRUE(ActionHandlersInfo::HasActionHandler(
|
EXPECT_TRUE(ActionHandlersInfo::HasActionHandler(
|
||||||
no_enabled_on_lock_screen_key.get(), app_runtime::ActionType::kNewNote));
|
new_note_key.get(), app_runtime::ActionType::kNewNote));
|
||||||
EXPECT_FALSE(ActionHandlersInfo::HasLockScreenActionHandler(
|
scoped_refptr<Extension> no_new_note_key =
|
||||||
no_enabled_on_lock_screen_key.get(), app_runtime::ActionType::kNewNote));
|
LoadAndExpectSuccess(CreateManifest(R"([])"));
|
||||||
|
EXPECT_TRUE(GetActionHandlers(no_new_note_key.get()).empty());
|
||||||
scoped_refptr<Extension> enabled_on_lock_screen_false =
|
|
||||||
LoadAndExpectSuccess(CreateManifest(
|
|
||||||
R"([{"action": "new_note", "enabled_on_lock_screen": false}])"));
|
|
||||||
EXPECT_EQ(
|
|
||||||
std::set<app_runtime::ActionType>{app_runtime::ActionType::kNewNote},
|
|
||||||
GetActionHandlers(enabled_on_lock_screen_false.get()));
|
|
||||||
EXPECT_TRUE(
|
|
||||||
GetLockScreenActionHandlers(enabled_on_lock_screen_false.get()).empty());
|
|
||||||
EXPECT_TRUE(ActionHandlersInfo::HasActionHandler(
|
|
||||||
enabled_on_lock_screen_false.get(), app_runtime::ActionType::kNewNote));
|
|
||||||
EXPECT_FALSE(ActionHandlersInfo::HasLockScreenActionHandler(
|
|
||||||
enabled_on_lock_screen_false.get(), app_runtime::ActionType::kNewNote));
|
|
||||||
|
|
||||||
scoped_refptr<Extension> enabled_on_lock_screen_true =
|
|
||||||
LoadAndExpectSuccess(CreateManifest(
|
|
||||||
R"([{"action": "new_note", "enabled_on_lock_screen": true}])"));
|
|
||||||
EXPECT_EQ(
|
|
||||||
std::set<app_runtime::ActionType>{app_runtime::ActionType::kNewNote},
|
|
||||||
GetActionHandlers(enabled_on_lock_screen_true.get()));
|
|
||||||
EXPECT_EQ(
|
|
||||||
std::set<app_runtime::ActionType>{app_runtime::ActionType::kNewNote},
|
|
||||||
GetLockScreenActionHandlers(enabled_on_lock_screen_true.get()));
|
|
||||||
EXPECT_TRUE(ActionHandlersInfo::HasActionHandler(
|
|
||||||
enabled_on_lock_screen_true.get(), app_runtime::ActionType::kNewNote));
|
|
||||||
EXPECT_TRUE(ActionHandlersInfo::HasLockScreenActionHandler(
|
|
||||||
enabled_on_lock_screen_true.get(), app_runtime::ActionType::kNewNote));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ActionHandlersManifestTest, DuplicateHandlers) {
|
TEST_F(ActionHandlersManifestTest, DuplicateHandlers) {
|
||||||
@ -141,13 +97,6 @@ TEST_F(ActionHandlersManifestTest, DuplicateHandlers) {
|
|||||||
LoadAndExpectError(CreateManifest(
|
LoadAndExpectError(CreateManifest(
|
||||||
R"(["new_note", {
|
R"(["new_note", {
|
||||||
"action": "new_note",
|
"action": "new_note",
|
||||||
"enabled_on_lock_screen": true
|
|
||||||
}])"),
|
|
||||||
manifest_errors::kDuplicateActionHandlerFound);
|
|
||||||
LoadAndExpectError(CreateManifest(
|
|
||||||
R"(["new_note", {
|
|
||||||
"action": "new_note",
|
|
||||||
"enabled_on_lock_screen": false
|
|
||||||
}])"),
|
}])"),
|
||||||
manifest_errors::kDuplicateActionHandlerFound);
|
manifest_errors::kDuplicateActionHandlerFound);
|
||||||
LoadAndExpectError(CreateManifest(
|
LoadAndExpectError(CreateManifest(
|
||||||
@ -155,16 +104,6 @@ TEST_F(ActionHandlersManifestTest, DuplicateHandlers) {
|
|||||||
"action": "new_note"
|
"action": "new_note"
|
||||||
}, {
|
}, {
|
||||||
"action": "new_note",
|
"action": "new_note",
|
||||||
"enabled_on_lock_screen": false
|
|
||||||
}])"),
|
|
||||||
manifest_errors::kDuplicateActionHandlerFound);
|
|
||||||
LoadAndExpectError(CreateManifest(
|
|
||||||
R"([{
|
|
||||||
"action": "new_note",
|
|
||||||
"enabled_on_lock_screen": true
|
|
||||||
}, {
|
|
||||||
"action": "new_note",
|
|
||||||
"enabled_on_lock_screen": false
|
|
||||||
}])"),
|
}])"),
|
||||||
manifest_errors::kDuplicateActionHandlerFound);
|
manifest_errors::kDuplicateActionHandlerFound);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user