DevTools: Prevent browser behavior of shortcuts in extension panels
This patch calls preventDefault on all events that we forward from
extension panels into devtools. This would cancel too many events,
so a list of devtools global keyboard shortcuts are passed into the
extension.
Bug: 682068
Change-Id: Ide557dafed759e20dfc6698d8cdc33f932acbe83
Reviewed-on: https://chromium-review.googlesource.com/1159467
Reviewed-by: Andrey Lushnikov <[email protected]>
Commit-Queue: Joel Einbinder <[email protected]>
Cr-Original-Commit-Position: refs/heads/master@{#580011}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 9714881871a256c98e5b12651aedd5210319ef36
diff --git a/front_end/extensions/ExtensionAPI.js b/front_end/extensions/ExtensionAPI.js
index d4a2f35..5f8390e 100644
--- a/front_end/extensions/ExtensionAPI.js
+++ b/front_end/extensions/ExtensionAPI.js
@@ -89,11 +89,13 @@
* @param {!ExtensionDescriptor} extensionInfo
* @param {string} inspectedTabId
* @param {string} themeName
+ * @param {!Array<number>} keysToForward
* @param {number} injectedScriptId
* @param {function(!Object, !Object)} testHook
* @suppressGlobalPropertiesCheck
*/
-function injectedExtensionAPI(extensionInfo, inspectedTabId, themeName, testHook, injectedScriptId) {
+function injectedExtensionAPI(extensionInfo, inspectedTabId, themeName, keysToForward, testHook, injectedScriptId) {
+ const keysToForwardSet = new Set(keysToForward);
const chrome = window.chrome || {};
const devtools_descriptor = Object.getOwnPropertyDescriptor(chrome, 'devtools');
if (devtools_descriptor)
@@ -637,14 +639,26 @@
let forwardTimer = null;
function forwardKeyboardEvent(event) {
+ let modifiers = 0;
+ if (event.shiftKey)
+ modifiers |= 1;
+ if (event.ctrlKey)
+ modifiers |= 2;
+ if (event.altKey)
+ modifiers |= 4;
+ if (event.metaKey)
+ modifiers |= 8;
+ const num = (event.keyCode & 255) | (modifiers << 8);
// We only care about global hotkeys, not about random text
- if (!event.ctrlKey && !event.altKey && !event.metaKey && !/^F\d+$/.test(event.key) && event.key !== 'Escape')
+ if (!keysToForwardSet.has(num))
return;
+ event.preventDefault();
const requestPayload = {
eventType: event.type,
ctrlKey: event.ctrlKey,
altKey: event.altKey,
metaKey: event.metaKey,
+ shiftKey: event.shiftKey,
keyIdentifier: event.keyIdentifier,
key: event.key,
code: event.code,
@@ -795,11 +809,12 @@
* @param {!ExtensionDescriptor} extensionInfo
* @param {string} inspectedTabId
* @param {string} themeName
+ * @param {!Array<number>} keysToForward
* @param {function(!Object, !Object)|undefined} testHook
* @return {string}
*/
-function buildExtensionAPIInjectedScript(extensionInfo, inspectedTabId, themeName, testHook) {
- const argumentsJSON = [extensionInfo, inspectedTabId || null, themeName].map(_ => JSON.stringify(_)).join(',');
+function buildExtensionAPIInjectedScript(extensionInfo, inspectedTabId, themeName, keysToForward, testHook) {
+ const argumentsJSON = [extensionInfo, inspectedTabId || null, themeName, keysToForward].map(_ => JSON.stringify(_)).join(',');
if (!testHook)
testHook = () => {};
return '(function(injectedScriptId){ ' + defineCommonExtensionSymbols.toString() + ';' +