Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: Source/devtools/front_end/KeyboardShortcut.js

Issue 218613013: DevTools: Decouple shortcuts from actions, introduce shortcut contexts (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix context-related sort order Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2009 Apple Inc. All rights reserved.
3 * Copyright (C) 2009 Google Inc. All rights reserved. 3 * Copyright (C) 2009 Google Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 8 *
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Shift) 266 if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Shift)
267 res += isMac ? shiftKey : "Shift + "; 267 res += isMac ? shiftKey : "Shift + ";
268 if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Meta) 268 if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Meta)
269 res += isMac ? cmdKey : "Win + "; 269 res += isMac ? cmdKey : "Win + ";
270 270
271 return res; 271 return res;
272 }; 272 };
273 273
274 /** 274 /**
275 * @param {!KeyboardEvent} event 275 * @param {!KeyboardEvent} event
276 * @param {string} context
276 */ 277 */
277 WebInspector.KeyboardShortcut.handleShortcut = function(event) 278 WebInspector.KeyboardShortcut.handleShortcut = function(event, context)
278 { 279 {
279 var key = WebInspector.KeyboardShortcut.makeKeyFromEvent(event); 280 var key = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
280 var extensions = WebInspector.KeyboardShortcut._keysToActionExtensions[key]; 281 var entries = WebInspector.KeyboardShortcut._keyToAction[key];
281 if (!extensions) 282 if (!entries)
282 return; 283 return;
283 284
284 function handler(extension) 285 for (var i = 0; i < entries.length; ++i) {
286 var entry = entries[i];
287 if (entry.context && entry.context !== context)
288 continue;
289 var ident = event.keyIdentifier;
290 if (/^F\d+|Control|Shift|Alt|Meta|Win|U\+001B$/.test(ident) || event.ctr lKey || event.altKey || event.metaKey) {
291 if (handler(entry.actionId))
292 return;
293 } else {
294 WebInspector.KeyboardShortcut._pendingActionTimer = setTimeout(handl er.bind(null, entry.actionId), 0);
295 break;
296 }
297 }
298
299 function actionRegistry()
285 { 300 {
286 var result = extension.instance().handleAction(event); 301 if (!WebInspector.KeyboardShortcut._actionRegistry)
302 WebInspector.KeyboardShortcut._actionRegistry = WebInspector.moduleM anager.instance(WebInspector.ActionRegistryAPI);
303 return WebInspector.KeyboardShortcut._actionRegistry;
304 }
305
306 /**
307 * @param {string} actionId
308 */
309 function handler(actionId)
310 {
311 var result = actionRegistry().execute(actionId, event);
287 if (result) 312 if (result)
288 event.consume(true); 313 event.consume(true);
289 delete WebInspector.KeyboardShortcut._pendingActionTimer; 314 delete WebInspector.KeyboardShortcut._pendingActionTimer;
290 return result; 315 return result;
291 } 316 }
292
293 for (var i = 0; i < extensions.length; ++i) {
294 var ident = event.keyIdentifier;
295 if (/^F\d+|Control|Shift|Alt|Meta|Win|U\+001B$/.test(ident) || event.ctr lKey || event.altKey || event.metaKey) {
296 if (handler(extensions[i]))
297 return;
298 } else {
299 WebInspector.KeyboardShortcut._pendingActionTimer = setTimeout(handl er.bind(null, extensions[i]), 0);
300 break;
301 }
302 }
303 } 317 }
304 318
305 WebInspector.KeyboardShortcut.SelectAll = WebInspector.KeyboardShortcut.makeKey( "a", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta); 319 WebInspector.KeyboardShortcut.SelectAll = WebInspector.KeyboardShortcut.makeKey( "a", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta);
306 320
307 WebInspector.KeyboardShortcut._onKeyPress = function(event) 321 WebInspector.KeyboardShortcut._onKeyPress = function(event)
308 { 322 {
309 if (!WebInspector.KeyboardShortcut._pendingActionTimer) 323 if (!WebInspector.KeyboardShortcut._pendingActionTimer)
310 return; 324 return;
311 325
312 var target = event.target; 326 var target = event.target;
313 if (WebInspector.isBeingEdited(event.target)) { 327 if (WebInspector.isBeingEdited(event.target)) {
314 clearTimeout(WebInspector.KeyboardShortcut._pendingActionTimer); 328 clearTimeout(WebInspector.KeyboardShortcut._pendingActionTimer);
315 delete WebInspector.KeyboardShortcut._pendingActionTimer; 329 delete WebInspector.KeyboardShortcut._pendingActionTimer;
316 } 330 }
317 } 331 }
318 332
319 WebInspector.KeyboardShortcut.registerActions = function() 333 WebInspector.KeyboardShortcut.registerBindings = function()
320 { 334 {
321 document.addEventListener("keypress", WebInspector.KeyboardShortcut._onKeyPr ess, true); 335 document.addEventListener("keypress", WebInspector.KeyboardShortcut._onKeyPr ess, true);
322 WebInspector.KeyboardShortcut._keysToActionExtensions = {}; 336 WebInspector.KeyboardShortcut._keyToAction = {};
323 var extensions = WebInspector.moduleManager.extensions(WebInspector.ActionDe legate); 337 var extensions = WebInspector.moduleManager.extensions("action-bindings");
324 extensions.forEach(registerBindings); 338 extensions.forEach(registerExtension);
339
340 for (var key in WebInspector.KeyboardShortcut._keyToAction)
341 WebInspector.KeyboardShortcut._keyToAction[key].sort(comparator);
342
343 /**
344 * @param {{context: (string|undefined), actionId: string}} left
345 * @param {{context: (string|undefined), actionId: string}} right
346 */
347 function comparator(left, right)
348 {
349 if (left.context)
350 return right.context ? 0 : -1;
351 else
352 return right.context ? 1 : 0;
353 }
325 354
326 /** 355 /**
327 * @param {!WebInspector.ModuleManager.Extension} extension 356 * @param {!WebInspector.ModuleManager.Extension} extension
328 */ 357 */
329 function registerBindings(extension) 358 function registerExtension(extension)
330 { 359 {
331 var bindings = extension.descriptor().bindings; 360 var bindings = extension.descriptor().bindings;
332 for (var i = 0; bindings && i < bindings.length; ++i) { 361 for (var i = 0; bindings && i < bindings.length; ++i) {
333 if (!platformMatches(bindings[i].platform)) 362 if (!platformMatches(bindings[i].platform))
334 continue; 363 continue;
335 var shortcuts = bindings[i].shortcut.split(/\s+/); 364 var shortcuts = bindings[i].shortcut.split(/\s+/);
336 shortcuts.forEach(registerShortcut.bind(null, extension)); 365 shortcuts.forEach(registerShortcut.bind(null, bindings[i]["actionId" ], bindings[i].context));
337 } 366 }
338 } 367 }
339 368
340 /** 369 /**
341 * @param {!WebInspector.ModuleManager.Extension} extension 370 * @param {string} actionId
371 * @param {string|undefined} context
342 * @param {string} shortcut 372 * @param {string} shortcut
343 */ 373 */
344 function registerShortcut(extension, shortcut) 374 function registerShortcut(actionId, context, shortcut)
345 { 375 {
346 var key = WebInspector.KeyboardShortcut.makeKeyFromBindingShortcut(short cut); 376 var key = WebInspector.KeyboardShortcut.makeKeyFromBindingShortcut(short cut);
347 if (!key) 377 if (!key)
348 return; 378 return;
349 if (WebInspector.KeyboardShortcut._keysToActionExtensions[key]) 379 var entry = { context: context, actionId: actionId };
350 WebInspector.KeyboardShortcut._keysToActionExtensions[key].push(exte nsion); 380 if (WebInspector.KeyboardShortcut._keyToAction[key])
381 WebInspector.KeyboardShortcut._keyToAction[key].push(entry);
351 else 382 else
352 WebInspector.KeyboardShortcut._keysToActionExtensions[key] = [extens ion]; 383 WebInspector.KeyboardShortcut._keyToAction[key] = [entry];
353 } 384 }
354 385
355 /** 386 /**
356 * @param {string=} platformsString 387 * @param {string=} platformsString
357 * @return {boolean} 388 * @return {boolean}
358 */ 389 */
359 function platformMatches(platformsString) 390 function platformMatches(platformsString)
360 { 391 {
361 if (!platformsString) 392 if (!platformsString)
362 return true; 393 return true;
363 var platforms = platformsString.split(","); 394 var platforms = platformsString.split(",");
364 var isMatch = false; 395 var isMatch = false;
365 var currentPlatform = WebInspector.platform(); 396 var currentPlatform = WebInspector.platform();
366 for (var i = 0; !isMatch && i < platforms.length; ++i) 397 for (var i = 0; !isMatch && i < platforms.length; ++i)
367 isMatch = platforms[i] === currentPlatform; 398 isMatch = platforms[i] === currentPlatform;
368 return isMatch; 399 return isMatch;
369 } 400 }
370 } 401 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698