Index: LayoutTests/fast/dom/Window/resources/window-property-collector.js |
diff --git a/LayoutTests/fast/dom/Window/resources/window-property-collector.js b/LayoutTests/fast/dom/Window/resources/window-property-collector.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3b07a4e1220fa525e4b25ad4b6380695aa31c0c0 |
--- /dev/null |
+++ b/LayoutTests/fast/dom/Window/resources/window-property-collector.js |
@@ -0,0 +1,88 @@ |
+function collectProperties() |
+{ |
+ // Collect properties of the top-level window, since touching the properties |
+ // of a DOMWindow affects its internal C++ state. |
+ collectPropertiesHelper(window, []); |
+ |
+ propertiesToVerify.sort(function (a, b) |
+ { |
+ if (a.property < b.property) |
+ return -1 |
+ if (a.property > b.property) |
+ return 1; |
+ return 0; |
+ }); |
+} |
+ |
+function emitExpectedResult(path, expected) |
+{ |
+ if (path[0] == 'internals' // Skip internals properties, since they aren't web accessible. |
+ || path[0] == 'propertiesToVerify' // Skip the list we're building... |
+ || path[0] == 'clientInformation') // Just an alias for navigator. |
+ return; |
+ // FIXME: Skip MemoryInfo for now, since it's not implemented as a DOMWindowProperty, and has |
+ // no way of knowing when it's detached. Eventually this should have the same behavior. |
+ if (path.length >= 2 && (path[0] == 'console' || path[0] == 'performance') && path[1] == 'memory') |
+ return; |
+ // Skip things that are assumed to be constants. |
+ if (path[path.length - 1].toUpperCase() == path[path.length - 1]) |
+ return; |
+ |
+ // Various special cases... |
+ var propertyPath = path.join('.'); |
+ switch (propertyPath) { |
+ case "location.href": |
+ expected = "'about:blank'"; |
+ break; |
+ case "location.origin": |
+ expected = "'null'"; |
+ break; |
+ case "location.pathname": |
+ expected = "'blank'"; |
+ break; |
+ case "location.protocol": |
+ expected = "'about:'"; |
+ break; |
+ case "navigator.appCodeName": |
+ case "navigator.appName": |
+ case "navigator.language": |
+ case "navigator.onLine": |
+ case "navigator.platform": |
+ case "navigator.product": |
+ case "navigator.productSub": |
+ case "navigator.vendor": |
+ expected = "window." + propertyPath; |
+ break; |
+ } |
+ |
+ insertExpectedResult(path, expected); |
+} |
+ |
+function collectPropertiesHelper(object, path) |
+{ |
+ if (path.length > 20) |
+ throw 'Error: probably looping'; |
+ for (var property in object) { |
+ if (!object[property]) |
+ continue; |
+ path.push(property); |
+ var type = typeof(object[property]); |
+ if (type == "object") { |
+ // Skip some traversing through types that will end up in cycles... |
+ if (!object[property].Window |
+ && !(object[property] instanceof Node) |
+ && !(object[property] instanceof MimeTypeArray) |
+ && !(object[property] instanceof PluginArray)) { |
+ collectPropertiesHelper(object[property], path); |
+ } |
+ } else if (type == "string") { |
+ emitExpectedResult(path, "''"); |
+ } else if (type == "number") { |
+ emitExpectedResult(path, "0"); |
+ } else if (type == "boolean") { |
+ emitExpectedResult(path, "false"); |
+ } |
+ path.pop(); |
+ } |
+} |
+ |