summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorscheib@chromium.org <scheib@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-01 01:59:05 +0000
committerscheib@chromium.org <scheib@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-01 01:59:05 +0000
commitaf06dbdcae56421c8911e60fa27221c6c1ae6437 (patch)
treee6d047565d2ff77b1d2379a0f58a5d3f67d50539
parent2ab1ff6998e6953e65f82ae836bddac66810e1c3 (diff)
downloadchromium_src-af06dbdcae56421c8911e60fa27221c6c1ae6437.zip
chromium_src-af06dbdcae56421c8911e60fa27221c6c1ae6437.tar.gz
chromium_src-af06dbdcae56421c8911e60fa27221c6c1ae6437.tar.bz2
Enable Pointer Lock for packaged apps using ShellWindow.
BUG=148532 Review URL: https://chromiumcodereview.appspot.com/11413131 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@170625 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/extensions/extension_pointer_lock_apitest.cc21
-rw-r--r--chrome/browser/ui/extensions/shell_window.cc7
-rw-r--r--chrome/browser/ui/extensions/shell_window.h3
-rw-r--r--chrome/chrome_tests.gypi1
-rw-r--r--chrome/common/extensions/api/_permission_features.json4
-rw-r--r--chrome/common/extensions/docs/templates/articles/declare_permissions.html10
-rw-r--r--chrome/common/extensions/permissions/api_permission.cc1
-rw-r--r--chrome/common/extensions/permissions/api_permission.h1
-rw-r--r--chrome/common/extensions/permissions/permission_set_unittest.cc5
-rw-r--r--chrome/test/data/extensions/api_test/pointer_lock/has_permission/background.js7
-rw-r--r--chrome/test/data/extensions/api_test/pointer_lock/has_permission/manifest.json12
-rw-r--r--chrome/test/data/extensions/api_test/pointer_lock/has_permission/window.html10
-rw-r--r--chrome/test/data/extensions/api_test/pointer_lock/has_permission/window.js13
-rw-r--r--chrome/test/data/extensions/api_test/pointer_lock/no_permission/background.js7
-rw-r--r--chrome/test/data/extensions/api_test/pointer_lock/no_permission/manifest.json12
-rw-r--r--chrome/test/data/extensions/api_test/pointer_lock/no_permission/window.html10
-rw-r--r--chrome/test/data/extensions/api_test/pointer_lock/no_permission/window.js13
17 files changed, 135 insertions, 2 deletions
diff --git a/chrome/browser/extensions/extension_pointer_lock_apitest.cc b/chrome/browser/extensions/extension_pointer_lock_apitest.cc
new file mode 100644
index 0000000..14ebe0e
--- /dev/null
+++ b/chrome/browser/extensions/extension_pointer_lock_apitest.cc
@@ -0,0 +1,21 @@
+// Copyright (c) 2012 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"
+#include "chrome/test/base/ui_test_utils.h"
+
+
+IN_PROC_BROWSER_TEST_F(ExtensionApiTest,
+ ExtensionPointerLockAccessFail) {
+ // Test that pointer lock cannot be accessed from an extension without
+ // permission.
+ ASSERT_TRUE(RunPlatformAppTest("pointer_lock/no_permission")) << message_;
+}
+
+// Disabled, RenderWidgetHostView doesn't gain focus. http://crbug.com/162978
+IN_PROC_BROWSER_TEST_F(ExtensionApiTest,
+ DISABLED_ExtensionPointerLockAccessPass) {
+ // Test that pointer lock can be accessed from an extension with permission.
+ ASSERT_TRUE(RunPlatformAppTest("pointer_lock/has_permission")) << message_;
+}
diff --git a/chrome/browser/ui/extensions/shell_window.cc b/chrome/browser/ui/extensions/shell_window.cc
index 32f0a1e..8176073 100644
--- a/chrome/browser/ui/extensions/shell_window.cc
+++ b/chrome/browser/ui/extensions/shell_window.cc
@@ -310,6 +310,13 @@ void ShellWindow::HandleKeyboardEvent(
native_app_window_->HandleKeyboardEvent(event);
}
+void ShellWindow::RequestToLockMouse(WebContents* web_contents,
+ bool user_gesture,
+ bool last_unlocked_by_target) {
+ web_contents->GotResponseToLockMouseRequest(
+ extension_->HasAPIPermission(extensions::APIPermission::kPointerLock));
+}
+
void ShellWindow::OnNativeClose() {
extensions::ShellWindowRegistry::Get(profile_)->RemoveShellWindow(this);
content::RenderViewHost* rvh = web_contents_->GetRenderViewHost();
diff --git a/chrome/browser/ui/extensions/shell_window.h b/chrome/browser/ui/extensions/shell_window.h
index 31f639e..2862fad 100644
--- a/chrome/browser/ui/extensions/shell_window.h
+++ b/chrome/browser/ui/extensions/shell_window.h
@@ -164,6 +164,9 @@ class ShellWindow : public content::NotificationObserver,
virtual void HandleKeyboardEvent(
content::WebContents* source,
const content::NativeWebKeyboardEvent& event) OVERRIDE;
+ virtual void RequestToLockMouse(content::WebContents* web_contents,
+ bool user_gesture,
+ bool last_unlocked_by_target) OVERRIDE;
// content::NotificationObserver implementation.
virtual void Observe(int type,
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index 49ea955..6613a10 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -176,6 +176,7 @@
'browser/extensions/extension_keybinding_apitest.cc',
'browser/extensions/notifications_apitest.cc',
'browser/extensions/window_open_interactive_apitest.cc',
+ 'browser/extensions/extension_pointer_lock_apitest.cc',
'browser/instant/instant_browsertest.cc',
'browser/mouseleave_browsertest.cc',
'browser/notifications/desktop_notifications_unittest.cc',
diff --git a/chrome/common/extensions/api/_permission_features.json b/chrome/common/extensions/api/_permission_features.json
index 4a17329..1d8c74f 100644
--- a/chrome/common/extensions/api/_permission_features.json
+++ b/chrome/common/extensions/api/_permission_features.json
@@ -235,6 +235,10 @@
"channel": "stable",
"extension_types": ["extension", "packaged_app"]
},
+ "pointerLock": {
+ "channel": "dev",
+ "extension_types": ["platform_app"]
+ },
"plugin": {
"channel": "stable",
"extension_types": ["extension", "packaged_app"]
diff --git a/chrome/common/extensions/docs/templates/articles/declare_permissions.html b/chrome/common/extensions/docs/templates/articles/declare_permissions.html
index 92c3ef9..a8ad27d 100644
--- a/chrome/common/extensions/docs/templates/articles/declare_permissions.html
+++ b/chrome/common/extensions/docs/templates/articles/declare_permissions.html
@@ -226,6 +226,16 @@ table.
For more information see
<a href="notifications.html">Desktop Notifications</a>.</td>
</tr>
+{{?is_apps}}
+<tr>
+ <td> "pointerLock" </td>
+ <td> Required to use
+ <a href="http://www.w3.org/TR/pointerlock/">Pointer Lock</a> via calls to
+ <code>webkitRequestPointerLock</code></a> or Pepper's
+ <a href="https://developers.google.com/native-client/peppercpp/classpp_1_1_mouse_lock">
+ Mouse Lock API</a>. </td>
+</tr>
+{{/is_apps}}
{{^is_apps}}
<tr>
<td> "privacy" </td>
diff --git a/chrome/common/extensions/permissions/api_permission.cc b/chrome/common/extensions/permissions/api_permission.cc
index dbccbd4..cee9432 100644
--- a/chrome/common/extensions/permissions/api_permission.cc
+++ b/chrome/common/extensions/permissions/api_permission.cc
@@ -329,6 +329,7 @@ void APIPermissionInfo::RegisterAllPermissions(
{ APIPermission::kSystemIndicator, "systemIndicator", kFlagNone,
IDS_EXTENSION_PROMPT_WARNING_SYSTEM_INDICATOR,
PermissionMessage::kSystemIndicator },
+ { APIPermission::kPointerLock, "pointerLock" },
};
for (size_t i = 0; i < ARRAYSIZE_UNSAFE(PermissionsToRegister); ++i) {
diff --git a/chrome/common/extensions/permissions/api_permission.h b/chrome/common/extensions/permissions/api_permission.h
index a022b27..c942c5b 100644
--- a/chrome/common/extensions/permissions/api_permission.h
+++ b/chrome/common/extensions/permissions/api_permission.h
@@ -84,6 +84,7 @@ class APIPermission {
kMetricsPrivate,
kNotification,
kPageCapture,
+ kPointerLock,
kPlugin,
kPrivacy,
kProxy,
diff --git a/chrome/common/extensions/permissions/permission_set_unittest.cc b/chrome/common/extensions/permissions/permission_set_unittest.cc
index cd536db..9834e14 100644
--- a/chrome/common/extensions/permissions/permission_set_unittest.cc
+++ b/chrome/common/extensions/permissions/permission_set_unittest.cc
@@ -653,19 +653,20 @@ TEST(PermissionsTest, PermissionMessages) {
// a prompt.
skip.insert(APIPermission::kActiveTab);
skip.insert(APIPermission::kAlarms);
+ skip.insert(APIPermission::kAppCurrentWindowInternal);
skip.insert(APIPermission::kAppNotifications);
skip.insert(APIPermission::kAppRuntime);
skip.insert(APIPermission::kAppWindow);
- skip.insert(APIPermission::kAppCurrentWindowInternal);
skip.insert(APIPermission::kBrowsingData);
skip.insert(APIPermission::kContextMenus);
skip.insert(APIPermission::kFontSettings);
skip.insert(APIPermission::kIdle);
skip.insert(APIPermission::kNotification);
+ skip.insert(APIPermission::kPointerLock);
skip.insert(APIPermission::kPushMessaging);
- skip.insert(APIPermission::kUnlimitedStorage);
skip.insert(APIPermission::kStorage);
skip.insert(APIPermission::kTts);
+ skip.insert(APIPermission::kUnlimitedStorage);
skip.insert(APIPermission::kWebView);
// TODO(erikkay) add a string for this permission.
diff --git a/chrome/test/data/extensions/api_test/pointer_lock/has_permission/background.js b/chrome/test/data/extensions/api_test/pointer_lock/has_permission/background.js
new file mode 100644
index 0000000..ba1f1d2
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/pointer_lock/has_permission/background.js
@@ -0,0 +1,7 @@
+// Copyright (c) 2011 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.
+
+chrome.app.runtime.onLaunched.addListener(function() {
+ chrome.app.window.create('window.html');
+});
diff --git a/chrome/test/data/extensions/api_test/pointer_lock/has_permission/manifest.json b/chrome/test/data/extensions/api_test/pointer_lock/has_permission/manifest.json
new file mode 100644
index 0000000..acd5231
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/pointer_lock/has_permission/manifest.json
@@ -0,0 +1,12 @@
+{
+ "name": "pointer lock access apitest pass",
+ "description": "tests pointer lock is accessible from this extension",
+ "version": "1",
+ "manifest_version": 2,
+ "app": {
+ "background": {
+ "scripts": ["background.js"]
+ }
+ },
+ "permissions": [ "pointerLock" ]
+}
diff --git a/chrome/test/data/extensions/api_test/pointer_lock/has_permission/window.html b/chrome/test/data/extensions/api_test/pointer_lock/has_permission/window.html
new file mode 100644
index 0000000..ff97be2
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/pointer_lock/has_permission/window.html
@@ -0,0 +1,10 @@
+<!--
+ * Copyright (c) 2012 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.
+-->
+<html>
+<body>
+<script src="window.js"></script>
+</body>
+</html>
diff --git a/chrome/test/data/extensions/api_test/pointer_lock/has_permission/window.js b/chrome/test/data/extensions/api_test/pointer_lock/has_permission/window.js
new file mode 100644
index 0000000..433994d
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/pointer_lock/has_permission/window.js
@@ -0,0 +1,13 @@
+// Copyright (c) 2012 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.
+
+window.onload = function () {
+ chrome.test.runTests([
+ function requestPointerLock() {
+ document.onwebkitpointerlockchange = chrome.test.succeed;
+ document.onwebkitpointerlockerror = chrome.test.fail;
+ document.body.webkitRequestPointerLock();
+ },
+ ]);
+}
diff --git a/chrome/test/data/extensions/api_test/pointer_lock/no_permission/background.js b/chrome/test/data/extensions/api_test/pointer_lock/no_permission/background.js
new file mode 100644
index 0000000..ba1f1d2
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/pointer_lock/no_permission/background.js
@@ -0,0 +1,7 @@
+// Copyright (c) 2011 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.
+
+chrome.app.runtime.onLaunched.addListener(function() {
+ chrome.app.window.create('window.html');
+});
diff --git a/chrome/test/data/extensions/api_test/pointer_lock/no_permission/manifest.json b/chrome/test/data/extensions/api_test/pointer_lock/no_permission/manifest.json
new file mode 100644
index 0000000..5031be4
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/pointer_lock/no_permission/manifest.json
@@ -0,0 +1,12 @@
+{
+ "name": "pointer lock access apitest fail",
+ "description": "tests pointer lock is not accessible from this extension",
+ "version": "1",
+ "manifest_version": 2,
+ "app": {
+ "background": {
+ "scripts": ["background.js"]
+ }
+ },
+ "permissions": [ ]
+}
diff --git a/chrome/test/data/extensions/api_test/pointer_lock/no_permission/window.html b/chrome/test/data/extensions/api_test/pointer_lock/no_permission/window.html
new file mode 100644
index 0000000..ff97be2
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/pointer_lock/no_permission/window.html
@@ -0,0 +1,10 @@
+<!--
+ * Copyright (c) 2012 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.
+-->
+<html>
+<body>
+<script src="window.js"></script>
+</body>
+</html>
diff --git a/chrome/test/data/extensions/api_test/pointer_lock/no_permission/window.js b/chrome/test/data/extensions/api_test/pointer_lock/no_permission/window.js
new file mode 100644
index 0000000..8659048
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/pointer_lock/no_permission/window.js
@@ -0,0 +1,13 @@
+// Copyright (c) 2012 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.
+
+window.onload = function () {
+ chrome.test.runTests([
+ function requestPointerLock() {
+ document.onwebkitpointerlockchange = chrome.test.fail;
+ document.onwebkitpointerlockerror = chrome.test.succeed;
+ document.body.webkitRequestPointerLock();
+ },
+ ]);
+}