Bug 906432 - Use getOwnPropertyNames() in test_interfaces.html. r=smaug

This commit is contained in:
Masatoshi Kimura 2013-08-22 22:44:19 +09:00
Родитель 37640717b2
Коммит 5188bb1a3e
3 изменённых файлов: 217 добавлений и 88 удалений

Просмотреть файл

@ -23,6 +23,9 @@ SpecialPowers.addCategoryEntry("JavaScript-global-property", "testSNSM", "@mozil
SimpleTest.executeSoon(function () { SimpleTest.executeSoon(function () {
ok(window.testSNSM, "testSNSM should return an object"); ok(window.testSNSM, "testSNSM should return an object");
// The category entry must be removed before finishing the test,
// otherwise it will affect all following tests in the test suite.
SpecialPowers.deleteCategoryEntry("JavaScript-global-property", "testSNSM", false);
SimpleTest.finish(); SimpleTest.finish();
}); });

Просмотреть файл

@ -7,11 +7,12 @@
var win = XPCNativeWrapper.unwrap(window); var win = XPCNativeWrapper.unwrap(window);
var SpecialPowers = win.SpecialPowers; var SpecialPowers = win.SpecialPowers;
var is = win.is; var is = win.is;
var todo_is = win.todo_is;
var ok = win.ok; var ok = win.ok;
var interfaceNamesInGlobalScope = win.interfaceNamesInGlobalScope; var excludedNames = win.excludedNames;
var interfaceNamesInXBLScope = win.interfaceNamesInXBLScope; var createInterfaceMap = win.createInterfaceMap;
eval(win.runTest.toString()); eval(win.runTest.toString());
runTest(window, true); runTest(true);
win.SimpleTest.finish(); win.SimpleTest.finish();
</constructor> </constructor>
</implementation> </implementation>

Просмотреть файл

@ -23,26 +23,88 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=766694
// This is a list of all interfaces that are exposed to every webpage. Please only // This is a list of all interfaces that are exposed to every webpage. Please only
// add things to this list with great care. // add things to this list with great care.
// IMPORTANT: Do not change this list without review from a JavaScript Engine peer!
var ecmaGlobals =
[
"Array",
"ArrayBuffer",
"Boolean",
"DataView",
"Date",
"Error",
"EvalError",
"Float32Array",
"Float64Array",
"Function",
"Infinity",
"Int16Array",
"Int32Array",
"Int8Array",
"InternalError",
"Iterator",
"JSON",
"Map",
"Math",
"NaN",
"Number",
"Object",
{name: "ParallelArray", nightly: true},
"Proxy",
"RangeError",
"ReferenceError",
"RegExp",
"Set",
"StopIteration",
"String",
"SyntaxError",
"TypeError",
"Uint16Array",
"Uint32Array",
"Uint8Array",
"Uint8ClampedArray",
"URIError",
"WeakMap",
];
// IMPORTANT: Do not change this list without review from a JavaScript Engine peer!
// IMPORTANT: Do not change this list without review from a DOM peer! // IMPORTANT: Do not change this list without review from a DOM peer!
var interfaceNamesInGlobalScope = var interfaceNamesInGlobalScope =
[ [
"AnalyserNode",
"AnimationEvent", "AnimationEvent",
"Array", "ArchiveRequest",
"AsyncScrollEventDetail", "AsyncScrollEventDetail",
"Attr", "Attr",
"Audio",
"AudioBuffer",
"AudioContext",
"AudioBufferSourceNode",
"AudioDestinationNode",
"AudioListener",
"AudioNode",
"AudioParam",
"AudioProcessingEvent",
"AudioStreamTrack",
"BarProp", "BarProp",
"BatteryManager", "BatteryManager",
"BeforeUnloadEvent", "BeforeUnloadEvent",
"BiquadFilterNode",
"Blob", "Blob",
"BlobEvent", "BlobEvent",
{name: "BoxObject", xbl: true},
{name: "BrowserFeedWriter", android: false},
"CameraCapabilities", "CameraCapabilities",
"CameraControl", "CameraControl",
"CameraManager", "CameraManager",
"CanvasGradient", "CanvasGradient",
"CanvasPattern", "CanvasPattern",
"CanvasRenderingContext2D", "CanvasRenderingContext2D",
"CaretPosition",
"CDATASection", "CDATASection",
"ChannelMergerNode",
"ChannelSplitterNode",
"CharacterData", "CharacterData",
{name: "ChromeWindow", xbl: true},
"ClientRect", "ClientRect",
"ClientRectList", "ClientRectList",
"ClipboardEvent", "ClipboardEvent",
@ -51,17 +113,21 @@ var interfaceNamesInGlobalScope =
"Comment", "Comment",
"CompositionEvent", "CompositionEvent",
"Controllers", "Controllers",
"CRMFObject", "ConvolverNode",
{name: "CRMFObject", android: false},
"Crypto", "Crypto",
"CSS",
"CSS2Properties", "CSS2Properties",
"CSSCharsetRule", "CSSCharsetRule",
"CSSConditionRule", "CSSConditionRule",
"CSSFontFaceRule", "CSSFontFaceRule",
"CSSFontFeatureValuesRule", {name: "CSSFontFeatureValuesRule", release: false},
"CSSGroupingRule", "CSSGroupingRule",
"CSSGroupRuleRuleList",
"CSSImportRule", "CSSImportRule",
"CSSMediaRule", "CSSMediaRule",
"CSSMozDocumentRule", "CSSMozDocumentRule",
"CSSNameSpaceRule",
"CSSPageRule", "CSSPageRule",
"CSSPrimitiveValue", "CSSPrimitiveValue",
"CSSRule", "CSSRule",
@ -76,6 +142,7 @@ var interfaceNamesInGlobalScope =
"DataChannel", "DataChannel",
"DataContainerEvent", "DataContainerEvent",
"DataTransfer", "DataTransfer",
"DelayNode",
"DesktopNotification", "DesktopNotification",
"DesktopNotificationCenter", "DesktopNotificationCenter",
"DeviceAcceleration", "DeviceAcceleration",
@ -86,14 +153,16 @@ var interfaceNamesInGlobalScope =
"DeviceRotationRate", "DeviceRotationRate",
"DeviceStorage", "DeviceStorage",
"DeviceStorageChangeEvent", "DeviceStorageChangeEvent",
"DeviceStorageCursor",
"Document", "Document",
"DocumentFragment", "DocumentFragment",
"DocumentType", "DocumentType",
{name: "DOMConstructor", xbl: true},
"DOMCursor", "DOMCursor",
"DOMError", "DOMError",
"DOMException", "DOMException",
"DOMImplementation", "DOMImplementation",
"DOMMMIError",
"DOMParser",
"DOMRequest", "DOMRequest",
"DOMSettableTokenList", "DOMSettableTokenList",
"DOMStringList", "DOMStringList",
@ -101,9 +170,9 @@ var interfaceNamesInGlobalScope =
"DOMTokenList", "DOMTokenList",
"DOMTransactionEvent", "DOMTransactionEvent",
"DragEvent", "DragEvent",
"DynamicsCompressorNode",
"Element", "Element",
"ElementReplaceEvent", "ElementReplaceEvent",
"ElementTimeControl",
"Event", "Event",
"EventListenerInfo", "EventListenerInfo",
"EventSource", "EventSource",
@ -115,10 +184,11 @@ var interfaceNamesInGlobalScope =
"FileRequest", "FileRequest",
"FocusEvent", "FocusEvent",
"FormData", "FormData",
"Gamepad", "GainNode",
"GamepadAxisMoveEvent", {name: "Gamepad", android: false},
"GamepadButtonEvent", {name: "GamepadAxisMoveEvent", android: false},
"GamepadEvent", {name: "GamepadButtonEvent", android: false},
{name: "GamepadEvent", android: false},
"HashChangeEvent", "HashChangeEvent",
"History", "History",
"HTMLAnchorElement", "HTMLAnchorElement",
@ -131,7 +201,7 @@ var interfaceNamesInGlobalScope =
"HTMLButtonElement", "HTMLButtonElement",
"HTMLCanvasElement", "HTMLCanvasElement",
"HTMLCollection", "HTMLCollection",
"HTMLCommandElement", "HTMLDataElement",
"HTMLDataListElement", "HTMLDataListElement",
"HTMLDirectoryElement", "HTMLDirectoryElement",
"HTMLDivElement", "HTMLDivElement",
@ -177,6 +247,7 @@ var interfaceNamesInGlobalScope =
"HTMLScriptElement", "HTMLScriptElement",
"HTMLSelectElement", "HTMLSelectElement",
"HTMLSourceElement", "HTMLSourceElement",
"HTMLSpanElement",
"HTMLStyleElement", "HTMLStyleElement",
"HTMLTableCaptionElement", "HTMLTableCaptionElement",
"HTMLTableCellElement", "HTMLTableCellElement",
@ -184,7 +255,9 @@ var interfaceNamesInGlobalScope =
"HTMLTableElement", "HTMLTableElement",
"HTMLTableRowElement", "HTMLTableRowElement",
"HTMLTableSectionElement", "HTMLTableSectionElement",
"HTMLTemplateElement",
"HTMLTextAreaElement", "HTMLTextAreaElement",
"HTMLTimeElement",
"HTMLTitleElement", "HTMLTitleElement",
"HTMLUListElement", "HTMLUListElement",
"HTMLUnknownElement", "HTMLUnknownElement",
@ -193,6 +266,7 @@ var interfaceNamesInGlobalScope =
"IDBCursorWithValue", "IDBCursorWithValue",
"IDBDatabase", "IDBDatabase",
"IDBFactory", "IDBFactory",
"IDBFileHandle",
"IDBIndex", "IDBIndex",
"IDBKeyRange", "IDBKeyRange",
"IDBObjectStore", "IDBObjectStore",
@ -200,18 +274,25 @@ var interfaceNamesInGlobalScope =
"IDBRequest", "IDBRequest",
"IDBTransaction", "IDBTransaction",
"IDBVersionChangeEvent", "IDBVersionChangeEvent",
"Image",
"ImageData", "ImageData",
"JSON", {name: "InstallTrigger", xbl: false},
"KeyEvent", "KeyEvent",
"KeyboardEvent",
"LoadStatus", "LoadStatus",
"LocalMediaStream", "LocalMediaStream",
"Location", "Location",
"LockedFile", "LockedFile",
"LSProgressEvent", "MediaElementAudioSourceNode",
"MediaError", "MediaError",
"MediaList", "MediaList",
"MediaQueryList", "MediaQueryList",
"MediaRecorder",
"MediaStream", "MediaStream",
"MediaStreamAudioDestinationNode",
"MediaStreamAudioSourceNode",
"MediaStreamEvent",
"MediaStreamTrack",
"MessageEvent", "MessageEvent",
"MimeType", "MimeType",
"MimeTypeArray", "MimeTypeArray",
@ -219,31 +300,26 @@ var interfaceNamesInGlobalScope =
"MouseEvent", "MouseEvent",
"MouseScrollEvent", "MouseScrollEvent",
"MozApplicationEvent", "MozApplicationEvent",
"MozBlobBuilder",
"MozCanvasPrintState", "MozCanvasPrintState",
"MozConnection", "MozConnection",
"mozContact",
"MozContactChangeEvent", "MozContactChangeEvent",
"MozCSSKeyframeRule", "MozCSSKeyframeRule",
"MozCSSKeyframesRule", "MozCSSKeyframesRule",
"MozMmsEvent", "MozMmsEvent",
"MozMmsMessage", "MozMmsMessage",
"MozMobileCellInfo",
"MozMobileConnectionInfo",
"MozMobileMessageManager", "MozMobileMessageManager",
"MozMobileMessageThread", "MozMobileMessageThread",
"MozMobileNetworkInfo",
"MozNamedAttrMap", "MozNamedAttrMap",
"MozNetworkStats",
"MozNetworkStatsData",
"MozNetworkStatsManager",
"MozPowerManager", "MozPowerManager",
"mozRTCIceCandidate",
"mozRTCPeerConnection",
"mozRTCSessionDescription",
"MozSettingsEvent", "MozSettingsEvent",
"MozSmsEvent", "MozSmsEvent",
"MozSmsFilter", "MozSmsFilter",
"MozSmsMessage", "MozSmsMessage",
"MozSmsSegmentInfo", "MozSmsSegmentInfo",
"MozTimeManager",
"MozTouchEvent",
"MozWakeLock", "MozWakeLock",
"MutationEvent", "MutationEvent",
"MutationObserver", "MutationObserver",
@ -253,47 +329,54 @@ var interfaceNamesInGlobalScope =
"NodeFilter", "NodeFilter",
"NodeIterator", "NodeIterator",
"NodeList", "NodeList",
"NodeSelector",
"NotifyAudioAvailableEvent", "NotifyAudioAvailableEvent",
"Notification",
"NotifyPaintEvent", "NotifyPaintEvent",
"NSRGBAColor", "OfflineAudioCompletionEvent",
"OfflineAudioContext",
"OfflineResourceList", "OfflineResourceList",
"OpenWindowEventDetail", "OpenWindowEventDetail",
"Option",
"OscillatorNode",
"PageTransitionEvent", "PageTransitionEvent",
"PaintRequest", "PaintRequest",
"PaintRequestList", "PaintRequestList",
"PaymentRequestInfo", "PannerNode",
"Performance", "Performance",
"PerformanceNavigation", "PerformanceNavigation",
"PerformanceTiming", "PerformanceTiming",
"PeriodicWave",
"PhoneNumberService",
"Plugin", "Plugin",
"PluginArray", "PluginArray",
"PopStateEvent", "PopStateEvent",
"PopupBlockedEvent", "PopupBlockedEvent",
"ProcessingInstruction", "ProcessingInstruction",
"ProgressEvent", "ProgressEvent",
{name: "Promise", release: false},
{name: "PromiseResolver", release: false},
"PropertyNodeList", "PropertyNodeList",
"Range", "Range",
"RecordErrorEvent", "RecordErrorEvent",
"Rect", "Rect",
"RGBColor", "RGBColor",
"RTCIceCandidate", "RTCDataChannelEvent",
"RTCPeerConnection", "RTCPeerConnectionIceEvent",
"RTCSessionDescription",
"Screen", "Screen",
"ScriptProcessorNode",
"ScrollAreaEvent", "ScrollAreaEvent",
"Selection", "Selection",
"SettingsLock", "SettingsLock",
"SettingsManager", "SettingsManager",
"SimpleGestureEvent", "SimpleGestureEvent",
{name: "SimpleTest", xbl: false},
"SmartCardEvent", "SmartCardEvent",
"SpeechRecognitionError", "SpeechRecognitionError",
"SpeechRecognitionEvent", "SpeechRecognitionEvent",
"SpeechSynthesisEvent", "SpeechSynthesisEvent",
{name: "SpecialPowers", xbl: false},
"Storage", "Storage",
"StorageEvent", "StorageEvent",
"StorageItem",
"StorageObsolete",
"StyleRuleChangeEvent", "StyleRuleChangeEvent",
"StyleSheet", "StyleSheet",
"StyleSheetApplicableStateChangeEvent", "StyleSheetApplicableStateChangeEvent",
@ -310,8 +393,6 @@ var interfaceNamesInGlobalScope =
"SVGAnimatedLengthList", "SVGAnimatedLengthList",
"SVGAnimatedNumber", "SVGAnimatedNumber",
"SVGAnimatedNumberList", "SVGAnimatedNumberList",
"SVGAnimatedPathData",
"SVGAnimatedPoints",
"SVGAnimatedPreserveAspectRatio", "SVGAnimatedPreserveAspectRatio",
"SVGAnimatedRect", "SVGAnimatedRect",
"SVGAnimatedString", "SVGAnimatedString",
@ -328,7 +409,6 @@ var interfaceNamesInGlobalScope =
"SVGDocument", "SVGDocument",
"SVGElement", "SVGElement",
"SVGEllipseElement", "SVGEllipseElement",
"SVGEvent",
"SVGFEBlendElement", "SVGFEBlendElement",
"SVGFEColorMatrixElement", "SVGFEColorMatrixElement",
"SVGFEComponentTransferElement", "SVGFEComponentTransferElement",
@ -354,22 +434,20 @@ var interfaceNamesInGlobalScope =
"SVGFETileElement", "SVGFETileElement",
"SVGFETurbulenceElement", "SVGFETurbulenceElement",
"SVGFilterElement", "SVGFilterElement",
"SVGFilterPrimitiveStandardAttributes",
"SVGFitToViewBox",
"SVGForeignObjectElement", "SVGForeignObjectElement",
"SVGGElement", "SVGGElement",
"SVGGradientElement", "SVGGradientElement",
"SVGGraphicsElement",
"SVGImageElement", "SVGImageElement",
"SVGLength", "SVGLength",
"SVGLengthList", "SVGLengthList",
"SVGLinearGradientElement", "SVGLinearGradientElement",
"SVGLineElement", "SVGLineElement",
"SVGLocatable",
"SVGMarkerElement", "SVGMarkerElement",
"SVGMaskElement", "SVGMaskElement",
"SVGMatrix", "SVGMatrix",
"SVGMetadataElement", "SVGMetadataElement",
"SVGMpathElement", "SVGMPathElement",
"SVGNumber", "SVGNumber",
"SVGNumberList", "SVGNumberList",
"SVGPathElement", "SVGPathElement",
@ -407,31 +485,26 @@ var interfaceNamesInGlobalScope =
"SVGSetElement", "SVGSetElement",
"SVGStopElement", "SVGStopElement",
"SVGStringList", "SVGStringList",
"SVGStylable",
"SVGStyleElement", "SVGStyleElement",
"SVGSVGElement", "SVGSVGElement",
"SVGSwitchElement", "SVGSwitchElement",
"SVGSymbolElement", "SVGSymbolElement",
"SVGTests",
"SVGTextContentElement", "SVGTextContentElement",
"SVGTextElement", "SVGTextElement",
"SVGTextPathElement", "SVGTextPathElement",
"SVGTextPositioningElement", "SVGTextPositioningElement",
"SVGTitleElement", "SVGTitleElement",
"SVGTransform", "SVGTransform",
"SVGTransformable",
"SVGTransformList", "SVGTransformList",
"SVGTSpanElement", "SVGTSpanElement",
"SVGUnitTypes", "SVGUnitTypes",
"SVGURIReference",
"SVGUseElement", "SVGUseElement",
"SVGViewElement", "SVGViewElement",
"SVGViewSpec",
"SVGZoomAndPan", "SVGZoomAndPan",
"SVGZoomEvent", "SVGZoomEvent",
"TCPSocket",
"TCPServerSocket",
"Text", "Text",
"TextDecoder",
"TextEncoder",
"TextMetrics", "TextMetrics",
"TimeEvent", "TimeEvent",
"TimeRanges", "TimeRanges",
@ -439,79 +512,131 @@ var interfaceNamesInGlobalScope =
"TouchEvent", "TouchEvent",
"TouchList", "TouchList",
"TransitionEvent", "TransitionEvent",
{name: "TreeColumn", xbl: true},
{name: "TreeColumns", xbl: true},
{name: "TreeContentView", xbl: true},
{name: "TreeSelection", xbl: true},
"TreeWalker", "TreeWalker",
"UIEvent", "UIEvent",
"UndoManager", "UndoManager",
"URL", "URL",
"UserDataHandler", "UserDataHandler",
"UserProximityEvent", "UserProximityEvent",
"USSDReceivedEvent",
"ValidityState", "ValidityState",
"VideoStreamTrack",
"WaveShaperNode",
"WebGLActiveInfo",
"WebGLBuffer",
"WebGLFramebuffer",
"WebGLProgram",
"WebGLRenderbuffer",
"WebGLRenderingContext", "WebGLRenderingContext",
"WebGLShader",
"WebGLShaderPrecisionFormat",
"WebGLTexture",
"WebGLUniformLocation",
"WebGLVertexArray",
"WebSocket", "WebSocket",
"WheelEvent", "WheelEvent",
"Window", "Window",
"WindowUtils", "WindowUtils",
"XMLDocument", "XMLDocument",
"XMLHttpRequest", "XMLHttpRequest",
"XMLHttpRequestEventTarget",
"XMLHttpRequestUpload", "XMLHttpRequestUpload",
"XMLSerializer",
"XMLStylesheetProcessingInstruction",
"XPathEvaluator", "XPathEvaluator",
"XPathExpression", "XPathExpression",
"XPathNamespace", "XPathNamespace",
"XPathNSResolver", "XPathNSResolver",
"XPathResult", "XPathResult",
"XSLTProcessor", "XSLTProcessor",
"XULElement", {name: "XULButtonElement", xbl: true},
{name: "XULCheckboxElement", xbl: true},
{name: "XULCommandDispatcher", xbl: true},
{name: "XULCommandEvent", xbl: true},
{name: "XULControlElement", xbl: true},
{name: "XULControllers", xbl: true},
{name: "XULDocument", xbl: true},
{name: "XULElement", win: true, xbl: true},
{name: "XULLabeledControlElement", xbl: true},
{name: "XULPopupElement", xbl: true},
{name: "XULTemplateBuilder", xbl: true},
{name: "XULTreeBuilder", xbl: true},
] ]
// IMPORTANT: Do not change this list without review from a DOM peer! // IMPORTANT: Do not change this list without review from a DOM peer!
// If your interface is named nsIDOMSomeInterface and you don't mean to expose var excludedNames = [
// it to every webpage, simply change its name to nsISomeInterface to fix this problem. "TraceMallocDisable", // debug builds only
"TraceMallocEnable", // debug builds only
var interfaceNamesInXBLScope = [ "TraceMallocOpenLogFile", // debug builds only
"BoxObject", "TraceMallocChangeLogFD", // debug builds only
"ChromeWindow", "TraceMallocCloseLogFD", // debug builds only
"DOMConstructor", "TraceMallocLogTimestamp", // debug builds only
"TreeColumn", "TraceMallocDumpAllocations", // debug builds only
"TreeColumns",
"TreeContentView",
"TreeSelection",
"XULButtonElement",
"XULCheckboxElement",
"XULCommandDispatcher",
"XULCommandEvent",
"XULControlElement",
"XULControllers",
"XULDocument",
"XULLabeledControlElement",
"XULPopupElement",
"XULTemplateBuilder",
"XULTreeBuilder",
]; ];
function runTest(win, isXBLScope) { function createInterfaceMap(isXBLScope) {
for (var i in SpecialPowers.Components.interfaces) { var version = SpecialPowers.Cc["@mozilla.org/xre/app-info;1"].getService(SpecialPowers.Ci.nsIXULAppInfo).version;
var s = i.toString(); var isNightly = version.endsWith("a1");
var name = null; var isRelease = !version.contains("a");
if (s.indexOf("nsIDOM") == 0) { var isAndroid = navigator.userAgent.indexOf("Android") >= 0;
name = s.substring("nsIDOM".length); var isWin = navigator.userAgent.indexOf("Windows") >= 0;
} else if (s.indexOf("nsI") == 0) { var interfaceMap = {};
name = s.substring("nsI".length); for (var entry of ecmaGlobals) {
} if (typeof(entry) === "string") {
if (name && (name in win)) { // Standard ECMAScript global objects are not defined on the XBL scope.
ok(interfaceNamesInGlobalScope.indexOf(name) >= 0 || interfaceMap[entry] = !isXBLScope;
(isXBLScope && interfaceNamesInXBLScope.indexOf(name) >= 0), } else if (entry.nightly === isNightly) {
"If this is failing: DANGER, are you sure you want to expose the new interface " + name + " to all webpages as a property on the window?"); interfaceMap[entry.name] = !isXBLScope;
} else {
interfaceMap[entry.name] = false;
} }
} }
for (var name of interfaceNamesInXBLScope) { for (var entry of interfaceNamesInGlobalScope) {
is(name in win, isXBLScope, if (typeof(entry) === "string") {
name + " should" + (isXBLScope ? "" : " NOT") + " be present in the global scope"); interfaceMap[entry] = true;
} else if (entry.xbl === isXBLScope ||
entry.win === isWin ||
entry.android === isAndroid ||
entry.release === isRelease) {
interfaceMap[entry.name] = true;
} else {
interfaceMap[entry.name] = false;
}
}
return interfaceMap;
}
function runTest(isXBLScope) {
var interfaceMap = createInterfaceMap(isXBLScope);
for (var name of Object.getOwnPropertyNames(window)) {
// An interfae name should start with an upper case character.
if (!/^(moz)?[A-Z]/.test(name) ||
excludedNames.indexOf(name) >= 0) {
continue;
}
ok(interfaceMap[name],
"If this is failing: DANGER, are you sure you want to expose the new interface " + name + " to all webpages as a property on the window?");
delete interfaceMap[name];
}
for (var name of Object.keys(interfaceMap)) {
ok(name in window === interfaceMap[name],
name + " should " + (interfaceMap[name] ? "" : " NOT") + " be defined on the " + (isXBLScope ? "XBL" : "global") +" scope");
if (!interfaceMap[name]) {
delete interfaceMap[name];
}
}
if (isXBLScope) {
todo_is(Object.keys(interfaceMap).length, 0,
"The following interface(s) are not enumerated: " + Object.keys(interfaceMap).join(", "));
} else {
is(Object.keys(interfaceMap).length, 0,
"The following interface(s) are not enumerated: " + Object.keys(interfaceMap).join(", "));
} }
} }
runTest(window, false); runTest(false);
SimpleTest.waitForExplicitFinish(); SimpleTest.waitForExplicitFinish();
</script> </script>