Index: trunk/src/extensions/renderer/resources/platform_app.js |
=================================================================== |
--- trunk/src/extensions/renderer/resources/platform_app.js (revision 274563) |
+++ trunk/src/extensions/renderer/resources/platform_app.js (working copy) |
@@ -1,207 +0,0 @@ |
-// Copyright 2014 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. |
- |
-var $console = window.console; |
- |
-/** |
- * Returns a function that logs a 'not available' error to the console and |
- * returns undefined. |
- * |
- * @param {string} messagePrefix text to prepend to the exception message. |
- */ |
-function generateDisabledMethodStub(messagePrefix, opt_messageSuffix) { |
- var message = messagePrefix + ' is not available in packaged apps.'; |
- if (opt_messageSuffix) message = message + ' ' + opt_messageSuffix; |
- return function() { |
- $console.error(message); |
- return; |
- }; |
-} |
- |
-/** |
- * Returns a function that throws a 'not available' error. |
- * |
- * @param {string} messagePrefix text to prepend to the exception message. |
- */ |
-function generateThrowingMethodStub(messagePrefix, opt_messageSuffix) { |
- var message = messagePrefix + ' is not available in packaged apps.'; |
- if (opt_messageSuffix) message = message + ' ' + opt_messageSuffix; |
- return function() { |
- throw new Error(message); |
- }; |
-} |
- |
-/** |
- * Replaces the given methods of the passed in object with stubs that log |
- * 'not available' errors to the console and return undefined. |
- * |
- * This should be used on methods attached via non-configurable properties, |
- * such as window.alert. disableGetters should be used when possible, because |
- * it is friendlier towards feature detection. |
- * |
- * In most cases, the useThrowingStubs should be false, so the stubs used to |
- * replace the methods log an error to the console, but allow the calling code |
- * to continue. We shouldn't break library code that uses feature detection |
- * responsibly, such as: |
- * if(window.confirm) { |
- * var result = window.confirm('Are you sure you want to delete ...?'); |
- * ... |
- * } |
- * |
- * useThrowingStubs should only be true for methods that are deprecated in the |
- * Web platform, and should not be used by a responsible library, even in |
- * conjunction with feature detection. A great example is document.write(), as |
- * the HTML5 specification recommends against using it, and says that its |
- * behavior is unreliable. No reasonable library code should ever use it. |
- * HTML5 spec: http://www.w3.org/TR/html5/dom.html#dom-document-write |
- * |
- * @param {Object} object The object with methods to disable. The prototype is |
- * preferred. |
- * @param {string} objectName The display name to use in the error message |
- * thrown by the stub (this is the name that the object is commonly referred |
- * to by web developers, e.g. "document" instead of "HTMLDocument"). |
- * @param {Array.<string>} methodNames names of methods to disable. |
- * @param {Boolean} useThrowingStubs if true, the replaced methods will throw |
- * an error instead of silently returning undefined |
- */ |
-function disableMethods(object, objectName, methodNames, useThrowingStubs) { |
- $Array.forEach(methodNames, function(methodName) { |
- var messagePrefix = objectName + '.' + methodName + '()'; |
- object[methodName] = useThrowingStubs ? |
- generateThrowingMethodStub(messagePrefix) : |
- generateDisabledMethodStub(messagePrefix); |
- }); |
-} |
- |
-/** |
- * Replaces the given properties of the passed in object with stubs that log |
- * 'not available' warnings to the console and return undefined when gotten. If |
- * a property's setter is later invoked, the getter and setter are restored to |
- * default behaviors. |
- * |
- * @param {Object} object The object with properties to disable. The prototype |
- * is preferred. |
- * @param {string} objectName The display name to use in the error message |
- * thrown by the getter stub (this is the name that the object is commonly |
- * referred to by web developers, e.g. "document" instead of |
- * "HTMLDocument"). |
- * @param {Array.<string>} propertyNames names of properties to disable. |
- */ |
-function disableGetters(object, objectName, propertyNames, opt_messageSuffix) { |
- $Array.forEach(propertyNames, function(propertyName) { |
- var stub = generateDisabledMethodStub(objectName + '.' + propertyName, |
- opt_messageSuffix); |
- stub._is_platform_app_disabled_getter = true; |
- $Object.defineProperty(object, propertyName, { |
- configurable: true, |
- enumerable: false, |
- get: stub, |
- set: function(value) { |
- var descriptor = $Object.getOwnPropertyDescriptor(this, propertyName); |
- if (!descriptor || !descriptor.get || |
- descriptor.get._is_platform_app_disabled_getter) { |
- // The stub getter is still defined. Blow-away the property to |
- // restore default getter/setter behaviors and re-create it with the |
- // given value. |
- delete this[propertyName]; |
- this[propertyName] = value; |
- } else { |
- // Do nothing. If some custom getter (not ours) has been defined, |
- // there would be no way to read back the value stored by a default |
- // setter. Also, the only way to clear a custom getter is to first |
- // delete the property. Therefore, the value we have here should |
- // just go into a black hole. |
- } |
- } |
- }); |
- }); |
-} |
- |
-/** |
- * Replaces the given properties of the passed in object with stubs that log |
- * 'not available' warnings to the console when set. |
- * |
- * @param {Object} object The object with properties to disable. The prototype |
- * is preferred. |
- * @param {string} objectName The display name to use in the error message |
- * thrown by the setter stub (this is the name that the object is commonly |
- * referred to by web developers, e.g. "document" instead of |
- * "HTMLDocument"). |
- * @param {Array.<string>} propertyNames names of properties to disable. |
- */ |
-function disableSetters(object, objectName, propertyNames, opt_messageSuffix) { |
- $Array.forEach(propertyNames, function(propertyName) { |
- var stub = generateDisabledMethodStub(objectName + '.' + propertyName, |
- opt_messageSuffix); |
- $Object.defineProperty(object, propertyName, { |
- configurable: true, |
- enumerable: false, |
- get: function() { |
- return; |
- }, |
- set: stub |
- }); |
- }); |
-} |
- |
-// Disable benign Document methods. |
-disableMethods(HTMLDocument.prototype, 'document', ['open', 'clear', 'close']); |
- |
-// Replace evil Document methods with exception-throwing stubs. |
-disableMethods(HTMLDocument.prototype, 'document', ['write', 'writeln'], true); |
- |
-// Disable history. |
-Object.defineProperty(window, "history", { value: {} }); |
-disableGetters(window.history, 'history', ['back', 'forward', 'go', 'length']); |
- |
-// Disable find. |
-disableMethods(Window.prototype, 'window', ['find']); |
- |
-// Disable modal dialogs. Shell windows disable these anyway, but it's nice to |
-// warn. |
-disableMethods(Window.prototype, 'window', ['alert', 'confirm', 'prompt']); |
- |
-// Disable window.*bar. |
-disableGetters(window, 'window', |
- ['locationbar', 'menubar', 'personalbar', 'scrollbars', 'statusbar', |
- 'toolbar']); |
- |
-// Disable window.localStorage. |
-// Sometimes DOM security policy prevents us from doing this (e.g. for data: |
-// URLs) so wrap in try-catch. |
-try { |
- disableGetters(window, 'window', |
- ['localStorage'], |
- 'Use chrome.storage.local instead.'); |
-} catch (e) {} |
- |
-// Document instance properties that we wish to disable need to be set when |
-// the document begins loading, since only then will the "document" reference |
-// point to the page's document (it will be reset between now and then). |
-// We can't listen for the "readystatechange" event on the document (because |
-// the object that it's dispatched on doesn't exist yet), but we can instead |
-// do it at the window level in the capturing phase. |
-window.addEventListener('readystatechange', function(event) { |
- if (document.readyState != 'loading') |
- return; |
- |
- // Deprecated document properties from |
- // https://developer.mozilla.org/en/DOM/document. |
- // To deprecate document.all, simply changing its getter and setter would |
- // activate its cache mechanism, and degrade the performance. Here we assign |
- // it first to 'undefined' to avoid this. |
- document.all = undefined; |
- disableGetters(document, 'document', |
- ['alinkColor', 'all', 'bgColor', 'fgColor', 'linkColor', 'vlinkColor']); |
-}, true); |
- |
-// Disable onunload, onbeforeunload. |
-disableSetters(Window.prototype, 'window', ['onbeforeunload', 'onunload']); |
-var windowAddEventListener = Window.prototype.addEventListener; |
-Window.prototype.addEventListener = function(type) { |
- if (type === 'unload' || type === 'beforeunload') |
- generateDisabledMethodStub(type)(); |
- else |
- return $Function.apply(windowAddEventListener, window, arguments); |
-}; |