| Index: extensions/renderer/resources/platform_app.js
|
| diff --git a/extensions/renderer/resources/platform_app.js b/extensions/renderer/resources/platform_app.js
|
| index 21263d3d0c213e35f3b774feb362e5a0b8fcd711..9f386d790d25dd404a9e785aa588b320b0ef4bb9 100644
|
| --- a/extensions/renderer/resources/platform_app.js
|
| +++ b/extensions/renderer/resources/platform_app.js
|
| @@ -2,6 +2,8 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +var logging = requireNative('logging');
|
| +
|
| /**
|
| * Returns a function that logs a 'not available' error to the console and
|
| * returns undefined.
|
| @@ -65,10 +67,16 @@ function generateThrowingMethodStub(messagePrefix, opt_messageSuffix) {
|
| */
|
| function disableMethods(object, objectName, methodNames, useThrowingStubs) {
|
| $Array.forEach(methodNames, function(methodName) {
|
| + logging.DCHECK($Object.getOwnPropertyDescriptor(object, methodName),
|
| + objectName + ': ' + methodName);
|
| var messagePrefix = objectName + '.' + methodName + '()';
|
| - object[methodName] = useThrowingStubs ?
|
| - generateThrowingMethodStub(messagePrefix) :
|
| - generateDisabledMethodStub(messagePrefix);
|
| + $Object.defineProperty(object, methodName, {
|
| + configurable: false,
|
| + enumerable: false,
|
| + value: useThrowingStubs ?
|
| + generateThrowingMethodStub(messagePrefix) :
|
| + generateDisabledMethodStub(messagePrefix)
|
| + });
|
| });
|
| }
|
|
|
| @@ -85,9 +93,16 @@ function disableMethods(object, objectName, methodNames, useThrowingStubs) {
|
| * referred to by web developers, e.g. "document" instead of
|
| * "HTMLDocument").
|
| * @param {Array<string>} propertyNames names of properties to disable.
|
| + * @param {?string=} opt_messageSuffix An optional suffix for the message.
|
| + * @param {boolean=} opt_ignoreMissingProperty True if we allow disabling
|
| + * getters for non-existent properties.
|
| */
|
| -function disableGetters(object, objectName, propertyNames, opt_messageSuffix) {
|
| +function disableGetters(object, objectName, propertyNames, opt_messageSuffix,
|
| + opt_ignoreMissingProperty) {
|
| $Array.forEach(propertyNames, function(propertyName) {
|
| + logging.DCHECK(opt_ignoreMissingProperty ||
|
| + $Object.getOwnPropertyDescriptor(object, propertyName),
|
| + objectName + ': ' + propertyName);
|
| var stub = generateDisabledMethodStub(objectName + '.' + propertyName,
|
| opt_messageSuffix);
|
| stub._is_platform_app_disabled_getter = true;
|
| @@ -130,10 +145,12 @@ function disableGetters(object, objectName, propertyNames, opt_messageSuffix) {
|
| */
|
| function disableSetters(object, objectName, propertyNames, opt_messageSuffix) {
|
| $Array.forEach(propertyNames, function(propertyName) {
|
| + logging.DCHECK($Object.getOwnPropertyDescriptor(object, propertyName),
|
| + objectName + ': ' + propertyName);
|
| var stub = generateDisabledMethodStub(objectName + '.' + propertyName,
|
| opt_messageSuffix);
|
| $Object.defineProperty(object, propertyName, {
|
| - configurable: true,
|
| + configurable: false,
|
| enumerable: false,
|
| get: function() {
|
| return;
|
| @@ -144,24 +161,26 @@ function disableSetters(object, objectName, propertyNames, opt_messageSuffix) {
|
| }
|
|
|
| // Disable benign Document methods.
|
| -disableMethods(HTMLDocument.prototype, 'document', ['open', 'clear', 'close']);
|
| +disableMethods(Document.prototype, 'document', ['open', 'close']);
|
| +disableMethods(HTMLDocument.prototype, 'document', ['clear']);
|
|
|
| // Replace evil Document methods with exception-throwing stubs.
|
| -disableMethods(HTMLDocument.prototype, 'document', ['write', 'writeln'], true);
|
| +disableMethods(Document.prototype, 'document', ['write', 'writeln'], true);
|
|
|
| // Disable history.
|
| Object.defineProperty(window, "history", { value: {} });
|
| +// Note: we just blew away the history object, so we need to ignore the fact
|
| +// that these properties aren't defined on the object.
|
| disableGetters(window.history, 'history',
|
| - ['back', 'forward', 'go', 'length', 'pushState', 'replaceState', 'state']);
|
| + ['back', 'forward', 'go', 'length', 'pushState', 'replaceState', 'state'],
|
| + null, true);
|
|
|
| // Disable find.
|
| disableMethods(window, 'window', ['find']);
|
| -disableMethods(Window.prototype, 'window', ['find']);
|
|
|
| // Disable modal dialogs. Shell windows disable these anyway, but it's nice to
|
| // warn.
|
| disableMethods(window, 'window', ['alert', 'confirm', 'prompt']);
|
| -disableMethods(Window.prototype, 'window', ['alert', 'confirm', 'prompt']);
|
|
|
| // Disable window.*bar.
|
| disableGetters(window, 'window',
|
| @@ -194,16 +213,20 @@ window.addEventListener('readystatechange', function(event) {
|
| // it first to 'undefined' to avoid this.
|
| document.all = undefined;
|
| disableGetters(document, 'document',
|
| - ['alinkColor', 'all', 'bgColor', 'fgColor', 'linkColor', 'vlinkColor']);
|
| + ['alinkColor', 'all', 'bgColor', 'fgColor', 'linkColor', 'vlinkColor'],
|
| + null, true);
|
| }, true);
|
|
|
| // Disable onunload, onbeforeunload.
|
| disableSetters(window, 'window', ['onbeforeunload', 'onunload']);
|
| -disableSetters(Window.prototype, 'window', ['onbeforeunload', 'onunload']);
|
| var eventTargetAddEventListener = EventTarget.prototype.addEventListener;
|
| EventTarget.prototype.addEventListener = function(type) {
|
| + var args = $Array.slice(arguments);
|
| + // Note: Force conversion to a string in order to catch any funny attempts
|
| + // to pass in something that evals to 'unload' but wouldn't === 'unload'.
|
| + var type = (args[0] += '');
|
| if (type === 'unload' || type === 'beforeunload')
|
| generateDisabledMethodStub(type)();
|
| else
|
| - return $Function.apply(eventTargetAddEventListener, this, arguments);
|
| + return $Function.apply(eventTargetAddEventListener, this, args);
|
| };
|
|
|