Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 /** | 5 /** |
| 6 * @fileoverview | 6 * @fileoverview |
| 7 * A module that contains basic utility components and methods for the | 7 * A module that contains basic utility components and methods for the |
| 8 * chromoting project | 8 * chromoting project |
| 9 * | 9 * |
| 10 */ | 10 */ |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 55 return callstack.join('\n'); | 55 return callstack.join('\n'); |
| 56 }; | 56 }; |
| 57 | 57 |
| 58 /** | 58 /** |
| 59 * @interface | 59 * @interface |
| 60 */ | 60 */ |
| 61 base.Disposable = function() {}; | 61 base.Disposable = function() {}; |
| 62 base.Disposable.prototype.dispose = function() {}; | 62 base.Disposable.prototype.dispose = function() {}; |
| 63 | 63 |
| 64 /** | 64 /** |
| 65 * @constructor | |
| 66 * @param {...base.Disposable} var_args | |
| 67 * @implements {base.Disposable} | |
| 68 */ | |
| 69 base.Disposables = function(var_args) { | |
| 70 /** | |
| 71 * @type {Array.<base.Disposable>} | |
| 72 * @private | |
| 73 */ | |
| 74 this.disposables_ = Array.prototype.slice.call(arguments, 0); | |
| 75 }; | |
| 76 | |
| 77 base.Disposables.prototype.dispose = function() { | |
| 78 for (var i = 0; i < this.disposables_.length; i++) { | |
| 79 this.disposables_[i].dispose(); | |
| 80 } | |
| 81 }; | |
| 82 | |
| 83 /** | |
| 65 * A utility function to invoke |obj|.dispose without a null check on |obj|. | 84 * A utility function to invoke |obj|.dispose without a null check on |obj|. |
| 66 * @param {base.Disposable} obj | 85 * @param {base.Disposable} obj |
| 67 */ | 86 */ |
| 68 base.dispose = function(obj) { | 87 base.dispose = function(obj) { |
| 69 if (obj) { | 88 if (obj) { |
| 70 base.debug.assert(typeof obj.dispose == 'function'); | 89 base.debug.assert(typeof obj.dispose == 'function'); |
| 71 obj.dispose(); | 90 obj.dispose(); |
| 72 } | 91 } |
| 73 }; | 92 }; |
| 74 | 93 |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 426 /** @param {function(*=):void} listener */ | 445 /** @param {function(*=):void} listener */ |
| 427 function(listener){ | 446 function(listener){ |
| 428 if (listener) { | 447 if (listener) { |
| 429 listener(opt_details); | 448 listener(opt_details); |
| 430 } | 449 } |
| 431 }); | 450 }); |
| 432 } | 451 } |
| 433 }; | 452 }; |
| 434 | 453 |
| 435 /** | 454 /** |
| 455 * An light weight object that helps managing the lifetime of an event | |
|
Jamie
2015/02/02 23:46:19
s/An/A/
s/light weight/lightweight/
s/managing/man
| |
| 456 * listener. | |
| 457 * | |
| 458 * For example, do the following if you want to automatically unhook events | |
| 459 * when your object is disposed: | |
| 460 * | |
| 461 * var MyConstructor = function(domElement) { | |
| 462 * this.eventHooks_ = new base.Disposables( | |
| 463 * new base.EventHook(domElement, 'click', this.onClick_.bind(this)), | |
| 464 * new base.EventHook(domElement, 'keydown', this.onClick_.bind(this)), | |
| 465 * new base.ChromeEventHook(chrome.runtime.onMessage, | |
| 466 * this.onMessage_.bind(this)) | |
| 467 * ); | |
| 468 * } | |
| 469 * | |
| 470 * MyConstructor.prototype.dispose = function () { | |
|
Jamie
2015/02/02 23:46:20
No space before ()--even for comments :)
kelvinp
2015/02/03 01:42:01
Done.
| |
| 471 * this.eventHooks_.dispose(); | |
| 472 * this.eventHooks_ = null; | |
| 473 * } | |
| 474 * | |
| 475 * @param {base.EventSource | HTMLElement} src | |
| 476 * @param {string} eventName | |
| 477 * @param {Function} listener | |
|
kelvinp
2015/02/02 23:08:34
Function is the JavaScript official type name of f
| |
| 478 * @param {boolean=} opt_capture | |
| 479 * | |
| 480 * @constructor | |
| 481 * @implements {base.Disposable} | |
| 482 */ | |
| 483 base.EventHook = function(src, eventName, listener, opt_capture) { | |
| 484 this.src_ = src; | |
| 485 this.eventName_ = eventName; | |
| 486 this.listener_ = listener; | |
| 487 this.capture_ = opt_capture; | |
| 488 base.debug.assert( | |
| 489 (typeof opt_capture === 'boolean') === (src instanceof HTMLElement), | |
| 490 'opt_capture is only valid for DOM Events.'); | |
|
Jamie
2015/02/02 23:46:19
I think this would be better guarded against by se
| |
| 491 src.addEventListener(eventName, listener, opt_capture); | |
| 492 }; | |
| 493 | |
| 494 base.EventHook.prototype.dispose = function() { | |
| 495 this.src_.removeEventListener(this.eventName_, this.listener_, this.capture_); | |
| 496 }; | |
| 497 | |
| 498 /** | |
| 499 * An event hook implementation for Chrome Events. | |
| 500 * | |
| 501 * @param {chrome.Event} src | |
| 502 * @param {Function} listener | |
| 503 * | |
| 504 * @constructor | |
| 505 * @implements {base.Disposable} | |
| 506 */ | |
| 507 base.ChromeEventHook = function(src, listener) { | |
| 508 this.src_ = src; | |
| 509 this.listener_ = listener; | |
| 510 src.addListener(listener); | |
| 511 }; | |
| 512 | |
| 513 base.ChromeEventHook.prototype.dispose = function() { | |
| 514 this.src_.removeListener(this.listener_); | |
| 515 }; | |
| 516 | |
| 517 /** | |
| 436 * Converts UTF-8 string to ArrayBuffer. | 518 * Converts UTF-8 string to ArrayBuffer. |
| 437 * | 519 * |
| 438 * @param {string} string | 520 * @param {string} string |
| 439 * @return {ArrayBuffer} | 521 * @return {ArrayBuffer} |
| 440 */ | 522 */ |
| 441 base.encodeUtf8 = function(string) { | 523 base.encodeUtf8 = function(string) { |
| 442 var utf8String = unescape(encodeURIComponent(string)); | 524 var utf8String = unescape(encodeURIComponent(string)); |
| 443 var result = new Uint8Array(utf8String.length); | 525 var result = new Uint8Array(utf8String.length); |
| 444 for (var i = 0; i < utf8String.length; i++) | 526 for (var i = 0; i < utf8String.length; i++) |
| 445 result[i] = utf8String.charCodeAt(i); | 527 result[i] = utf8String.charCodeAt(i); |
| 446 return result.buffer; | 528 return result.buffer; |
| 447 } | 529 }; |
| 448 | 530 |
| 449 /** | 531 /** |
| 450 * Decodes UTF-8 string from ArrayBuffer. | 532 * Decodes UTF-8 string from ArrayBuffer. |
| 451 * | 533 * |
| 452 * @param {ArrayBuffer} buffer | 534 * @param {ArrayBuffer} buffer |
| 453 * @return {string} | 535 * @return {string} |
| 454 */ | 536 */ |
| 455 base.decodeUtf8 = function(buffer) { | 537 base.decodeUtf8 = function(buffer) { |
| 456 return decodeURIComponent( | 538 return decodeURIComponent( |
| 457 escape(String.fromCharCode.apply(null, new Uint8Array(buffer)))); | 539 escape(String.fromCharCode.apply(null, new Uint8Array(buffer)))); |
| 458 } | 540 }; |
| 459 | 541 |
| 460 /** | 542 /** |
| 461 * Generate a nonce, to be used as an xsrf protection token. | 543 * Generate a nonce, to be used as an xsrf protection token. |
| 462 * | 544 * |
| 463 * @return {string} A URL-Safe Base64-encoded 128-bit random value. */ | 545 * @return {string} A URL-Safe Base64-encoded 128-bit random value. */ |
| 464 base.generateXsrfToken = function() { | 546 base.generateXsrfToken = function() { |
| 465 var random = new Uint8Array(16); | 547 var random = new Uint8Array(16); |
| 466 window.crypto.getRandomValues(random); | 548 window.crypto.getRandomValues(random); |
| 467 var base64Token = window.btoa(String.fromCharCode.apply(null, random)); | 549 var base64Token = window.btoa(String.fromCharCode.apply(null, random)); |
| 468 return base64Token.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); | 550 return base64Token.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); |
| 469 }; | 551 }; |
| 470 | 552 |
| 471 /** | 553 /** |
| 472 * @param {string} jsonString A JSON-encoded string. | 554 * @param {string} jsonString A JSON-encoded string. |
| 473 * @return {Object|undefined} The decoded object, or undefined if the string | 555 * @return {Object|undefined} The decoded object, or undefined if the string |
| 474 * cannot be parsed. | 556 * cannot be parsed. |
| 475 */ | 557 */ |
| 476 base.jsonParseSafe = function(jsonString) { | 558 base.jsonParseSafe = function(jsonString) { |
| 477 try { | 559 try { |
| 478 return /** @type {Object} */ (JSON.parse(jsonString)); | 560 return /** @type {Object} */ (JSON.parse(jsonString)); |
| 479 } catch (err) { | 561 } catch (err) { |
| 480 return undefined; | 562 return undefined; |
| 481 } | 563 } |
| 482 } | 564 }; |
| OLD | NEW |