diff options
author | scheib@chromium.org <scheib@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-01 01:59:05 +0000 |
---|---|---|
committer | scheib@chromium.org <scheib@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-01 01:59:05 +0000 |
commit | af06dbdcae56421c8911e60fa27221c6c1ae6437 (patch) | |
tree | e6d047565d2ff77b1d2379a0f58a5d3f67d50539 | |
parent | 2ab1ff6998e6953e65f82ae836bddac66810e1c3 (diff) | |
download | chromium_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
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(); + }, + ]); +} |