summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/app/generated_resources.grd3
-rw-r--r--chrome/browser/chromeos/extensions/screenlock_private_api.cc123
-rw-r--r--chrome/browser/chromeos/extensions/screenlock_private_api.h80
-rw-r--r--chrome/browser/chromeos/extensions/screenlock_private_apitest.cc9
-rw-r--r--chrome/browser/extensions/extension_function_histogram_value.h3
-rw-r--r--chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc2
-rw-r--r--chrome/chrome_browser_extensions.gypi2
-rw-r--r--chrome/chrome_tests.gypi1
-rw-r--r--chrome/common/extensions/api/_api_features.json6
-rw-r--r--chrome/common/extensions/api/_permission_features.json5
-rw-r--r--chrome/common/extensions/api/api.gyp1
-rw-r--r--chrome/common/extensions/api/screenlock_private.idl26
-rw-r--r--chrome/common/extensions/permissions/chrome_api_permissions.cc4
-rw-r--r--chrome/test/data/extensions/api_test/screenlockPrivate/manifest.json7
-rw-r--r--chrome/test/data/extensions/api_test/screenlockPrivate/test.js44
-rw-r--r--extensions/common/permissions/api_permission.h1
-rw-r--r--extensions/common/permissions/permission_message.h1
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,