Changeset 283410 in webkit
- Timestamp:
- Oct 1, 2021, 3:12:09 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 17 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/http/tests/security/frameNavigation/context-for-location-href-gopd-expected.txt (modified) (1 diff)
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/html/webappapis/scripting/events/compile-event-handler-settings-objects-expected.txt (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-incumbent-expected.txt (modified) (1 diff)
-
Source/JavaScriptCore/ChangeLog (modified) (1 diff)
-
Source/JavaScriptCore/interpreter/CallFrame.cpp (modified) (1 diff)
-
Source/JavaScriptCore/runtime/JSObject.cpp (modified) (1 diff)
-
Source/JavaScriptCore/runtime/PropertySlot.h (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/bindings/js/JSDOMConvertCallbacks.h (modified) (2 diffs)
-
Source/WebCore/bindings/js/JSDOMGlobalObject.cpp (modified) (2 diffs)
-
Source/WebCore/bindings/js/JSDOMGlobalObject.h (modified) (1 diff)
-
Source/WebCore/bindings/js/JSDOMWindowBase.cpp (modified) (2 diffs)
-
Source/WebCore/bindings/js/JSDOMWindowBase.h (modified) (1 diff)
-
Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (modified) (2 diffs)
-
Source/WebCore/page/Location.idl (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r283407 r283410 1 2021-10-01 Yusuke Suzuki <ysuzuki@apple.com> 2 3 Disable new incumbent-window until it is fully implemented 4 https://bugs.webkit.org/show_bug.cgi?id=230261 5 <rdar://problem/83099726> 6 7 Reviewed by Chris Dumez and Geoffrey Garen. 8 9 * http/tests/security/frameNavigation/context-for-location-href-gopd-expected.txt: 10 1 11 2021-10-01 Lauro Moura <lmoura@igalia.com> 2 12 -
trunk/LayoutTests/http/tests/security/frameNavigation/context-for-location-href-gopd-expected.txt
r280256 r283410 1 document.referrer = http://127.0.0.1:8000/security/frameNavigation/ context-for-location-href-gopd.html1 document.referrer = http://127.0.0.1:8000/security/frameNavigation/resources/middle-frame-for-location.html 2 2 -
trunk/LayoutTests/imported/w3c/ChangeLog
r283398 r283410 1 2021-10-01 Yusuke Suzuki <ysuzuki@apple.com> 2 3 Disable new incumbent-window until it is fully implemented 4 https://bugs.webkit.org/show_bug.cgi?id=230261 5 <rdar://problem/83099726> 6 7 Reviewed by Chris Dumez and Geoffrey Garen. 8 9 * web-platform-tests/html/webappapis/scripting/events/compile-event-handler-settings-objects-expected.txt: 10 * web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-incumbent-expected.txt: 11 1 12 2021-10-01 Myles C. Maxfield <mmaxfield@apple.com> 2 13 -
trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/scripting/events/compile-event-handler-settings-objects-expected.txt
r280256 r283410 2 2 PASS The Function instance must be created in the Realm of the node document 3 3 FAIL The entry settings object while executing the compiled callback via Web IDL's invoke must be that of the node document assert_equals: expected "/html/webappapis/scripting/events/resources/open-window.html" but got "/html/webappapis/scripting/events/open-window.html" 4 PASS The incumbent settings object while executing the compiled callback via Web IDL's invoke must be that of the node document 4 FAIL The incumbent settings object while executing the compiled callback via Web IDL's invoke must be that of the node document assert_equals: expected "iframe" but got "parent frame" 5 5 -
trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-incumbent-expected.txt
r280256 r283410 3 3 PASS Sanity check: this all works as expected with no promises involved 4 4 PASS Fulfillment handler on fulfilled promise 5 FAIL Fulfillment handler on fulfilled promise, using backup incumbent settings object stack assert_equals: expected "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/resources/promise-job-incumbent-incumbent.html" but got "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/ promise-job-incumbent.html"5 FAIL Fulfillment handler on fulfilled promise, using backup incumbent settings object stack assert_equals: expected "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/resources/promise-job-incumbent-incumbent.html" but got "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/resources/current/current.html" 6 6 PASS Rejection handler on rejected promise 7 FAIL Rejection handler on rejected promise, using backup incumbent settings object stack assert_equals: expected "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/resources/promise-job-incumbent-incumbent.html" but got "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/ promise-job-incumbent.html"7 FAIL Rejection handler on rejected promise, using backup incumbent settings object stack assert_equals: expected "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/resources/promise-job-incumbent-incumbent.html" but got "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/resources/current/current.html" 8 8 PASS Fulfillment handler on pending-then-fulfilled promise 9 FAIL Fulfillment handler on pending-then-fulfilled promise, using backup incumbent settings object stack assert_equals: expected "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/resources/promise-job-incumbent-incumbent.html" but got "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/ promise-job-incumbent.html"9 FAIL Fulfillment handler on pending-then-fulfilled promise, using backup incumbent settings object stack assert_equals: expected "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/resources/promise-job-incumbent-incumbent.html" but got "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/resources/current/current.html" 10 10 PASS Rejection handler on pending-then-rejected promise 11 FAIL Rejection handler on pending-then-rejected promise, using backup incumbent settings object stack assert_equals: expected "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/resources/promise-job-incumbent-incumbent.html" but got "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/ promise-job-incumbent.html"11 FAIL Rejection handler on pending-then-rejected promise, using backup incumbent settings object stack assert_equals: expected "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/resources/promise-job-incumbent-incumbent.html" but got "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/resources/current/current.html" 12 12 PASS Thenable resolution 13 FAIL Thenable resolution, using backup incumbent settings object stack assert_equals: expected "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/resources/promise-job-incumbent-incumbent.html" but got "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/ promise-job-incumbent.html"13 FAIL Thenable resolution, using backup incumbent settings object stack assert_equals: expected "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/resources/promise-job-incumbent-incumbent.html" but got "http://localhost:8800/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/resources/current/current.html" 14 14 -
trunk/Source/JavaScriptCore/ChangeLog
r283389 r283410 1 2021-10-01 Yusuke Suzuki <ysuzuki@apple.com> 2 3 Disable new incumbent-window until it is fully implemented 4 https://bugs.webkit.org/show_bug.cgi?id=230261 5 <rdar://problem/83099726> 6 7 Reviewed by Chris Dumez and Geoffrey Garen. 8 9 * interpreter/CallFrame.cpp: 10 (JSC::CallFrame::globalObjectOfClosestCodeBlock): 11 * runtime/JSObject.cpp: 12 (JSC::JSObject::getOwnPropertyDescriptor): 13 * runtime/PropertySlot.h: 14 1 15 2021-10-01 Xan López <xan@igalia.com> 2 16 -
trunk/Source/JavaScriptCore/interpreter/CallFrame.cpp
r280256 r283410 248 248 JSGlobalObject* CallFrame::globalObjectOfClosestCodeBlock(VM& vm, CallFrame* callFrame) 249 249 { 250 // FIXME: We need to handle JSONP interpretation case in ProgramExecutable since it does not have vm.topCallFrame. 251 // rdar://83691438 250 252 JSGlobalObject* globalObject = nullptr; 251 253 StackVisitor::visit(callFrame, vm, [&](StackVisitor& visitor) { -
trunk/Source/JavaScriptCore/runtime/JSObject.cpp
r280505 r283410 3678 3678 descriptor.setAccessorDescriptor((slot.attributes() | PropertyAttribute::Accessor) & ~PropertyAttribute::CustomAccessor); 3679 3679 JSGlobalObject* slotBaseGlobalObject = slot.slotBase()->globalObject(vm); 3680 if (slot.attributes() & PropertyAttribute::DOMLegacyAccessor) 3681 slotBaseGlobalObject = globalObject; 3680 3682 if (slot.customGetter()) 3681 3683 descriptor.setGetter(createCustomGetterFunction(slotBaseGlobalObject, vm, propertyName, slot.customGetter(), slot.domAttribute())); -
trunk/Source/JavaScriptCore/runtime/PropertySlot.h
r280256 r283410 46 46 CustomAccessor = 1 << 5, 47 47 CustomValue = 1 << 6, 48 DOMLegacyAccessor = 1 << 7, // property is a DOM legacy accessor, which holds caller's global object when it is materialized. 48 49 CustomAccessorOrValue = CustomAccessor | CustomValue, 49 50 AccessorOrCustomAccessorOrValue = Accessor | CustomAccessor | CustomValue, -
trunk/Source/WebCore/ChangeLog
r283402 r283410 1 2021-10-01 Yusuke Suzuki <ysuzuki@apple.com> 2 3 Disable new incumbent-window until it is fully implemented 4 https://bugs.webkit.org/show_bug.cgi?id=230261 5 <rdar://problem/83099726> 6 7 Reviewed by Chris Dumez and Geoffrey Garen. 8 9 This patch disables new incumbent-window until it is fully implemented to avoid compatibility issue. 10 11 * bindings/js/JSDOMConvertCallbacks.h: 12 (WebCore::Converter<IDLCallbackFunction<T>>::convert): 13 (WebCore::Converter<IDLCallbackInterface<T>>::convert): 14 * bindings/js/JSDOMGlobalObject.cpp: 15 (WebCore::callerGlobalObject): 16 (WebCore::legacyActiveGlobalObjectForAccessor): 17 * bindings/js/JSDOMGlobalObject.h: 18 * bindings/js/JSDOMWindowBase.cpp: 19 (WebCore::incumbentDOMWindow): 20 (WebCore::legacyActiveDOMWindowForAccessor): 21 * bindings/js/JSDOMWindowBase.h: 22 * bindings/scripts/CodeGeneratorJS.pm: 23 (GetJSCAttributesForAttribute): 24 (GenerateCallWith): 25 * page/Location.idl: 26 1 27 2021-10-01 Chris Dumez <cdumez@apple.com> 2 28 -
trunk/Source/WebCore/bindings/js/JSDOMConvertCallbacks.h
r281520 r283410 46 46 } 47 47 48 JSDOMGlobalObject* incumbentGlobalObject = &globalObject; 49 if (auto* globalObject = JSC::CallFrame::globalObjectOfClosestCodeBlock(vm, vm.topCallFrame)) 50 incumbentGlobalObject = JSC::jsCast<JSDOMGlobalObject*>(globalObject); 51 52 return T::create(JSC::asObject(value), incumbentGlobalObject); 48 return T::create(JSC::asObject(value), &callerGlobalObject(globalObject, vm.topCallFrame)); 53 49 } 54 50 }; … … 84 80 } 85 81 86 JSDOMGlobalObject* incumbentGlobalObject = &globalObject; 87 if (auto* globalObject = JSC::CallFrame::globalObjectOfClosestCodeBlock(vm, vm.topCallFrame)) 88 incumbentGlobalObject = JSC::jsCast<JSDOMGlobalObject*>(globalObject); 89 90 return T::create(JSC::asObject(value), incumbentGlobalObject); 82 return T::create(JSC::asObject(value), &callerGlobalObject(globalObject, vm.topCallFrame)); 91 83 } 92 84 }; -
trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp
r282395 r283410 62 62 #include <JavaScriptCore/JSInternalPromise.h> 63 63 #include <JavaScriptCore/StructureInlines.h> 64 #include <JavaScriptCore/VMEntryScope.h> 64 65 #include <JavaScriptCore/VMTrapsInlines.h> 65 66 #include <JavaScriptCore/WasmStreamingCompiler.h> … … 582 583 } 583 584 585 static JSDOMGlobalObject& callerGlobalObject(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame* callFrame, bool skipFirstFrame, bool lookUpFromVMEntryScope) 586 { 587 VM& vm = lexicalGlobalObject.vm(); 588 if (callFrame) { 589 class GetCallerGlobalObjectFunctor { 590 public: 591 GetCallerGlobalObjectFunctor(bool skipFirstFrame) 592 : m_skipFirstFrame(skipFirstFrame) 593 { } 594 595 StackVisitor::Status operator()(StackVisitor& visitor) const 596 { 597 if (m_skipFirstFrame) { 598 if (!m_hasSkippedFirstFrame) { 599 m_hasSkippedFirstFrame = true; 600 return StackVisitor::Continue; 601 } 602 } 603 604 if (auto* codeBlock = visitor->codeBlock()) 605 m_globalObject = codeBlock->globalObject(); 606 else { 607 ASSERT(visitor->callee().rawPtr()); 608 // FIXME: Callee is not an object if the caller is Web Assembly. 609 // Figure out what to do here. We can probably get the global object 610 // from the top-most Wasm Instance. https://bugs.webkit.org/show_bug.cgi?id=165721 611 if (visitor->callee().isCell() && visitor->callee().asCell()->isObject()) 612 m_globalObject = jsCast<JSObject*>(visitor->callee().asCell())->globalObject(); 613 } 614 return StackVisitor::Done; 615 } 616 617 JSC::JSGlobalObject* globalObject() const { return m_globalObject; } 618 619 private: 620 bool m_skipFirstFrame { false }; 621 mutable bool m_hasSkippedFirstFrame { false }; 622 mutable JSC::JSGlobalObject* m_globalObject { nullptr }; 623 }; 624 625 GetCallerGlobalObjectFunctor iter(skipFirstFrame); 626 callFrame->iterate(vm, iter); 627 if (iter.globalObject()) 628 return *jsCast<JSDOMGlobalObject*>(iter.globalObject()); 629 } 630 631 // In the case of legacyActiveGlobalObjectForAccessor, it is possible that vm.topCallFrame is nullptr when the script is evaluated as JSONP. 632 // Since we put JSGlobalObject to VMEntryScope, we can retrieve the right globalObject from that. 633 // For callerGlobalObject, we do not check vm.entryScope to keep it the old behavior. 634 if (lookUpFromVMEntryScope) { 635 if (vm.entryScope) { 636 if (auto* result = vm.entryScope->globalObject()) 637 return *jsCast<JSDOMGlobalObject*>(result); 638 } 639 } 640 641 // If we cannot find JSGlobalObject in caller frames, we just return the current lexicalGlobalObject. 642 return *jsCast<JSDOMGlobalObject*>(&lexicalGlobalObject); 643 } 644 645 JSDOMGlobalObject& callerGlobalObject(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame* callFrame) 646 { 647 constexpr bool skipFirstFrame = true; 648 constexpr bool lookUpFromVMEntryScope = false; 649 return callerGlobalObject(lexicalGlobalObject, callFrame, skipFirstFrame, lookUpFromVMEntryScope); 650 } 651 652 JSDOMGlobalObject& legacyActiveGlobalObjectForAccessor(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame* callFrame) 653 { 654 constexpr bool skipFirstFrame = false; 655 constexpr bool lookUpFromVMEntryScope = true; 656 return callerGlobalObject(lexicalGlobalObject, callFrame, skipFirstFrame, lookUpFromVMEntryScope); 657 } 658 584 659 } // namespace WebCore -
trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.h
r280256 r283410 144 144 145 145 JSDOMGlobalObject* toJSDOMGlobalObject(ScriptExecutionContext&, DOMWrapperWorld&); 146 WEBCORE_EXPORT JSDOMGlobalObject& callerGlobalObject(JSC::JSGlobalObject&, JSC::CallFrame*); 147 JSDOMGlobalObject& legacyActiveGlobalObjectForAccessor(JSC::JSGlobalObject&, JSC::CallFrame*); 146 148 147 149 template<class JSClass> -
trunk/Source/WebCore/bindings/js/JSDOMWindowBase.cpp
r280256 r283410 285 285 DOMWindow& incumbentDOMWindow(JSGlobalObject& fallbackGlobalObject, CallFrame& callFrame) 286 286 { 287 if (auto* globalObject = CallFrame::globalObjectOfClosestCodeBlock(fallbackGlobalObject.vm(), &callFrame)) 288 return asJSDOMWindow(globalObject)->wrapped(); 289 return asJSDOMWindow(&fallbackGlobalObject)->wrapped(); 287 return asJSDOMWindow(&callerGlobalObject(fallbackGlobalObject, &callFrame))->wrapped(); 290 288 } 291 289 292 290 DOMWindow& incumbentDOMWindow(JSGlobalObject& fallbackGlobalObject) 293 291 { 294 VM& vm = fallbackGlobalObject.vm(); 295 if (auto* globalObject = CallFrame::globalObjectOfClosestCodeBlock(vm, vm.topCallFrame)) 296 return asJSDOMWindow(globalObject)->wrapped(); 297 return asJSDOMWindow(&fallbackGlobalObject)->wrapped(); 292 return asJSDOMWindow(&callerGlobalObject(fallbackGlobalObject, fallbackGlobalObject.vm().topCallFrame))->wrapped(); 298 293 } 299 294 … … 307 302 VM& vm = lexicalGlobalObject.vm(); 308 303 return asJSDOMWindow(vm.deprecatedVMEntryGlobalObject(&lexicalGlobalObject))->wrapped(); 304 } 305 306 DOMWindow& legacyActiveDOMWindowForAccessor(JSGlobalObject& fallbackGlobalObject, CallFrame& callFrame) 307 { 308 return asJSDOMWindow(&legacyActiveGlobalObjectForAccessor(fallbackGlobalObject, &callFrame))->wrapped(); 309 } 310 311 DOMWindow& legacyActiveDOMWindowForAccessor(JSGlobalObject& fallbackGlobalObject) 312 { 313 return asJSDOMWindow(&legacyActiveGlobalObjectForAccessor(fallbackGlobalObject, fallbackGlobalObject.vm().topCallFrame))->wrapped(); 309 314 } 310 315 -
trunk/Source/WebCore/bindings/js/JSDOMWindowBase.h
r280256 r283410 127 127 DOMWindow& firstDOMWindow(JSC::JSGlobalObject&); 128 128 129 DOMWindow& legacyActiveDOMWindowForAccessor(JSC::JSGlobalObject&, JSC::CallFrame&); 130 DOMWindow& legacyActiveDOMWindowForAccessor(JSC::JSGlobalObject&); 131 129 132 // FIXME: This should probably be removed in favor of one of the other DOMWindow accessors. It is intended 130 133 // to provide the document specfied as the 'responsible document' in the algorithm for document.open() -
trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
r283233 r283410 2051 2051 push(@specials, "JSC::PropertyAttribute::ReadOnly") if IsReadonly($attribute); 2052 2052 push(@specials, "JSC::PropertyAttribute::CustomAccessor") unless $isGlobalConstructor or IsJSBuiltin($interface, $attribute); 2053 push(@specials, "JSC::PropertyAttribute::DOMLegacyAccessor") if $attribute->extendedAttributes->{LegacyActiveWindowForAccessor}; 2053 2054 push(@specials, "JSC::PropertyAttribute::DOMAttribute") if IsAcceleratedDOMAttribute($interface, $attribute); 2054 2055 push(@specials, "JSC::PropertyAttribute::DOMJITAttribute") if $attribute->extendedAttributes->{DOMJIT}; … … 5980 5981 push(@callWithArgs, "incumbentDOMWindow(*$globalObject" . ($callFrameReference ? ", " . $callFrameReference : "") . ")"); 5981 5982 } 5983 if ($codeGenerator->ExtendedAttributeContains($callWith, "LegacyActiveWindowForAccessor")) { 5984 AddToImplIncludes("DOMWindow.h"); 5985 AddToImplIncludes("JSDOMWindowBase.h"); 5986 push(@callWithArgs, "legacyActiveDOMWindowForAccessor(*$globalObject" . ($callFrameReference ? ", " . $callFrameReference : "") . ")"); 5987 } 5982 5988 if ($codeGenerator->ExtendedAttributeContains($callWith, "FirstWindow")) { 5983 5989 AddToImplIncludes("DOMWindow.h"); -
trunk/Source/WebCore/page/Location.idl
r280826 r283410 44 44 Exposed=Window 45 45 ] interface Location { 46 [SetterCallWith= IncumbentWindow&FirstWindow, DoNotCheckSecurityOnSetter] stringifier attribute USVString href;46 [SetterCallWith=LegacyActiveWindowForAccessor&FirstWindow, DoNotCheckSecurityOnSetter] stringifier attribute USVString href; 47 47 48 48 // FIXME: We should use IncumbentWindow once we found why https://bugs.webkit.org/show_bug.cgi?id=228943 issue occured. … … 52 52 53 53 // URI decomposition attributes 54 [SetterCallWith= IncumbentWindow&FirstWindow] attribute USVString protocol;55 [SetterCallWith= IncumbentWindow&FirstWindow] attribute USVString host;56 [SetterCallWith= IncumbentWindow&FirstWindow] attribute USVString hostname;57 [SetterCallWith= IncumbentWindow&FirstWindow] attribute USVString port;58 [SetterCallWith= IncumbentWindow&FirstWindow] attribute USVString pathname;59 [SetterCallWith= IncumbentWindow&FirstWindow] attribute USVString search;60 [SetterCallWith= IncumbentWindow&FirstWindow] attribute USVString hash;54 [SetterCallWith=LegacyActiveWindowForAccessor&FirstWindow] attribute USVString protocol; 55 [SetterCallWith=LegacyActiveWindowForAccessor&FirstWindow] attribute USVString host; 56 [SetterCallWith=LegacyActiveWindowForAccessor&FirstWindow] attribute USVString hostname; 57 [SetterCallWith=LegacyActiveWindowForAccessor&FirstWindow] attribute USVString port; 58 [SetterCallWith=LegacyActiveWindowForAccessor&FirstWindow] attribute USVString pathname; 59 [SetterCallWith=LegacyActiveWindowForAccessor&FirstWindow] attribute USVString search; 60 [SetterCallWith=LegacyActiveWindowForAccessor&FirstWindow] attribute USVString hash; 61 61 62 62 readonly attribute USVString origin;
Note:
See TracChangeset
for help on using the changeset viewer.