diff options
17 files changed, 318 insertions, 0 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index f7a24bf..bb36d13 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -4378,6 +4378,9 @@ Make sure you do not expose any sensitive information. <message name="IDS_EXTENSION_PROMPT_WARNING_WEB_CONNECTABLE" desc="Permission string for allowing websites to connect to extensions."> Communicate with cooperating websites </message> + <message name="IDS_EXTENSION_PROMPT_WARNING_SCREENLOCK_PRIVATE" desc="Permission string for locking an unlocking the screen."> + Lock and unlock the screen + </message> <message name="IDS_EXTENSION_PROMPT_WARNING_ACTIVITY_LOG_PRIVATE" desc="Permission string for the observing other extensions' API calls"> Monitor the behavior of other extensions, including visited URLs </message> diff --git a/chrome/browser/chromeos/extensions/screenlock_private_api.cc b/chrome/browser/chromeos/extensions/screenlock_private_api.cc new file mode 100644 index 0000000..1cb5936 --- /dev/null +++ b/chrome/browser/chromeos/extensions/screenlock_private_api.cc @@ -0,0 +1,123 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/extensions/screenlock_private_api.h" + +#include "base/lazy_instance.h" +#include "base/values.h" +#include "chrome/browser/chromeos/login/screen_locker.h" +#include "chrome/browser/extensions/event_router.h" +#include "chrome/browser/extensions/extension_system.h" +#include "chrome/common/extensions/api/screenlock_private.h" +#include "chromeos/dbus/dbus_thread_manager.h" + +namespace screenlock = extensions::api::screenlock_private; + +namespace extensions { + +ScreenlockPrivateGetLockedFunction::ScreenlockPrivateGetLockedFunction() {} + +ScreenlockPrivateGetLockedFunction::~ScreenlockPrivateGetLockedFunction() {} + +bool ScreenlockPrivateGetLockedFunction::RunImpl() { + bool locked = false; + chromeos::ScreenLocker* locker = + chromeos::ScreenLocker::default_screen_locker(); + if (locker) + locked = locker->locked(); + SetResult(new base::FundamentalValue(locked)); + SendResponse(error_.empty()); + return true; +} + +ScreenlockPrivateSetLockedFunction::ScreenlockPrivateSetLockedFunction() {} + +ScreenlockPrivateSetLockedFunction::~ScreenlockPrivateSetLockedFunction() {} + +bool ScreenlockPrivateSetLockedFunction::RunImpl() { + scoped_ptr<screenlock::SetLocked::Params> params( + screenlock::SetLocked::Params::Create(*args_)); + EXTENSION_FUNCTION_VALIDATE(params.get()); + if (params->locked) { + chromeos::SessionManagerClient* session_manager = + chromeos::DBusThreadManager::Get()->GetSessionManagerClient(); + session_manager->RequestLockScreen(); + } else { + chromeos::ScreenLocker* locker = + chromeos::ScreenLocker::default_screen_locker(); + if (locker) + chromeos::ScreenLocker::Hide(); + } + SendResponse(error_.empty()); + return true; +} + +ScreenlockPrivateShowMessageFunction::ScreenlockPrivateShowMessageFunction() {} + +ScreenlockPrivateShowMessageFunction::~ScreenlockPrivateShowMessageFunction() {} + +bool ScreenlockPrivateShowMessageFunction::RunImpl() { + scoped_ptr<screenlock::SetLocked::Params> params( + screenlock::SetLocked::Params::Create(*args_)); + EXTENSION_FUNCTION_VALIDATE(params.get()); + chromeos::ScreenLocker* locker = + chromeos::ScreenLocker::default_screen_locker(); + if (!locker) { + SendResponse(error_.empty()); + return true; + } + // TODO locker->ShowMessage(params->message); + SendResponse(error_.empty()); + return true; +} + +ScreenlockPrivateEventRouter::ScreenlockPrivateEventRouter(Profile* profile) + : profile_(profile) { + chromeos::SessionManagerClient* session_manager = + chromeos::DBusThreadManager::Get()->GetSessionManagerClient(); + if (!session_manager->HasObserver(this)) + session_manager->AddObserver(this); +} + +ScreenlockPrivateEventRouter::~ScreenlockPrivateEventRouter() {} + +void ScreenlockPrivateEventRouter::ScreenIsLocked() { + DispatchEvent(screenlock::OnChanged::kEventName, + new base::FundamentalValue(true)); +} + +void ScreenlockPrivateEventRouter::ScreenIsUnlocked() { + DispatchEvent(screenlock::OnChanged::kEventName, + new base::FundamentalValue(false)); +} + +void ScreenlockPrivateEventRouter::DispatchEvent( + const std::string& event_name, + base::Value* arg) { + scoped_ptr<base::ListValue> args(new base::ListValue()); + args->Append(arg); + scoped_ptr<extensions::Event> event(new extensions::Event( + event_name, args.Pass())); + extensions::ExtensionSystem::Get(profile_)->event_router()-> + BroadcastEvent(event.Pass()); +} + +static base::LazyInstance<extensions::ProfileKeyedAPIFactory< + ScreenlockPrivateEventRouter> > + g_factory = LAZY_INSTANCE_INITIALIZER; + +// static +extensions::ProfileKeyedAPIFactory<ScreenlockPrivateEventRouter>* +ScreenlockPrivateEventRouter::GetFactoryInstance() { + return &g_factory.Get(); +} + +void ScreenlockPrivateEventRouter::Shutdown() { + chromeos::SessionManagerClient* session_manager = + chromeos::DBusThreadManager::Get()->GetSessionManagerClient(); + if (session_manager->HasObserver(this)) + session_manager->RemoveObserver(this); +} + +} // namespace extensions diff --git a/chrome/browser/chromeos/extensions/screenlock_private_api.h b/chrome/browser/chromeos/extensions/screenlock_private_api.h new file mode 100644 index 0000000..5fe2998 --- /dev/null +++ b/chrome/browser/chromeos/extensions/screenlock_private_api.h @@ -0,0 +1,80 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_SCREENLOCK_PRIVATE_API_H_ +#define CHROME_BROWSER_CHROMEOS_EXTENSIONS_SCREENLOCK_PRIVATE_API_H_ + +#include "chrome/browser/extensions/api/profile_keyed_api_factory.h" +#include "chrome/browser/extensions/chrome_extension_function.h" +#include "chromeos/dbus/session_manager_client.h" + +namespace extensions { + +class ScreenlockPrivateGetLockedFunction : public ChromeAsyncExtensionFunction { + public: + DECLARE_EXTENSION_FUNCTION("screenlockPrivate.getLocked", + SCREENLOCKPRIVATE_GETLOCKED) + ScreenlockPrivateGetLockedFunction(); + virtual bool RunImpl() OVERRIDE; + private: + virtual ~ScreenlockPrivateGetLockedFunction(); + DISALLOW_COPY_AND_ASSIGN(ScreenlockPrivateGetLockedFunction); +}; + +class ScreenlockPrivateSetLockedFunction : public ChromeAsyncExtensionFunction { + public: + DECLARE_EXTENSION_FUNCTION("screenlockPrivate.setLocked", + SCREENLOCKPRIVATE_SETLOCKED) + ScreenlockPrivateSetLockedFunction(); + virtual bool RunImpl() OVERRIDE; + private: + virtual ~ScreenlockPrivateSetLockedFunction(); + DISALLOW_COPY_AND_ASSIGN(ScreenlockPrivateSetLockedFunction); +}; + +class ScreenlockPrivateShowMessageFunction + : public ChromeAsyncExtensionFunction { + public: + DECLARE_EXTENSION_FUNCTION("screenlockPrivate.showMessage", + SCREENLOCKPRIVATE_SHOWMESSAGE) + ScreenlockPrivateShowMessageFunction(); + virtual bool RunImpl() OVERRIDE; + private: + virtual ~ScreenlockPrivateShowMessageFunction(); + DISALLOW_COPY_AND_ASSIGN(ScreenlockPrivateShowMessageFunction ); +}; + +class ScreenlockPrivateEventRouter + : public extensions::ProfileKeyedAPI, + public chromeos::SessionManagerClient::Observer { + public: + explicit ScreenlockPrivateEventRouter(Profile* profile); + virtual ~ScreenlockPrivateEventRouter(); + virtual void ScreenIsLocked() OVERRIDE; + virtual void ScreenIsUnlocked() OVERRIDE; + + // ProfileKeyedAPI + static extensions::ProfileKeyedAPIFactory<ScreenlockPrivateEventRouter>* + GetFactoryInstance(); + virtual void Shutdown() OVERRIDE; + + private: + friend class extensions::ProfileKeyedAPIFactory<ScreenlockPrivateEventRouter>; + + // ProfileKeyedAPI + static const char* service_name() { + return "ScreenlockPrivateEventRouter"; + } + static const bool kServiceIsNULLWhileTesting = true; + static const bool kServiceRedirectedInIncognito = true; + + void DispatchEvent(const std::string& event_name, base::Value* arg); + + Profile* profile_; + DISALLOW_COPY_AND_ASSIGN(ScreenlockPrivateEventRouter); +}; + +} // namespace extensions + +#endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_SCREENLOCK_PRIVATE_API_H_ diff --git a/chrome/browser/chromeos/extensions/screenlock_private_apitest.cc b/chrome/browser/chromeos/extensions/screenlock_private_apitest.cc new file mode 100644 index 0000000..fe355fd --- /dev/null +++ b/chrome/browser/chromeos/extensions/screenlock_private_apitest.cc @@ -0,0 +1,9 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/extensions/extension_apitest.h" + +IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ScreenlockPrivateApiTest) { + ASSERT_TRUE(RunExtensionTest("screenlockPrivate")) << message_; +} diff --git a/chrome/browser/extensions/extension_function_histogram_value.h b/chrome/browser/extensions/extension_function_histogram_value.h index ccb6cd5..cd203c7 100644 --- a/chrome/browser/extensions/extension_function_histogram_value.h +++ b/chrome/browser/extensions/extension_function_histogram_value.h @@ -688,6 +688,9 @@ enum HistogramValue { BOOKMARKMANAGERPRIVATE_SETMETAINFO, FILESYSTEMPROVIDER_MOUNT, AUTOTESTPRIVATE_GETEXTENSIONSINFO, + SCREENLOCKPRIVATE_GETLOCKED, + SCREENLOCKPRIVATE_SETLOCKED, + SCREENLOCKPRIVATE_SHOWMESSAGE, ENUM_BOUNDARY // Last entry: Add new entries above. }; diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc index 1bcb694..2d7e144 100644 --- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc +++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc @@ -137,6 +137,7 @@ #if defined(OS_CHROMEOS) #include "chrome/browser/chromeos/extensions/input_method_api.h" #include "chrome/browser/chromeos/extensions/media_player_api.h" +#include "chrome/browser/chromeos/extensions/screenlock_private_api.h" #include "chrome/browser/extensions/api/input_ime/input_ime_api.h" #include "chrome/browser/extensions/api/networking_private/networking_private_event_router_factory.h" #if defined(FILE_MANAGER_EXTENSION) @@ -267,6 +268,7 @@ EnsureBrowserContextKeyedServiceFactoriesBuilt() { #if defined(OS_CHROMEOS) extensions::InputImeAPI::GetFactoryInstance(); extensions::InputMethodAPI::GetFactoryInstance(); + extensions::ScreenlockPrivateEventRouter::GetFactoryInstance(); #endif extensions::LocationManager::GetFactoryInstance(); extensions::ManagementAPI::GetFactoryInstance(); diff --git a/chrome/chrome_browser_extensions.gypi b/chrome/chrome_browser_extensions.gypi index 6ec1585..bfc4b5a 100644 --- a/chrome/chrome_browser_extensions.gypi +++ b/chrome/chrome_browser_extensions.gypi @@ -935,6 +935,8 @@ 'browser/extensions/api/log_private/log_private_api_chromeos.cc', 'browser/extensions/api/log_private/syslog_parser.cc', 'browser/extensions/api/log_private/syslog_parser.h', + 'browser/chromeos/extensions/screenlock_private_api.cc', + 'browser/chromeos/extensions/screenlock_private_api.h', 'browser/extensions/api/terminal/terminal_extension_helper.cc', 'browser/extensions/api/terminal/terminal_extension_helper.h', 'browser/extensions/api/terminal/terminal_private_api.cc', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 79948a8..6b7b6ec 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1011,6 +1011,7 @@ 'browser/chromeos/drive/drive_integration_service_browsertest.cc', 'browser/chromeos/drive/test_util.cc', 'browser/chromeos/drive/test_util.h', + 'browser/chromeos/extensions/screenlock_private_apitest.cc', 'browser/chromeos/extensions/echo_private_apitest.cc', 'browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc', 'browser/chromeos/extensions/file_manager/file_browser_private_apitest.cc', diff --git a/chrome/common/extensions/api/_api_features.json b/chrome/common/extensions/api/_api_features.json index d9db3ee..96f9bdd 100644 --- a/chrome/common/extensions/api/_api_features.json +++ b/chrome/common/extensions/api/_api_features.json @@ -294,6 +294,12 @@ "channel": "stable", "contexts": ["blessed_extension", "unblessed_extension", "content_script"] }, + "screenlockPrivate": { + "platforms": ["chromeos"], + "dependencies": ["permission:screenlockPrivate"], + "extension_types": ["platform_app"], + "contexts": ["blessed_extension", "unblessed_extension"] + }, "fileBrowserPrivate": { "platforms": ["chromeos"], "dependencies": ["permission:fileBrowserPrivate"], diff --git a/chrome/common/extensions/api/_permission_features.json b/chrome/common/extensions/api/_permission_features.json index f84c5aa..5e552b4 100644 --- a/chrome/common/extensions/api/_permission_features.json +++ b/chrome/common/extensions/api/_permission_features.json @@ -265,6 +265,11 @@ ] } ], + "screenlockPrivate": { + "channel": "dev", + "extension_types":["platform_app"], + "whitelist": ["begdogjjbmiahnbahpidlnbgpbjbpajl"] + }, "downloads": { "channel": "stable", "extension_types": ["extension"] diff --git a/chrome/common/extensions/api/api.gyp b/chrome/common/extensions/api/api.gyp index 985dc13..3c7847c 100644 --- a/chrome/common/extensions/api/api.gyp +++ b/chrome/common/extensions/api/api.gyp @@ -156,6 +156,7 @@ 'diagnostics.idl', 'file_browser_handler_internal.json', 'log_private.idl', + 'screenlock_private.idl', 'wallpaper.json', 'wallpaper_private.json', ], diff --git a/chrome/common/extensions/api/screenlock_private.idl b/chrome/common/extensions/api/screenlock_private.idl new file mode 100644 index 0000000..051de2d --- /dev/null +++ b/chrome/common/extensions/api/screenlock_private.idl @@ -0,0 +1,26 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Control and monitor the screen locker. +[platforms=("chromeos"), implemented_in="chrome/browser/chromeos/extensions/screenlock_private_api.h", permissions=screenlockPrivate] +namespace screenlockPrivate { + callback BooleanCallback = void(boolean locked); + + interface Functions { + // Returns true if the screen is currently locked, false otherwise. + static void getLocked(BooleanCallback callback); + + // Set <code>locked=true</code> to lock the screen, + // <code>locked=false</code> to unlock it. + static void setLocked(boolean locked); + + // Show a message to the user on the unlock UI if the screen is locked. + static void showMessage(DOMString message); + }; + + interface Events { + // Fires whenever the screen is locked or unlocked. + static void onChanged(boolean locked); + }; +}; diff --git a/chrome/common/extensions/permissions/chrome_api_permissions.cc b/chrome/common/extensions/permissions/chrome_api_permissions.cc index 375fe7f..ef79079 100644 --- a/chrome/common/extensions/permissions/chrome_api_permissions.cc +++ b/chrome/common/extensions/permissions/chrome_api_permissions.cc @@ -163,6 +163,10 @@ std::vector<APIPermissionInfo*> ChromeAPIPermissions::GetAllPermissions() APIPermissionInfo::kFlagCannotBeOptional }, // Register private permissions. + { APIPermission::kScreenlockPrivate, "screenlockPrivate", + APIPermissionInfo::kFlagCannotBeOptional, + IDS_EXTENSION_PROMPT_WARNING_SCREENLOCK_PRIVATE, + PermissionMessage::kScreenlockPrivate }, { APIPermission::kActivityLogPrivate, "activityLogPrivate", APIPermissionInfo::kFlagCannotBeOptional, IDS_EXTENSION_PROMPT_WARNING_ACTIVITY_LOG_PRIVATE, diff --git a/chrome/test/data/extensions/api_test/screenlockPrivate/manifest.json b/chrome/test/data/extensions/api_test/screenlockPrivate/manifest.json new file mode 100644 index 0000000..d52635b --- /dev/null +++ b/chrome/test/data/extensions/api_test/screenlockPrivate/manifest.json @@ -0,0 +1,7 @@ +{"name":"screenlockPrivate API test", +"description":"screenlockPrivate API test", +"key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgY+PzXrnxhllHDH+vqLw8KALKT8DewcI2UjVTlwLnwocQU//wtPOp8aXdGB5cnm5dN4Ow3kmnrvRvdithXlTcWgzi6wp/jvP/5uFPH6LkZzgKoU7o0B1yMGGl9p0Wyxr7UL/U4rA6MpflZdPAcvS5eiHxOXj1oV8m7A8fY7WL5Fte9evtLUyWqrQ6mXsSL759YQJy6TuQeZRGGyxMzSRhoFbTeWCA5x6NqIeeHq04z7ZIbfyscli9N+JetfGyEhPjsFZ9qOK1xN9QGr8MFbJvYIovBxmChkdhr2wkovOvHFMcJlHRO4Cvf4w9yJGmorz35wtyDzbEjmgNXEh2Sh77wIDAQAB", +"version":"1", +"manifest_version":2, +"permissions":["screenlockPrivate"], +"app":{"background":{"scripts":["test.js"]}}} diff --git a/chrome/test/data/extensions/api_test/screenlockPrivate/test.js b/chrome/test/data/extensions/api_test/screenlockPrivate/test.js new file mode 100644 index 0000000..d0006fc --- /dev/null +++ b/chrome/test/data/extensions/api_test/screenlockPrivate/test.js @@ -0,0 +1,44 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var stage = 0; + +function step() { + chrome.screenlockPrivate.getLocked(function gotLocked(locked) { + if (stage === 0) { + if (locked) { + chrome.test.fail('locked at stage ' + stage); + } else { + chrome.screenlockPrivate.setLocked(true); + ++stage; + return true; + } + } else if (stage === 1) { + if (!locked) { + chrome.test.fail('unlocked at stage ' + stage); + } else { + chrome.screenlockPrivate.setLocked(false); + ++stage; + return true; + } + } else if (stage === 2) { + if (locked) { + chrome.test.fail('locked at stage ' + stage); + } else { + chrome.test.succeed(); + } + } + }); +}; + +chrome.screenlockPrivate.onChanged.addListener(function(locked) { + if (locked != (1 == (stage % 2))) { + chrome.test.fail((locked ? '' : 'un') + 'locked at stage ' + stage + + ' onChanged'); + } else { + return step(); + } +}); + +step(); diff --git a/extensions/common/permissions/api_permission.h b/extensions/common/permissions/api_permission.h index e748aab..b846077 100644 --- a/extensions/common/permissions/api_permission.h +++ b/extensions/common/permissions/api_permission.h @@ -161,6 +161,7 @@ class APIPermission { kWebrtcLoggingPrivate, kWebstorePrivate, kWebView, + kScreenlockPrivate, kSystemCpu, kSystemMemory, kSystemInfoCpu, diff --git a/extensions/common/permissions/permission_message.h b/extensions/common/permissions/permission_message.h index ecbd99a..82b5162 100644 --- a/extensions/common/permissions/permission_message.h +++ b/extensions/common/permissions/permission_message.h @@ -78,6 +78,7 @@ class PermissionMessage { kSearchProvider, kStartupPages, kMediaGalleriesAllGalleriesDelete, + kScreenlockPrivate, kEnumBoundary, }; COMPILE_ASSERT(PermissionMessage::kNone > PermissionMessage::kUnknown, |