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

Unified Diff: chrome/renderer/resources/extensions/platform_app.js

Issue 245443003: Update platform_app.js to work even if window.history is not replaceable (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 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 side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/resources/extensions/platform_app.js
diff --git a/chrome/renderer/resources/extensions/platform_app.js b/chrome/renderer/resources/extensions/platform_app.js
index 0982a6a18ea0b4371208292f1fd14f6ed4d3b921..829fa3fe4c2d484bdc78f9b629781dec75da21a4 100644
--- a/chrome/renderer/resources/extensions/platform_app.js
+++ b/chrome/renderer/resources/extensions/platform_app.js
@@ -75,6 +75,22 @@ function disableMethods(object, objectName, methodNames, useThrowingStubs) {
}
/**
+ * Deletes the given methods from the passed in objext.
+ *
+ * This may be needed for feature detection as ('methodName' in object) will
+ * return false after this.
+ *
+ * @param {Object} object The object with methods to disable. The prototype is
+ * preferred.
+ * @param {Array.<string>} methodNames names of methods to delete.
+ */
+function deleteMethods(object, methodNames) {
+ $Array.forEach(methodNames, function(methodName) {
+ delete object[methodName];
+ });
+}
+
+/**
* 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
@@ -145,15 +161,33 @@ function disableSetters(object, objectName, propertyNames, opt_messageSuffix) {
});
}
+/**
+ * Deletes the given properties of the passed in object.
+ *
+ * This may be needed for feature detection as ('propertyName' in object) will
+ * return false after this.
+ *
+ * @param {Object} object The object with properties to disable.
+ * @param {Array.<string>} propertyNames names of properties to delete.
+ */
+function deleteProperties(object, propertyNames) {
+ $Array.forEach(propertyNames, function(propertyName) {
+ delete object[propertyName];
+ });
+}
+
// 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.
-window.history = {};
arv (Not doing code reviews) 2014/04/22 13:54:42 This one could have been replaced with a definePro
Inactive 2014/04/22 14:43:54 Would be much simpler, let me give this a try.
Inactive 2014/04/22 14:59:59 Done, thanks. Much simpler indeed.
+// Disable history API.
disableGetters(window.history, 'history', ['back', 'forward', 'go', 'length']);
+// These are part of the HTML5 History API that are feature detected, so we
+// remove them altogether, allowing apps to have fallback behavior.
+deleteProperties(window.history, ['state']);
+deleteMethods(History.prototype, ['pushState', 'replaceState']);
// Disable find.
disableMethods(Window.prototype, 'window', ['find']);

Powered by Google App Engine
This is Rietveld 408576698