WebKit Bugzilla
Attachment 372477 Details for
Bug 196956
: Web Inspector: use weak collections for holding event listeners
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
[Patch] WIP
196956.diff (text/plain), 121.65 KB, created by
Devin Rousso
on 2019-06-19 10:41:42 PDT
(
hide
)
Description:
[Patch] WIP
Filename:
MIME Type:
Creator:
Devin Rousso
Created:
2019-06-19 10:41:42 PDT
Size:
121.65 KB
patch
obsolete
>diff --git a/LayoutTests/http/tests/inspector/dom/disconnect-dom-tree-after-main-frame-navigation.html b/LayoutTests/http/tests/inspector/dom/disconnect-dom-tree-after-main-frame-navigation.html >index 6f5475e34aa..de6e2973577 100644 >--- a/LayoutTests/http/tests/inspector/dom/disconnect-dom-tree-after-main-frame-navigation.html >+++ b/LayoutTests/http/tests/inspector/dom/disconnect-dom-tree-after-main-frame-navigation.html >@@ -11,7 +11,7 @@ function test() > name: "CheckLazyInitializationOfDOMTree", > description: "Check that DOMTree instances are created lazily.", > test(resolve, reject) { >- let instances = WI.domManager.retainedObjectsWithPrototype(WI.DOMTree); >+ let instances = WI.domManager.activelyListeningObjectsWithPrototype(WI.DOMTree); > InspectorTest.expectThat(instances.size === 0, "There should not be a DOMTree listening to DOMTreeManager events initially."); > InspectorTest.log("DOMTree instance count: " + instances.size); > resolve(); >@@ -25,7 +25,7 @@ function test() > let mainFrame = WI.networkManager.mainFrame; > mainFrame.domTree; // Force creation of the root DOM tree. > >- let instances = WI.domManager.retainedObjectsWithPrototype(WI.DOMTree); >+ let instances = WI.domManager.activelyListeningObjectsWithPrototype(WI.DOMTree); > InspectorTest.expectThat(instances.size === 1, "There should be a one DOMTree listening to DOMTreeManager events after creation."); > InspectorTest.log("DOMTree instance count: " + instances.size); > >@@ -39,7 +39,7 @@ function test() > let childrenLevel3 = Array.from(childrenLevel2[0].childFrameCollection); > childrenLevel3[0].domTree; > >- instances = WI.domManager.retainedObjectsWithPrototype(WI.DOMTree); >+ instances = WI.domManager.activelyListeningObjectsWithPrototype(WI.DOMTree); > InspectorTest.expectThat(instances.size === 4, "There should be four DOMTrees listening to DOMTreeManager events after touching each Frame."); > InspectorTest.log("DOMTree instance count: " + instances.size); > >@@ -53,7 +53,7 @@ function test() > test(resolve, reject) { > WI.Frame.awaitEvent(WI.Frame.Event.MainResourceDidChange) > .then((event) => { >- let instances = WI.domManager.retainedObjectsWithPrototype(WI.DOMTree); >+ let instances = WI.domManager.activelyListeningObjectsWithPrototype(WI.DOMTree); > InspectorTest.expectThat(instances.size === 0, "There should not be any DOMTrees listening to DOMTreeManager events after a main frame navigation."); > InspectorTest.log("DOMTree instance count: " + instances.size); > }) >diff --git a/LayoutTests/inspector/unit-tests/linked-list-expected.txt b/LayoutTests/inspector/unit-tests/linked-list-expected.txt >deleted file mode 100644 >index 865e1007d05..00000000000 >--- a/LayoutTests/inspector/unit-tests/linked-list-expected.txt >+++ /dev/null >@@ -1,25 +0,0 @@ >-Testing all methods of LinkedList. >- >- >-== Running test suite: LinkedList >--- Running test case: Adding items >-0 >-[] >-2 >-["one","two"] >-3 >-["one","two","three"] >- >--- Running test case: Removing items >-3 >-["one","two","three"] >-2 >-["one","three"] >- >--- Running test case: Removing all items >-0 >-[] >- >--- Running test case: Iterating using forEach method >-["one","two","three"] >- >diff --git a/LayoutTests/inspector/unit-tests/linked-list.html b/LayoutTests/inspector/unit-tests/linked-list.html >deleted file mode 100644 >index c803257647a..00000000000 >--- a/LayoutTests/inspector/unit-tests/linked-list.html >+++ /dev/null >@@ -1,92 +0,0 @@ >-<!doctype html> >-<html> >-<head> >-<script src="../../http/tests/inspector/resources/inspector-test.js"></script> >-<script> >-function test() >-{ >- let suite = InspectorTest.createAsyncSuite("LinkedList"); >- >- suite.addTestCase({ >- name: "Adding items", >- test(resolve, reject) { >- let list = new LinkedList; >- >- InspectorTest.log(list.length); >- InspectorTest.log(list); >- >- list.push("one"); >- list.push("two"); >- InspectorTest.log(list.length); >- InspectorTest.log(list); >- >- list.push("three"); >- InspectorTest.log(list.length); >- InspectorTest.log(list); >- >- resolve(); >- } >- }); >- >- suite.addTestCase({ >- name: "Removing items", >- test(resolve, reject) { >- let list = new LinkedList; >- >- list.push("one"); >- let nodeTwo = list.push("two"); >- list.push("three"); >- InspectorTest.log(list.length); >- InspectorTest.log(list); >- >- list.remove(nodeTwo); >- InspectorTest.log(list.length); >- InspectorTest.log(list); >- >- resolve(); >- } >- }); >- >- suite.addTestCase({ >- name: "Removing all items", >- test(resolve, reject) { >- let list = new LinkedList; >- >- list.push("one"); >- list.push("two"); >- list.push("three"); >- list.clear(); >- InspectorTest.log(list.length); >- InspectorTest.log(list); >- >- resolve(); >- } >- }); >- >- suite.addTestCase({ >- name: "Iterating using forEach method", >- test(resolve, reject) { >- let list = new LinkedList; >- >- list.push("one"); >- list.push("two"); >- list.push("three"); >- >- let values = []; >- list.forEach(function(value) { >- values.push(value); >- }); >- InspectorTest.log(values); >- >- resolve(); >- } >- }); >- >- suite.runTestCasesAndFinish(); >-} >-</script> >-</head> >-<body onload="runTest()"> >- <p>Testing all methods of LinkedList.</p> >-</body> >-</html> >diff --git a/LayoutTests/inspector/unit-tests/list-multimap-expected.txt b/LayoutTests/inspector/unit-tests/list-multimap-expected.txt >deleted file mode 100644 >index 7bf5fed1842..00000000000 >--- a/LayoutTests/inspector/unit-tests/list-multimap-expected.txt >+++ /dev/null >@@ -1,56 +0,0 @@ >-Testing all methods of ListMultimap. >- >- >-== Running test suite: ListMultimap >--- Running test case: Instantiating Multimap >-0 >-[] >- >--- Running test case: Adding unique keys and values >-2 >-[["zero","one"],["two","three"]] >- >--- Running test case: Adding repeating keys and unique values >-2 >-[["zero","one"],["zero","two"]] >- >--- Running test case: Adding unique keys and repeating values >-3 >-[["zero","one"],["two","one"],["three","one"]] >- >--- Running test case: Adding repeating keys and values >-3 >-[["zero","one"],["two","one"],["zero","three"]] >- >--- Running test case: Deleting existing keys and values >-PASS: The key and the value were successfully deleted. >-1 >-[[2,3]] >-PASS: The key and the value were successfully deleted. >-0 >-[] >- >--- Running test case: Deleting non-existing keys and non-existing values >-PASS: Nothing was removed. >-PASS: Nothing was removed. >-PASS: Nothing was removed. >-PASS: Nothing was removed. >-PASS: Nothing was removed. >-3 >-[[0,1],[2,3],[4,4]] >- >--- Running test case: Deleting values for given key >-PASS: Nothing was removed. >-3 >-[["opossum","badger"],["opossum","raccoon"],["raccoon","opossum"]] >-PASS: Values were removed. >-1 >-[["raccoon","opossum"]] >- >--- Running test case: Deleting all keys and values >-0 >-[] >- >--- Running test case: Iterating using forEach method >-[["Platypus","Sugar glider"],["Quoll","Wallaby"]] >- >diff --git a/LayoutTests/inspector/unit-tests/list-multimap.html b/LayoutTests/inspector/unit-tests/list-multimap.html >deleted file mode 100644 >index 465542228c4..00000000000 >--- a/LayoutTests/inspector/unit-tests/list-multimap.html >+++ /dev/null >@@ -1,191 +0,0 @@ >-<!doctype html> >-<html> >-<head> >-<script src="../../http/tests/inspector/resources/inspector-test.js"></script> >-<script> >-function test() >-{ >- let suite = InspectorTest.createAsyncSuite("ListMultimap"); >- >- suite.addTestCase({ >- name: "Instantiating Multimap", >- test(resolve, reject) { >- let multimap = new ListMultimap; >- >- InspectorTest.log(multimap.size); >- InspectorTest.log(multimap); >- >- resolve(); >- } >- }); >- >- suite.addTestCase({ >- name: "Adding unique keys and values", >- test(resolve, reject) { >- let multimap = new ListMultimap; >- >- multimap.add("zero", "one"); >- multimap.add("two", "three"); >- >- InspectorTest.log(multimap.size); >- InspectorTest.log(multimap); >- >- resolve(); >- } >- }); >- >- suite.addTestCase({ >- name: "Adding repeating keys and unique values", >- test(resolve, reject) { >- let multimap = new ListMultimap; >- >- multimap.add("zero", "one"); >- multimap.add("zero", "two"); >- >- InspectorTest.log(multimap.size); >- InspectorTest.log(multimap); >- >- resolve(); >- } >- }); >- >- suite.addTestCase({ >- name: "Adding unique keys and repeating values", >- test(resolve, reject) { >- let multimap = new ListMultimap; >- >- multimap.add("zero", "one"); >- multimap.add("two", "one"); >- multimap.add("three", "one"); >- >- InspectorTest.log(multimap.size); >- InspectorTest.log(multimap); >- >- resolve(); >- } >- }); >- >- suite.addTestCase({ >- name: "Adding repeating keys and values", >- test(resolve, reject) { >- let multimap = new ListMultimap; >- >- multimap.add("zero", "one"); >- multimap.add("two", "one"); >- multimap.add("zero", "one"); >- multimap.add("zero", "three"); >- >- InspectorTest.log(multimap.size); >- InspectorTest.log(multimap); >- >- resolve(); >- } >- }); >- >- suite.addTestCase({ >- name: "Deleting existing keys and values", >- test(resolve, reject) { >- let multimap = new ListMultimap; >- >- multimap.add(0, 1); >- multimap.add(2, 3); >- multimap.add(2, 3); >- >- InspectorTest.expectThat(multimap.delete(0, 1), "The key and the value were successfully deleted."); >- >- InspectorTest.log(multimap.size); >- InspectorTest.log(multimap); >- >- InspectorTest.expectThat(multimap.delete(2, 3), "The key and the value were successfully deleted."); >- >- InspectorTest.log(multimap.size); >- InspectorTest.log(multimap); >- >- resolve(); >- } >- }); >- >- suite.addTestCase({ >- name: "Deleting non-existing keys and non-existing values", >- test(resolve, reject) { >- let multimap = new ListMultimap; >- >- multimap.add(0, 1); >- multimap.add(2, 3); >- multimap.add(4, 4); >- >- InspectorTest.expectThat(!multimap.delete(0, 3), "Nothing was removed."); >- InspectorTest.expectThat(!multimap.delete(2, 1), "Nothing was removed."); >- InspectorTest.expectThat(!multimap.delete(3, 0), "Nothing was removed."); >- InspectorTest.expectThat(!multimap.delete(4, 3), "Nothing was removed."); >- InspectorTest.expectThat(!multimap.delete(0, 4), "Nothing was removed."); >- >- InspectorTest.log(multimap.size); >- InspectorTest.log(multimap); >- >- resolve(); >- } >- }); >- >- suite.addTestCase({ >- name: "Deleting values for given key", >- test(resolve, reject) { >- let multimap = new ListMultimap; >- >- multimap.add("opossum", "badger"); >- multimap.add("opossum", "raccoon"); >- multimap.add("raccoon", "opossum"); >- >- InspectorTest.expectThat(!multimap.deleteAll("badger"), "Nothing was removed."); >- >- InspectorTest.log(multimap.size); >- InspectorTest.log(multimap); >- >- InspectorTest.expectThat(multimap.deleteAll("opossum"), "Values were removed."); >- >- InspectorTest.log(multimap.size); >- InspectorTest.log(multimap); >- >- resolve(); >- } >- }); >- >- suite.addTestCase({ >- name: "Deleting all keys and values", >- test(resolve, reject) { >- let multimap = new ListMultimap; >- multimap.add("badger", "raccoon"); >- multimap.clear(); >- >- InspectorTest.log(multimap.size); >- InspectorTest.log(multimap); >- >- resolve(); >- } >- }); >- >- suite.addTestCase({ >- name: "Iterating using forEach method", >- test(resolve, reject) { >- let multimap = new ListMultimap; >- multimap.add("Platypus", "Sugar glider"); >- multimap.add("Quoll", "Wallaby"); >- >- let list = []; >- multimap.forEach(function(pair) { >- list.push(pair); >- }); >- InspectorTest.log(multimap); >- >- resolve(); >- } >- }); >- >- suite.runTestCasesAndFinish(); >-} >-</script> >-</head> >-<body onload="runTest()"> >- <p>Testing all methods of ListMultimap.</p> >-</body> >-</html> >diff --git a/LayoutTests/platform/gtk/TestExpectations b/LayoutTests/platform/gtk/TestExpectations >index ee995068d97..0e9b702bd75 100644 >--- a/LayoutTests/platform/gtk/TestExpectations >+++ b/LayoutTests/platform/gtk/TestExpectations >@@ -2334,8 +2334,6 @@ webkit.org/b/149916 inspector/unit-tests/array-utilities.html [ Pass Slow ] > webkit.org/b/149916 inspector/unit-tests/event-listener.html [ Pass Slow ] > webkit.org/b/149916 inspector/unit-tests/event-listener-set.html [ Pass Slow ] > webkit.org/b/149916 inspector/unit-tests/inspector-test-dispatch-event-to-frontend.html [ Pass Slow ] >-webkit.org/b/149916 inspector/unit-tests/linked-list.html [ Pass Slow ] >-webkit.org/b/149916 inspector/unit-tests/list-multimap.html [ Pass Slow ] > webkit.org/b/149916 inspector/unit-tests/object.html [ Pass Slow ] > > # Slow is not enough for this one. >diff --git a/Source/JavaScriptCore/CMakeLists.txt b/Source/JavaScriptCore/CMakeLists.txt >index d8f36400fd8..1121a993267 100644 >--- a/Source/JavaScriptCore/CMakeLists.txt >+++ b/Source/JavaScriptCore/CMakeLists.txt >@@ -638,6 +638,7 @@ set(JavaScriptCore_PRIVATE_FRAMEWORK_HEADERS > inspector/InspectorFrontendRouter.h > inspector/InspectorProtocolTypes.h > inspector/InspectorTarget.h >+ inspector/InspectorUtilities.h > inspector/PerGlobalObjectWrapperWorld.h > inspector/ScriptArguments.h > inspector/ScriptBreakpoint.h >diff --git a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj >index 6750a65b6e3..f342f48b81f 100644 >--- a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj >+++ b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj >@@ -1273,6 +1273,7 @@ > 9064337DD4B0402BAF34A592 /* JSScriptFetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BA93C9590484C5BAD9316EA /* JSScriptFetcher.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 91278D5521DEB82600B57184 /* InspectorAuditAgent.h in Headers */ = {isa = PBXBuildFile; fileRef = 91278D5321DEB82500B57184 /* InspectorAuditAgent.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 91278D5821DEDA9600B57184 /* JSGlobalObjectAuditAgent.h in Headers */ = {isa = PBXBuildFile; fileRef = 91278D5621DEDA9400B57184 /* JSGlobalObjectAuditAgent.h */; }; >+ 91E82B73226588FA0033E9E0 /* InspectorUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 91E82B71226588F90033E9E0 /* InspectorUtilities.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 93052C350FB792190048FDC3 /* ParserArena.h in Headers */ = {isa = PBXBuildFile; fileRef = 93052C330FB792190048FDC3 /* ParserArena.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 932F5BD30822A1C700736975 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6560A4CF04B3B3E7008AE952 /* CoreFoundation.framework */; }; > 932F5BD60822A1C700736975 /* libobjc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 51F0EC0705C86C9A00E6DF1B /* libobjc.dylib */; }; >@@ -4038,6 +4039,8 @@ > 91278D5321DEB82500B57184 /* InspectorAuditAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorAuditAgent.h; sourceTree = "<group>"; }; > 91278D5621DEDA9400B57184 /* JSGlobalObjectAuditAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSGlobalObjectAuditAgent.h; sourceTree = "<group>"; }; > 91278D5721DEDA9500B57184 /* JSGlobalObjectAuditAgent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSGlobalObjectAuditAgent.cpp; sourceTree = "<group>"; }; >+ 91E82B70226588F90033E9E0 /* InspectorUtilities.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorUtilities.cpp; sourceTree = "<group>"; }; >+ 91E82B71226588F90033E9E0 /* InspectorUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorUtilities.h; sourceTree = "<group>"; }; > 93052C320FB792190048FDC3 /* ParserArena.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ParserArena.cpp; sourceTree = "<group>"; }; > 93052C330FB792190048FDC3 /* ParserArena.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParserArena.h; sourceTree = "<group>"; }; > 930DAD030FB1EB1A0082D205 /* NodeConstructors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NodeConstructors.h; sourceTree = "<group>"; }; >@@ -8236,6 +8239,8 @@ > 99F1A7001B98FBEC00463B26 /* InspectorFrontendRouter.h */, > A55D93AB18514F7900400DED /* InspectorProtocolTypes.h */, > A555FF382159D2D600FCD826 /* InspectorTarget.h */, >+ 91E82B70226588F90033E9E0 /* InspectorUtilities.cpp */, >+ 91E82B71226588F90033E9E0 /* InspectorUtilities.h */, > A503FA13188E0FAF00110F14 /* JavaScriptCallFrame.cpp */, > A503FA14188E0FAF00110F14 /* JavaScriptCallFrame.h */, > A5C3A1A318C0490200C9593A /* JSGlobalObjectConsoleClient.cpp */, >@@ -9321,6 +9326,7 @@ > A55165D31BDF0B9E003B75C1 /* InspectorScriptProfilerAgent.h in Headers */, > A555FF3B2159D2F500FCD826 /* InspectorTarget.h in Headers */, > A52C95FF2159D432007D8AC0 /* InspectorTargetAgent.h in Headers */, >+ 91E82B73226588FA0033E9E0 /* InspectorUtilities.h in Headers */, > 0F49E9AA20AB4D00001CA0AA /* InstanceOfAccessCase.h in Headers */, > 0FB399BF20AF6B3F0017E213 /* InstanceOfStatus.h in Headers */, > 0FB399C020AF6B430017E213 /* InstanceOfVariant.h in Headers */, >diff --git a/Source/JavaScriptCore/Sources.txt b/Source/JavaScriptCore/Sources.txt >index b8893ba8fcb..755e0d7a4e0 100644 >--- a/Source/JavaScriptCore/Sources.txt >+++ b/Source/JavaScriptCore/Sources.txt >@@ -563,6 +563,7 @@ inspector/InjectedScriptModule.cpp > inspector/InspectorAgentRegistry.cpp > inspector/InspectorFrontendRouter.cpp > inspector/InspectorBackendDispatcher.cpp >+inspector/InspectorUtilities.cpp > inspector/JSGlobalObjectConsoleClient.cpp > inspector/JSGlobalObjectInspectorController.cpp > inspector/JSGlobalObjectScriptDebugServer.cpp >diff --git a/Source/JavaScriptCore/inspector/InspectorUtilities.cpp b/Source/JavaScriptCore/inspector/InspectorUtilities.cpp >new file mode 100644 >index 00000000000..5b062787326 >--- /dev/null >+++ b/Source/JavaScriptCore/inspector/InspectorUtilities.cpp >@@ -0,0 +1,117 @@ >+/* >+ * Copyright (C) 2019 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#include "config.h" >+#include "InspectorUtilities.h" >+ >+#include "JSWeakMap.h" >+#include "JSWeakSet.h" >+ >+namespace Inspector { >+ >+namespace InspectorUtilities { >+ >+using namespace JSC; >+ >+Optional<unsigned> weakMapSize(JSC::ExecState& exec) >+{ >+ if (exec.argumentCount() < 1) >+ return WTF::nullopt; >+ >+ VM& vm = exec.vm(); >+ auto* weakMap = jsDynamicCast<JSWeakMap*>(vm, exec.uncheckedArgument(0)); >+ if (!weakMap) >+ return WTF::nullopt; >+ >+ return weakMap->size(); >+} >+ >+Optional<JSC::JSValue> weakMapEntries(JSC::ExecState& exec, unsigned numberToFetch, const Function<JSC::JSValue(JSC::JSValue, JSC::JSValue)>& mapFunction) >+{ >+ VM& vm = exec.vm(); >+ auto scope = DECLARE_THROW_SCOPE(vm); >+ >+ auto* weakMap = jsDynamicCast<JSWeakMap*>(vm, exec.uncheckedArgument(0)); >+ if (!weakMap) >+ return WTF::nullopt; >+ >+ auto* array = constructEmptyArray(&exec, nullptr); >+ RETURN_IF_EXCEPTION(scope, WTF::nullopt); >+ >+ MarkedArgumentBuffer buffer; >+ weakMap->takeSnapshot(buffer, numberToFetch); >+ ASSERT(!buffer.hasOverflowed()); >+ >+ for (unsigned index = 0; index < buffer.size(); index += 2) { >+ auto key = buffer.at(index); >+ auto value = buffer.at(index + 1); >+ array->putDirectIndex(&exec, index / 2, mapFunction(key, value)); >+ RETURN_IF_EXCEPTION(scope, WTF::nullopt); >+ } >+ >+ return JSValue(array); >+} >+ >+Optional<unsigned> weakSetSize(JSC::ExecState& exec) >+{ >+ if (exec.argumentCount() < 1) >+ return WTF::nullopt; >+ >+ VM& vm = exec.vm(); >+ auto* weakSet = jsDynamicCast<JSWeakSet*>(vm, exec.uncheckedArgument(0)); >+ if (!weakSet) >+ return WTF::nullopt; >+ >+ return weakSet->size(); >+} >+ >+Optional<JSC::JSValue> weakSetEntries(JSC::ExecState& exec, unsigned numberToFetch, const Function<JSC::JSValue(JSC::JSValue)>& mapFunction) >+{ >+ VM& vm = exec.vm(); >+ auto scope = DECLARE_THROW_SCOPE(vm); >+ >+ auto* weakSet = jsDynamicCast<JSWeakSet*>(vm, exec.uncheckedArgument(0)); >+ if (!weakSet) >+ return WTF::nullopt; >+ >+ auto* array = constructEmptyArray(&exec, nullptr); >+ RETURN_IF_EXCEPTION(scope, WTF::nullopt); >+ >+ MarkedArgumentBuffer buffer; >+ weakSet->takeSnapshot(buffer, numberToFetch); >+ ASSERT(!buffer.hasOverflowed()); >+ >+ for (unsigned index = 0; index < buffer.size(); ++index) { >+ auto value = buffer.at(index); >+ array->putDirectIndex(&exec, index, mapFunction(value)); >+ RETURN_IF_EXCEPTION(scope, WTF::nullopt); >+ } >+ >+ return JSValue(array); >+} >+ >+} // namespace InspectorUtilities >+ >+} // namespace Inspector >diff --git a/Source/JavaScriptCore/inspector/InspectorUtilities.h b/Source/JavaScriptCore/inspector/InspectorUtilities.h >new file mode 100644 >index 00000000000..4e1b36b8a42 >--- /dev/null >+++ b/Source/JavaScriptCore/inspector/InspectorUtilities.h >@@ -0,0 +1,43 @@ >+/* >+ * Copyright (C) 2019 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#pragma once >+ >+#include "JSCInlines.h" >+#include <wtf/Function.h> >+#include <wtf/Optional.h> >+ >+namespace Inspector { >+ >+namespace InspectorUtilities { >+ >+JS_EXPORT_PRIVATE Optional<unsigned> weakMapSize(JSC::ExecState&); >+JS_EXPORT_PRIVATE Optional<JSC::JSValue> weakMapEntries(JSC::ExecState&, unsigned numberToFetch, const Function<JSC::JSValue(JSC::JSValue, JSC::JSValue)>& mapFunction); >+JS_EXPORT_PRIVATE Optional<unsigned> weakSetSize(JSC::ExecState&); >+JS_EXPORT_PRIVATE Optional<JSC::JSValue> weakSetEntries(JSC::ExecState&, unsigned numberToFetch, const Function<JSC::JSValue(JSC::JSValue)>& mapFunction); >+ >+} // namespace InspectorUtilities >+ >+} // namespace Inspector >diff --git a/Source/JavaScriptCore/inspector/JSInjectedScriptHost.cpp b/Source/JavaScriptCore/inspector/JSInjectedScriptHost.cpp >index d9725c0d8f4..4655ed3cdf4 100644 >--- a/Source/JavaScriptCore/inspector/JSInjectedScriptHost.cpp >+++ b/Source/JavaScriptCore/inspector/JSInjectedScriptHost.cpp >@@ -36,6 +36,7 @@ > #include "FunctionPrototype.h" > #include "HeapIterationScope.h" > #include "InjectedScriptHost.h" >+#include "InspectorUtilities.h" > #include "IterationKind.h" > #include "IteratorOperations.h" > #include "IteratorPrototype.h" >@@ -444,30 +445,14 @@ JSValue JSInjectedScriptHost::proxyTargetValue(ExecState *exec) > > JSValue JSInjectedScriptHost::weakMapSize(ExecState* exec) > { >- if (exec->argumentCount() < 1) >+ auto size = InspectorUtilities::weakMapSize(*exec); >+ if (!size) > return jsUndefined(); >- >- VM& vm = exec->vm(); >- JSValue value = exec->uncheckedArgument(0); >- JSWeakMap* weakMap = jsDynamicCast<JSWeakMap*>(vm, value); >- if (!weakMap) >- return jsUndefined(); >- >- return jsNumber(weakMap->size()); >+ return jsNumber(size.value()); > } > > JSValue JSInjectedScriptHost::weakMapEntries(ExecState* exec) > { >- if (exec->argumentCount() < 1) >- return jsUndefined(); >- >- VM& vm = exec->vm(); >- auto scope = DECLARE_THROW_SCOPE(vm); >- JSValue value = exec->uncheckedArgument(0); >- JSWeakMap* weakMap = jsDynamicCast<JSWeakMap*>(vm, value); >- if (!weakMap) >- return jsUndefined(); >- > unsigned numberToFetch = 100; > > JSValue numberToFetchArg = exec->argument(1); >@@ -475,49 +460,27 @@ JSValue JSInjectedScriptHost::weakMapEntries(ExecState* exec) > if (fetchDouble >= 0) > numberToFetch = static_cast<unsigned>(fetchDouble); > >- JSArray* array = constructEmptyArray(exec, nullptr); >- RETURN_IF_EXCEPTION(scope, JSValue()); >- >- MarkedArgumentBuffer buffer; >- weakMap->takeSnapshot(buffer, numberToFetch); >- >- for (unsigned index = 0; index < buffer.size(); index += 2) { >- JSObject* entry = constructEmptyObject(exec); >- entry->putDirect(vm, Identifier::fromString(exec, "key"), buffer.at(index)); >- entry->putDirect(vm, Identifier::fromString(exec, "value"), buffer.at(index + 1)); >- array->putDirectIndex(exec, index / 2, entry); >- RETURN_IF_EXCEPTION(scope, JSValue()); >- } >- >- return array; >+ auto entries = InspectorUtilities::weakMapEntries(*exec, numberToFetch, [&] (JSValue key, JSValue value) { >+ auto* entry = constructEmptyObject(exec); >+ entry->putDirect(exec->vm(), Identifier::fromString(exec, "key"), key); >+ entry->putDirect(exec->vm(), Identifier::fromString(exec, "value"), value); >+ return entry; >+ }); >+ if (!entries) >+ return jsUndefined(); >+ return entries.value(); > } > > JSValue JSInjectedScriptHost::weakSetSize(ExecState* exec) > { >- if (exec->argumentCount() < 1) >+ auto size = InspectorUtilities::weakSetSize(*exec); >+ if (!size) > return jsUndefined(); >- >- VM& vm = exec->vm(); >- JSValue value = exec->uncheckedArgument(0); >- JSWeakSet* weakSet = jsDynamicCast<JSWeakSet*>(vm, value); >- if (!weakSet) >- return jsUndefined(); >- >- return jsNumber(weakSet->size()); >+ return jsNumber(size.value()); > } > > JSValue JSInjectedScriptHost::weakSetEntries(ExecState* exec) > { >- if (exec->argumentCount() < 1) >- return jsUndefined(); >- >- VM& vm = exec->vm(); >- auto scope = DECLARE_THROW_SCOPE(vm); >- JSValue value = exec->uncheckedArgument(0); >- JSWeakSet* weakSet = jsDynamicCast<JSWeakSet*>(vm, value); >- if (!weakSet) >- return jsUndefined(); >- > unsigned numberToFetch = 100; > > JSValue numberToFetchArg = exec->argument(1); >@@ -525,20 +488,14 @@ JSValue JSInjectedScriptHost::weakSetEntries(ExecState* exec) > if (fetchDouble >= 0) > numberToFetch = static_cast<unsigned>(fetchDouble); > >- JSArray* array = constructEmptyArray(exec, nullptr); >- RETURN_IF_EXCEPTION(scope, JSValue()); >- >- MarkedArgumentBuffer buffer; >- weakSet->takeSnapshot(buffer, numberToFetch); >- >- for (unsigned index = 0; index < buffer.size(); ++index) { >- JSObject* entry = constructEmptyObject(exec); >- entry->putDirect(vm, Identifier::fromString(exec, "value"), buffer.at(index)); >- array->putDirectIndex(exec, index, entry); >- RETURN_IF_EXCEPTION(scope, JSValue()); >- } >- >- return array; >+ auto entries = InspectorUtilities::weakSetEntries(*exec, numberToFetch, [&] (JSValue value) { >+ auto* entry = constructEmptyObject(exec); >+ entry->putDirect(exec->vm(), Identifier::fromString(exec, "value"), value); >+ return entry; >+ }); >+ if (!entries) >+ return jsUndefined(); >+ return entries.value(); > } > > static JSObject* cloneArrayIteratorObject(ExecState* exec, VM& vm, JSObject* iteratorObject, JSGlobalObject* globalObject, JSValue nextIndex, JSValue iteratedObject) >diff --git a/Source/WebCore/inspector/InspectorFrontendHost.cpp b/Source/WebCore/inspector/InspectorFrontendHost.cpp >index 71ca44bffd4..b6068e04781 100644 >--- a/Source/WebCore/inspector/InspectorFrontendHost.cpp >+++ b/Source/WebCore/inspector/InspectorFrontendHost.cpp >@@ -55,6 +55,7 @@ > #include "Pasteboard.h" > #include "ScriptState.h" > #include "UserGestureIndicator.h" >+#include <JavaScriptCore/InspectorUtilities.h> > #include <JavaScriptCore/ScriptFunctionCall.h> > #include <pal/system/Sound.h> > #include <wtf/StdLibExtras.h> >@@ -464,6 +465,45 @@ bool InspectorFrontendHost::isBeingInspected() > return inspectorController.hasLocalFrontend() || inspectorController.hasRemoteFrontend(); > } > >+ExceptionOr<unsigned> InspectorFrontendHost::weakMapSize(JSC::ExecState& exec) >+{ >+ auto size = InspectorUtilities::weakMapSize(exec); >+ if (!size) >+ return Exception { TypeError, "Argument 1 ('weakMap') to InspectorFrontendHost.weakMapSize must be an instance of WeakMap"_s }; >+ return size.value(); >+} >+ >+ExceptionOr<JSC::JSValue> InspectorFrontendHost::weakMapEntries(JSC::ExecState& exec) >+{ >+ auto entries = InspectorUtilities::weakMapEntries(exec, 0, [&] (JSC::JSValue key, JSC::JSValue value) { >+ auto* array = constructEmptyArray(&exec, nullptr); >+ array->putDirectIndex(&exec, array->length(), key); >+ array->putDirectIndex(&exec, array->length(), value); >+ return array; >+ }); >+ if (!entries) >+ return Exception { TypeError, "Argument 1 ('weakMap') to InspectorFrontendHost.weakMapEntries must be an instance of WeakMap"_s }; >+ return WTFMove(entries.value()); >+} >+ >+ExceptionOr<unsigned> InspectorFrontendHost::weakSetSize(JSC::ExecState& exec) >+{ >+ auto size = InspectorUtilities::weakSetSize(exec); >+ if (!size) >+ return Exception { TypeError, "Argument 1 ('weakSet') to InspectorFrontendHost.weakSetSize must be an instance of WeakSet"_s }; >+ return size.value(); >+} >+ >+ExceptionOr<JSC::JSValue> InspectorFrontendHost::weakSetEntries(JSC::ExecState& exec) >+{ >+ auto entries = InspectorUtilities::weakSetEntries(exec, 0, [&] (JSC::JSValue value) { >+ return value; >+ }); >+ if (!entries) >+ return Exception { TypeError, "Argument 1 ('weakSet') to InspectorFrontendHost.weakSetEntries must be an instance of WeakSet"_s }; >+ return WTFMove(entries.value()); >+} >+ > bool InspectorFrontendHost::supportsShowCertificate() const > { > #if PLATFORM(COCOA) >diff --git a/Source/WebCore/inspector/InspectorFrontendHost.h b/Source/WebCore/inspector/InspectorFrontendHost.h >index 3017cb76c09..f992b81bdd0 100644 >--- a/Source/WebCore/inspector/InspectorFrontendHost.h >+++ b/Source/WebCore/inspector/InspectorFrontendHost.h >@@ -30,6 +30,8 @@ > > #include "ContextMenu.h" > #include "ContextMenuProvider.h" >+#include "ExceptionOr.h" >+#include <JavaScriptCore/JSCInlines.h> > #include <wtf/RefCounted.h> > #include <wtf/Vector.h> > #include <wtf/text/WTFString.h> >@@ -114,6 +116,11 @@ public: > void inspectInspector(); > bool isBeingInspected(); > >+ ExceptionOr<unsigned> weakMapSize(JSC::ExecState&); >+ ExceptionOr<JSC::JSValue> weakMapEntries(JSC::ExecState&); >+ ExceptionOr<unsigned> weakSetSize(JSC::ExecState&); >+ ExceptionOr<JSC::JSValue> weakSetEntries(JSC::ExecState&); >+ > private: > #if ENABLE(CONTEXT_MENUS) > friend class FrontendMenuProvider; >diff --git a/Source/WebCore/inspector/InspectorFrontendHost.idl b/Source/WebCore/inspector/InspectorFrontendHost.idl >index 023a39cbc8f..0b9249c4f45 100644 >--- a/Source/WebCore/inspector/InspectorFrontendHost.idl >+++ b/Source/WebCore/inspector/InspectorFrontendHost.idl >@@ -85,6 +85,11 @@ > void beep(); > void inspectInspector(); > boolean isBeingInspected(); >+ >+ [MayThrowException, CallWith=ExecState] unsigned long weakMapSize(/* WeakMap */); >+ [MayThrowException, CallWith=ExecState] any weakMapEntries(/* WeakMap */); >+ [MayThrowException, CallWith=ExecState] unsigned long weakSetSize(/* WeakSet */); >+ [MayThrowException, CallWith=ExecState] any weakSetEntries(/* WeakSet */); > }; > > dictionary ContextMenuItem { >diff --git a/Source/WebInspectorUI/.eslintrc b/Source/WebInspectorUI/.eslintrc >index fc6d0eaa251..52e710480e6 100644 >--- a/Source/WebInspectorUI/.eslintrc >+++ b/Source/WebInspectorUI/.eslintrc >@@ -74,8 +74,6 @@ > "InspectorFrontendHost": true, > "InspectorProtocol": true, > "InspectorTest": true, >- "LinkedList": true, >- "ListMultimap": true, > "Multimap": true, > "ProtocolTest": true, > "ProtocolTestHarness": true, >diff --git a/Source/WebInspectorUI/UserInterface/Base/LinkedList.js b/Source/WebInspectorUI/UserInterface/Base/LinkedList.js >deleted file mode 100644 >index f9978af4212..00000000000 >--- a/Source/WebInspectorUI/UserInterface/Base/LinkedList.js >+++ /dev/null >@@ -1,112 +0,0 @@ >-/* >- * Copyright (C) 2016 Apple Inc. All rights reserved. >- * >- * Redistribution and use in source and binary forms, with or without >- * modification, are permitted provided that the following conditions >- * are met: >- * 1. Redistributions of source code must retain the above copyright >- * notice, this list of conditions and the following disclaimer. >- * 2. Redistributions in binary form must reproduce the above copyright >- * notice, this list of conditions and the following disclaimer in the >- * documentation and/or other materials provided with the distribution. >- * >- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >- * THE POSSIBILITY OF SUCH DAMAGE. >- */ >- >-class LinkedList >-{ >- constructor() >- { >- this.head = new LinkedListNode; >- this.head.next = this.head.prev = this.head; >- this.length = 0; >- } >- >- clear() >- { >- this.head.next = this.head.prev = this.head; >- this.length = 0; >- } >- >- get last() >- { >- return this.head.prev; >- } >- >- push(item) >- { >- let newNode = new LinkedListNode(item); >- let last = this.last; >- let head = this.head; >- >- last.next = newNode; >- newNode.next = head; >- head.prev = newNode; >- newNode.prev = last; >- >- this.length++; >- >- return newNode; >- } >- >- remove(node) >- { >- if (!node) >- return false; >- >- node.prev.next = node.next; >- node.next.prev = node.prev; >- >- this.length--; >- return true; >- } >- >- forEach(callback) >- { >- let node = this.head; >- for (let i = 0, length = this.length; i < length; i++) { >- node = node.next; >- let returnValue = callback(node.value, i); >- if (returnValue === false) >- return; >- } >- } >- >- toArray() >- { >- let node = this.head; >- let i = this.length; >- let result = new Array(i); >- while (i--) { >- node = node.prev; >- result[i] = node.value; >- } >- return result; >- } >- >- toJSON() >- { >- return this.toArray(); >- } >-} >- >- >-class LinkedListNode >-{ >- constructor(value) >- { >- this.value = value; >- this.prev = null; >- this.next = null; >- } >-} >diff --git a/Source/WebInspectorUI/UserInterface/Base/ListMultimap.js b/Source/WebInspectorUI/UserInterface/Base/ListMultimap.js >deleted file mode 100644 >index a415fb68f64..00000000000 >--- a/Source/WebInspectorUI/UserInterface/Base/ListMultimap.js >+++ /dev/null >@@ -1,117 +0,0 @@ >-/* >- * Copyright (C) 2016 Apple Inc. All rights reserved. >- * >- * Redistribution and use in source and binary forms, with or without >- * modification, are permitted provided that the following conditions >- * are met: >- * 1. Redistributions of source code must retain the above copyright >- * notice, this list of conditions and the following disclaimer. >- * 2. Redistributions in binary form must reproduce the above copyright >- * notice, this list of conditions and the following disclaimer in the >- * documentation and/or other materials provided with the distribution. >- * >- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >- * THE POSSIBILITY OF SUCH DAMAGE. >- */ >- >-class ListMultimap >-{ >- constructor() >- { >- this._insertionOrderedEntries = new LinkedList; >- this._keyMap = new Map; >- } >- >- get size() >- { >- return this._insertionOrderedEntries.length; >- } >- >- add(key, value) >- { >- let nodeMap = this._keyMap.get(key); >- if (!nodeMap) { >- nodeMap = new Map; >- this._keyMap.set(key, nodeMap); >- } >- >- let node = nodeMap.get(value); >- if (!node) { >- node = this._insertionOrderedEntries.push([key, value]); >- nodeMap.set(value, node); >- } >- >- return this; >- } >- >- delete(key, value) >- { >- let nodeMap = this._keyMap.get(key); >- if (!nodeMap) >- return false; >- >- let node = nodeMap.get(value); >- if (!node) >- return false; >- >- nodeMap.delete(value); >- this._insertionOrderedEntries.remove(node); >- return true; >- } >- >- deleteAll(key) >- { >- let nodeMap = this._keyMap.get(key); >- if (!nodeMap) >- return false; >- >- let list = this._insertionOrderedEntries; >- let didDelete = false; >- nodeMap.forEach(function(node) { >- list.remove(node); >- didDelete = true; >- }); >- >- this._keyMap.delete(key); >- return didDelete; >- } >- >- has(key, value) >- { >- let nodeMap = this._keyMap.get(key); >- if (!nodeMap) >- return false; >- >- return nodeMap.has(value); >- } >- >- clear() >- { >- this._keyMap = new Map; >- this._insertionOrderedEntries = new LinkedList; >- } >- >- forEach(callback) >- { >- this._insertionOrderedEntries.forEach(callback); >- } >- >- toArray() >- { >- return this._insertionOrderedEntries.toArray(); >- } >- >- toJSON() >- { >- return this.toArray(); >- } >-} >diff --git a/Source/WebInspectorUI/UserInterface/Base/Main.js b/Source/WebInspectorUI/UserInterface/Base/Main.js >index 04047f5b99c..2431e8bb909 100644 >--- a/Source/WebInspectorUI/UserInterface/Base/Main.js >+++ b/Source/WebInspectorUI/UserInterface/Base/Main.js >@@ -94,7 +94,7 @@ WI.loaded = function() > > // Listen for the ProvisionalLoadStarted event before registering for events so our code gets called before any managers or sidebars. > // This lets us save a state cookie before any managers or sidebars do any resets that would affect state (namely TimelineManager). >- WI.Frame.addEventListener(WI.Frame.Event.ProvisionalLoadStarted, WI._provisionalLoadStarted,); >+ WI.Frame.addEventListener(WI.Frame.Event.ProvisionalLoadStarted, WI._provisionalLoadStarted, WI); > > // Populate any UIStrings that must be done early after localized strings have loaded. > WI.KeyboardShortcut.Key.Space._displayName = WI.UIString("Space"); >@@ -125,16 +125,16 @@ WI.loaded = function() > ]; > > // Register for events. >- WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, WI._debuggerDidPause); >- WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Resumed, WI._debuggerDidResume); >- WI.domManager.addEventListener(WI.DOMManager.Event.InspectModeStateChanged, WI._inspectModeStateChanged); >- WI.domManager.addEventListener(WI.DOMManager.Event.DOMNodeWasInspected, WI._domNodeWasInspected); >- WI.domStorageManager.addEventListener(WI.DOMStorageManager.Event.DOMStorageObjectWasInspected, WI._domStorageWasInspected); >- WI.databaseManager.addEventListener(WI.DatabaseManager.Event.DatabaseWasInspected, WI._databaseWasInspected); >- WI.networkManager.addEventListener(WI.NetworkManager.Event.MainFrameDidChange, WI._mainFrameDidChange); >- WI.networkManager.addEventListener(WI.NetworkManager.Event.FrameWasAdded, WI._frameWasAdded); >+ WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, WI._debuggerDidPause, WI); >+ WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Resumed, WI._debuggerDidResume, WI); >+ WI.domManager.addEventListener(WI.DOMManager.Event.InspectModeStateChanged, WI._inspectModeStateChanged, WI); >+ WI.domManager.addEventListener(WI.DOMManager.Event.DOMNodeWasInspected, WI._domNodeWasInspected, WI); >+ WI.domStorageManager.addEventListener(WI.DOMStorageManager.Event.DOMStorageObjectWasInspected, WI._domStorageWasInspected, WI); >+ WI.databaseManager.addEventListener(WI.DatabaseManager.Event.DatabaseWasInspected, WI._databaseWasInspected, WI); >+ WI.networkManager.addEventListener(WI.NetworkManager.Event.MainFrameDidChange, WI._mainFrameDidChange, WI); >+ WI.networkManager.addEventListener(WI.NetworkManager.Event.FrameWasAdded, WI._frameWasAdded, WI); > >- WI.Frame.addEventListener(WI.Frame.Event.MainResourceDidChange, WI._mainResourceDidChange); >+ WI.Frame.addEventListener(WI.Frame.Event.MainResourceDidChange, WI._mainResourceDidChange, WI); > > document.addEventListener("DOMContentLoaded", WI.contentLoaded); > >@@ -302,26 +302,26 @@ WI.contentLoaded = function() > document.body.classList.add(WI.sharedApp.debuggableType); > document.body.setAttribute("dir", WI.resolvedLayoutDirection()); > >- WI.settings.showJavaScriptTypeInformation.addEventListener(WI.Setting.Event.Changed, WI._showJavaScriptTypeInformationSettingChanged); >- WI.settings.enableControlFlowProfiler.addEventListener(WI.Setting.Event.Changed, WI._enableControlFlowProfilerSettingChanged); >- WI.settings.resourceCachingDisabled.addEventListener(WI.Setting.Event.Changed, WI._resourceCachingDisabledSettingChanged); >+ WI.settings.showJavaScriptTypeInformation.addEventListener(WI.Setting.Event.Changed, WI._showJavaScriptTypeInformationSettingChanged, WI); >+ WI.settings.enableControlFlowProfiler.addEventListener(WI.Setting.Event.Changed, WI._enableControlFlowProfilerSettingChanged, WI); >+ WI.settings.resourceCachingDisabled.addEventListener(WI.Setting.Event.Changed, WI._resourceCachingDisabledSettingChanged, WI); > > function setTabSize() { > document.body.style.tabSize = WI.settings.tabSize.value; > } >- WI.settings.tabSize.addEventListener(WI.Setting.Event.Changed, setTabSize); >+ WI.settings.tabSize.addEventListener(WI.Setting.Event.Changed, setTabSize, WI); > setTabSize(); > > function setInvalidCharacterClassName() { > document.body.classList.toggle("show-invalid-characters", WI.settings.showInvalidCharacters.value); > } >- WI.settings.showInvalidCharacters.addEventListener(WI.Setting.Event.Changed, setInvalidCharacterClassName); >+ WI.settings.showInvalidCharacters.addEventListener(WI.Setting.Event.Changed, setInvalidCharacterClassName, WI); > setInvalidCharacterClassName(); > > function setWhitespaceCharacterClassName() { > document.body.classList.toggle("show-whitespace-characters", WI.settings.showWhitespaceCharacters.value); > } >- WI.settings.showWhitespaceCharacters.addEventListener(WI.Setting.Event.Changed, setWhitespaceCharacterClassName); >+ WI.settings.showWhitespaceCharacters.addEventListener(WI.Setting.Event.Changed, setWhitespaceCharacterClassName, WI); > setWhitespaceCharacterClassName(); > > WI.settingsTabContentView = new WI.SettingsTabContentView; >@@ -335,7 +335,7 @@ WI.contentLoaded = function() > WI.tabBar = new WI.TabBar(document.getElementById("tab-bar")); > else { > WI.tabBar = new WI.LegacyTabBar(document.getElementById("tab-bar")); >- WI.tabBar.addEventListener(WI.TabBar.Event.OpenDefaultTab, WI._openDefaultTab); >+ WI.tabBar.addEventListener(WI.TabBar.Event.OpenDefaultTab, WI._openDefaultTab, WI); > } > > WI._contentElement = document.getElementById("content"); >@@ -351,8 +351,8 @@ WI.contentLoaded = function() > WI.findPreviousKeyboardShortcut = new WI.KeyboardShortcut(WI.KeyboardShortcut.Modifier.Shift | WI.KeyboardShortcut.Modifier.CommandOrControl, "G", WI._findPrevious); > > WI.consoleDrawer = new WI.ConsoleDrawer(document.getElementById("console-drawer")); >- WI.consoleDrawer.addEventListener(WI.ConsoleDrawer.Event.CollapsedStateChanged, WI._consoleDrawerCollapsedStateDidChange); >- WI.consoleDrawer.addEventListener(WI.ConsoleDrawer.Event.Resized, WI._consoleDrawerDidResize); >+ WI.consoleDrawer.addEventListener(WI.ConsoleDrawer.Event.CollapsedStateChanged, WI._consoleDrawerCollapsedStateDidChange, WI); >+ WI.consoleDrawer.addEventListener(WI.ConsoleDrawer.Event.Resized, WI._consoleDrawerDidResize, WI); > > WI.quickConsole = new WI.QuickConsole(document.getElementById("quick-console")); > >@@ -363,10 +363,10 @@ WI.contentLoaded = function() > > // FIXME: The sidebars should be flipped in RTL languages. > WI.navigationSidebar = new WI.Sidebar(document.getElementById("navigation-sidebar"), WI.Sidebar.Sides.Left); >- WI.navigationSidebar.addEventListener(WI.Sidebar.Event.WidthDidChange, WI._sidebarWidthDidChange); >+ WI.navigationSidebar.addEventListener(WI.Sidebar.Event.WidthDidChange, WI._sidebarWidthDidChange, WI); > > WI.detailsSidebar = new WI.Sidebar(document.getElementById("details-sidebar"), WI.Sidebar.Sides.Right, null, null, WI.UIString("Details"), true); >- WI.detailsSidebar.addEventListener(WI.Sidebar.Event.WidthDidChange, WI._sidebarWidthDidChange); >+ WI.detailsSidebar.addEventListener(WI.Sidebar.Event.WidthDidChange, WI._sidebarWidthDidChange, WI); > > WI.searchKeyboardShortcut = new WI.KeyboardShortcut(WI.KeyboardShortcut.Modifier.CommandOrControl | WI.KeyboardShortcut.Modifier.Shift, "F", WI._focusSearchField); > WI._findKeyboardShortcut = new WI.KeyboardShortcut(WI.KeyboardShortcut.Modifier.CommandOrControl, "F", WI._find); >@@ -391,7 +391,7 @@ WI.contentLoaded = function() > WI._openNewTabKeyboardShortcut = new WI.KeyboardShortcut(WI.KeyboardShortcut.Modifier.CommandOrControl | WI.KeyboardShortcut.Modifier.Option, "T", WI.showNewTabTab); > > WI.tabBrowser = new WI.TabBrowser(document.getElementById("tab-browser"), WI.tabBar, WI.navigationSidebar, WI.detailsSidebar); >- WI.tabBrowser.addEventListener(WI.TabBrowser.Event.SelectedTabContentViewDidChange, WI._tabBrowserSelectedTabContentViewDidChange); >+ WI.tabBrowser.addEventListener(WI.TabBrowser.Event.SelectedTabContentViewDidChange, WI._tabBrowserSelectedTabContentViewDidChange, WI); > > WI._reloadPageKeyboardShortcut = new WI.KeyboardShortcut(WI.KeyboardShortcut.Modifier.CommandOrControl, "R", WI._reloadPage); > WI._reloadPageFromOriginKeyboardShortcut = new WI.KeyboardShortcut(WI.KeyboardShortcut.Modifier.CommandOrControl | WI.KeyboardShortcut.Modifier.Option, "R", WI._reloadPageFromOrigin); >@@ -418,22 +418,22 @@ WI.contentLoaded = function() > WI.stepOutAlternateKeyboardShortcut = new WI.KeyboardShortcut(WI.KeyboardShortcut.Modifier.Shift | WI.KeyboardShortcut.Modifier.CommandOrControl, WI.KeyboardShortcut.Key.Semicolon, WI.debuggerStepOut); > > WI._closeToolbarButton = new WI.ControlToolbarItem("dock-close", WI.UIString("Close"), "Images/Close.svg", 16, 14); >- WI._closeToolbarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI.close); >+ WI._closeToolbarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI.close, WI); > > WI._undockToolbarButton = new WI.ButtonToolbarItem("undock", WI.UIString("Detach into separate window"), "Images/Undock.svg"); > WI._undockToolbarButton.element.classList.add(WI.Popover.IgnoreAutoDismissClassName); >- WI._undockToolbarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._undock); >+ WI._undockToolbarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._undock, WI); > > let dockImage = WI.resolvedLayoutDirection() === WI.LayoutDirection.RTL ? "Images/DockLeft.svg" : "Images/DockRight.svg"; > WI._dockToSideToolbarButton = new WI.ButtonToolbarItem("dock-right", WI.UIString("Dock to side of window"), dockImage); > WI._dockToSideToolbarButton.element.classList.add(WI.Popover.IgnoreAutoDismissClassName); > > let dockToSideCallback = WI.resolvedLayoutDirection() === WI.LayoutDirection.RTL ? WI._dockLeft : WI._dockRight; >- WI._dockToSideToolbarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, dockToSideCallback); >+ WI._dockToSideToolbarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, dockToSideCallback, WI); > > WI._dockBottomToolbarButton = new WI.ButtonToolbarItem("dock-bottom", WI.UIString("Dock to bottom of window"), "Images/DockBottom.svg"); > WI._dockBottomToolbarButton.element.classList.add(WI.Popover.IgnoreAutoDismissClassName); >- WI._dockBottomToolbarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._dockBottom); >+ WI._dockBottomToolbarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._dockBottom, WI); > > WI._togglePreviousDockConfigurationKeyboardShortcut = new WI.KeyboardShortcut(WI.KeyboardShortcut.Modifier.CommandOrControl | WI.KeyboardShortcut.Modifier.Shift, "D", WI._togglePreviousDockConfiguration); > >@@ -443,21 +443,21 @@ WI.contentLoaded = function() > else > reloadToolTip = WI.UIString("Reload page (%s)\nReload page ignoring cache (%s)").format(WI._reloadPageKeyboardShortcut.displayName, WI._reloadPageFromOriginKeyboardShortcut.displayName); > WI._reloadToolbarButton = new WI.ButtonToolbarItem("reload", reloadToolTip, "Images/ReloadToolbar.svg"); >- WI._reloadToolbarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._reloadToolbarButtonClicked); >+ WI._reloadToolbarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._reloadToolbarButtonClicked, WI); > > WI._downloadToolbarButton = new WI.ButtonToolbarItem("download", WI.UIString("Download Web Archive"), "Images/DownloadArrow.svg"); >- WI._downloadToolbarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._downloadWebArchive); >+ WI._downloadToolbarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._downloadWebArchive, WI); > > let elementSelectionToolTip = WI.UIString("Start element selection (%s)").format(WI._inspectModeKeyboardShortcut.displayName); > let activatedElementSelectionToolTip = WI.UIString("Stop element selection (%s)").format(WI._inspectModeKeyboardShortcut.displayName); > WI._inspectModeToolbarButton = new WI.ActivateButtonToolbarItem("inspect", elementSelectionToolTip, activatedElementSelectionToolTip, "Images/Crosshair.svg"); >- WI._inspectModeToolbarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._toggleInspectMode); >+ WI._inspectModeToolbarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._toggleInspectMode, WI); > > // COMPATIBILITY (iOS 12.2): Page.overrideSetting did not exist. > if (InspectorFrontendHost.isRemote && WI.sharedApp.debuggableType === WI.DebuggableType.Web && InspectorBackend.domains.Page && InspectorBackend.domains.Page.overrideUserAgent && InspectorBackend.domains.Page.overrideSetting) { > const deviceSettingsTooltip = WI.UIString("Device Settings"); > WI._deviceSettingsToolbarButton = new WI.ActivateButtonToolbarItem("device-settings", deviceSettingsTooltip, deviceSettingsTooltip, "Images/Device.svg"); >- WI._deviceSettingsToolbarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._handleDeviceSettingsToolbarButtonClicked); >+ WI._deviceSettingsToolbarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._handleDeviceSettingsToolbarButtonClicked, WI); > > WI._deviceSettingsPopover = null; > } >@@ -498,7 +498,7 @@ WI.contentLoaded = function() > } else { > const incremental = false; > WI._searchToolbarItem = new WI.SearchBar("inspector-search", WI.UIString("Search"), incremental); >- WI._searchToolbarItem.addEventListener(WI.SearchBar.Event.TextChanged, WI._searchTextDidChange); >+ WI._searchToolbarItem.addEventListener(WI.SearchBar.Event.TextChanged, WI._searchTextDidChange, WI); > WI.toolbar.addToolbarItem(WI._searchToolbarItem, WI.Toolbar.Section.Right); > } > >@@ -574,9 +574,9 @@ WI.contentLoaded = function() > WI.showNewTabTab({suppressAnimations: true}); > > // Listen to the events after restoring the saved tabs to avoid recursion. >- WI.tabBar.addEventListener(WI.TabBar.Event.TabBarItemAdded, WI._rememberOpenTabs); >- WI.tabBar.addEventListener(WI.TabBar.Event.TabBarItemRemoved, WI._rememberOpenTabs); >- WI.tabBar.addEventListener(WI.TabBar.Event.TabBarItemsReordered, WI._rememberOpenTabs); >+ WI.tabBar.addEventListener(WI.TabBar.Event.TabBarItemAdded, WI._rememberOpenTabs, WI); >+ WI.tabBar.addEventListener(WI.TabBar.Event.TabBarItemRemoved, WI._rememberOpenTabs, WI); >+ WI.tabBar.addEventListener(WI.TabBar.Event.TabBarItemsReordered, WI._rememberOpenTabs, WI); > > // Signal that the frontend is now ready to receive messages. > WI.whenTargetsAvailable().then(() => { >diff --git a/Source/WebInspectorUI/UserInterface/Base/Object.js b/Source/WebInspectorUI/UserInterface/Base/Object.js >index 4802881f7c7..2dc074ea56a 100644 >--- a/Source/WebInspectorUI/UserInterface/Base/Object.js >+++ b/Source/WebInspectorUI/UserInterface/Base/Object.js >@@ -34,95 +34,126 @@ WI.Object = class WebInspectorObject > > static addEventListener(eventType, listener, thisObject) > { >- thisObject = thisObject || null; >- >- console.assert(eventType, "Object.addEventListener: invalid event type ", eventType, "(listener: ", listener, "thisObject: ", thisObject, ")"); >+ console.assert(eventType, "Object.addEventListener: invalid eventType `", eventType, "` (listener `", listener, "`, thisObject `", thisObject, "`)"); > if (!eventType) > return null; > >- console.assert(listener, "Object.addEventListener: invalid listener ", listener, "(event type: ", eventType, "thisObject: ", thisObject, ")"); >+ console.assert(listener, "Object.addEventListener: invalid listener `", listener, "` (eventType `", eventType, "`, thisObject `", thisObject, "`)"); > if (!listener) > return null; > >- if (!this._listeners) >- this._listeners = new Map(); >+ if (!thisObject && (window.InspectorTest || window.ProtocolTest)) >+ thisObject = this; > >- let listenersTable = this._listeners.get(eventType); >- if (!listenersTable) { >- listenersTable = new ListMultimap(); >- this._listeners.set(eventType, listenersTable); >+ console.assert(thisObject && thisObject instanceof Object, "Object.addEventListener: invalid thisObject `", thisObject, "` (eventType `", eventType, "`, listener `", listener, "`)"); >+ if (!thisObject || !(thisObject instanceof Object)) >+ return null; >+ >+ if (!this._listeners) >+ this._listeners = new Map; >+ >+ let thisObjectsForEventType = this._listeners.get(eventType); >+ if (!thisObjectsForEventType) { >+ thisObjectsForEventType = new WeakMap; >+ this._listeners.set(eventType, thisObjectsForEventType); > } > >- listenersTable.add(thisObject, listener); >+ let listenersForThisObject = thisObjectsForEventType.get(thisObject); >+ if (!listenersForThisObject) { >+ listenersForThisObject = new Set; >+ thisObjectsForEventType.set(thisObject, listenersForThisObject); >+ } >+ >+ console.assert(!listenersForThisObject.has(listener), "Object.addEventListener: duplicate listener `", listener, "` (eventType `", eventType, "`, thisObject `", thisObject, "`)"); >+ listenersForThisObject.add(listener); >+ > return listener; > } > > static singleFireEventListener(eventType, listener, thisObject) > { >- let wrappedCallback = function() { >- this.removeEventListener(eventType, wrappedCallback, null); >- listener.apply(thisObject, arguments); >- }.bind(this); >- >- this.addEventListener(eventType, wrappedCallback, null); >+ let wrappedCallback = (...args) => { >+ this.removeEventListener(eventType, wrappedCallback, thisObject); >+ listener.apply(thisObject, args); >+ }; >+ this.addEventListener(eventType, wrappedCallback, thisObject); > return wrappedCallback; > } > >+ static async awaitEvent(eventType, thisObject) >+ { >+ return new Promise((resolve, reject) => { >+ this.singleFireEventListener(eventType, resolve, thisObject); >+ }); >+ } >+ > static removeEventListener(eventType, listener, thisObject) > { >- eventType = eventType || null; >- listener = listener || null; >- thisObject = thisObject || null; >- >+ console.assert(this._listeners); > if (!this._listeners) > return; > >- if (thisObject && !eventType) { >- this._listeners.forEach(function(listenersTable) { >- listenersTable.deleteAll(thisObject); >- }); >+ if (!thisObject && (window.InspectorTest || window.ProtocolTest)) >+ thisObject = this; > >+ if (!eventType && !listener && thisObject) { >+ this._listeners.forEach(function(thisObjectsForEventType) { >+ thisObjectsForEventType.delete(thisObject); >+ }); > return; > } > >- let listenersTable = this._listeners.get(eventType); >- if (!listenersTable || listenersTable.size === 0) >+ let thisObjectsForEventType = this._listeners.get(eventType); >+ console.assert(thisObjectsForEventType, "Object.removeEventListener: unknown eventType `", eventType, "` (listener `", listener, "`, thisObject `", thisObject, "`)"); >+ if (!thisObjectsForEventType) > return; > >- let didDelete = listenersTable.delete(thisObject, listener); >- console.assert(didDelete, "removeEventListener cannot remove " + eventType.toString() + " because it doesn't exist."); >- } >+ let listenersForThisObject = thisObjectsForEventType.get(thisObject); >+ console.assert(listenersForThisObject, "Object.removeEventListener: unknown thisObject `", thisObject, "` (eventType `", eventType, "`, listener `", listener, "`)"); >+ if (!listenersForThisObject) >+ return; > >- static awaitEvent(eventType) >- { >- let wrapper = new WI.WrappedPromise; >- this.singleFireEventListener(eventType, (event) => wrapper.resolve(event)); >- return wrapper.promise; >+ let didDelete = listenersForThisObject.delete(listener); >+ console.assert(didDelete, "Object.removeEventListener: missing listener `", listener, "` (eventType `", eventType, "`, thisObject `", thisObject, "`)"); >+ >+ if (!listenersForThisObject.size) { >+ thisObjectsForEventType.delete(thisObject); >+ >+ if (!InspectorFrontendHost.weakMapSize(thisObjectsForEventType)) { >+ this._listeners.delete(eventType); >+ >+ if (!this._listeners.size) >+ this._listeners = null; >+ } >+ } > } > > // Only used by tests. > static hasEventListeners(eventType) > { >+ console.assert(window.InspectorTest || window.ProtocolTest); >+ > if (!this._listeners) > return false; > >- let listenersTable = this._listeners.get(eventType); >- return listenersTable && listenersTable.size > 0; >+ let thisObjectsForEventType = this._listeners.get(eventType); >+ return thisObjectsForEventType && InspectorFrontendHost.weakMapSize(thisObjectsForEventType) > 0; > } > > // This should only be used within regression tests to detect leaks. >- static retainedObjectsWithPrototype(proto) >+ static activelyListeningObjectsWithPrototype(proto) > { >+ console.assert(window.InspectorTest || window.ProtocolTest); >+ > let results = new Set; > > if (this._listeners) { >- this._listeners.forEach(function(listenersTable, eventType) { >- listenersTable.forEach(function(pair) { >- let thisObject = pair[0]; >- if (thisObject instanceof proto) >+ for (let thisObjectsForEventType of this._listeners.values()) { >+ for (let [thisObject, listenersForThisObject] of InspectorFrontendHost.weakMapEntries(thisObjectsForEventType)) { >+ if (thisObject instanceof proto && listenersForThisObject.size > 0) > results.add(thisObject); >- }); >- }); >+ } >+ } > } > > return results; >@@ -132,10 +163,10 @@ WI.Object = class WebInspectorObject > > addEventListener() { return WI.Object.addEventListener.apply(this, arguments); } > singleFireEventListener() { return WI.Object.singleFireEventListener.apply(this, arguments); } >- removeEventListener() { return WI.Object.removeEventListener.apply(this, arguments); } > awaitEvent() { return WI.Object.awaitEvent.apply(this, arguments); } >+ removeEventListener() { return WI.Object.removeEventListener.apply(this, arguments); } > hasEventListeners() { return WI.Object.hasEventListeners.apply(this, arguments); } >- retainedObjectsWithPrototype() { return WI.Object.retainedObjectsWithPrototype.apply(this, arguments); } >+ activelyListeningObjectsWithPrototype() { return WI.Object.activelyListeningObjectsWithPrototype.apply(this, arguments); } > > dispatchEventToListeners(eventType, eventData) > { >@@ -146,25 +177,20 @@ WI.Object = class WebInspectorObject > if (!object || event._stoppedPropagation) > return; > >- let listenerTypesMap = object._listeners; >- if (!listenerTypesMap || !object.hasOwnProperty("_listeners")) >+ let listeners = object._listeners; >+ if (!listeners || !object.hasOwnProperty("_listeners")) > return; > >- console.assert(listenerTypesMap instanceof Map); >- >- let listenersTable = listenerTypesMap.get(eventType); >- if (!listenersTable) >+ let thisObjectsForEventType = listeners.get(eventType); >+ if (!thisObjectsForEventType) > return; > >- // Make a copy with slice so mutations during the loop doesn't affect us. >- let listeners = listenersTable.toArray(); >- >- // Iterate over the listeners and call them. Stop if stopPropagation is called. >- for (let i = 0, length = listeners.length; i < length; ++i) { >- let [thisObject, listener] = listeners[i]; >- listener.call(thisObject, event); >- if (event._stoppedPropagation) >- break; >+ for (let [thisObject, listenersForThisObject] of InspectorFrontendHost.weakMapEntries(thisObjectsForEventType)) { >+ for (let listener of listenersForThisObject) { >+ listener.call(thisObject, event); >+ if (event._stoppedPropagation) >+ return; >+ } > } > } > >diff --git a/Source/WebInspectorUI/UserInterface/Base/SearchUtilities.js b/Source/WebInspectorUI/UserInterface/Base/SearchUtilities.js >index 5a58656861a..a41c5561eda 100644 >--- a/Source/WebInspectorUI/UserInterface/Base/SearchUtilities.js >+++ b/Source/WebInspectorUI/UserInterface/Base/SearchUtilities.js >@@ -32,18 +32,15 @@ WI.SearchUtilities = class SearchUtilities { > }; > } > >- static createSettings(namePrefix, options = {}) >+ static createSettings(namePrefix) > { > let settings = {}; > for (let [key, defaultSetting] of Object.entries(WI.SearchUtilities.defaultSettings)) { > let setting = new WI.Setting(namePrefix + "-" + defaultSetting.name, defaultSetting.value); >- defaultSetting.addEventListener(WI.Setting.Event.Changed, (event) => { >+ defaultSetting.addEventListener(WI.Setting.Event.Changed, function(event) { > setting.value = defaultSetting.value; >- }); >+ }, setting); > settings[key] = setting; >- >- if (options.handleChanged) >- setting.addEventListener(WI.Setting.Event.Changed, options.handleChanged); > } > return settings; > } >@@ -110,8 +107,8 @@ WI.SearchUtilities = class SearchUtilities { > function toggleActive() { > button.classList.toggle("active", Object.values(settings).some((setting) => !!setting.value)); > } >- settings.caseSensitive.addEventListener(WI.Setting.Event.Changed, toggleActive); >- settings.regularExpression.addEventListener(WI.Setting.Event.Changed, toggleActive); >+ settings.caseSensitive.addEventListener(WI.Setting.Event.Changed, toggleActive, button); >+ settings.regularExpression.addEventListener(WI.Setting.Event.Changed, toggleActive, button); > toggleActive(); > > return button; >diff --git a/Source/WebInspectorUI/UserInterface/Controllers/CodeMirrorColorEditingController.js b/Source/WebInspectorUI/UserInterface/Controllers/CodeMirrorColorEditingController.js >index 3c9995c2cd7..ef9e6ab61ef 100644 >--- a/Source/WebInspectorUI/UserInterface/Controllers/CodeMirrorColorEditingController.js >+++ b/Source/WebInspectorUI/UserInterface/Controllers/CodeMirrorColorEditingController.js >@@ -41,7 +41,9 @@ WI.CodeMirrorColorEditingController = class CodeMirrorColorEditingController ext > { > this._colorPicker = new WI.ColorPicker; > this._colorPicker.addEventListener(WI.ColorPicker.Event.ColorChanged, this._colorPickerColorChanged, this); >- this._colorPicker.addEventListener(WI.ColorPicker.Event.FormatChanged, (event) => popover.update()); >+ this._colorPicker.addEventListener(WI.ColorPicker.Event.FormatChanged, function(event) { >+ popover.update(); >+ }, this); > popover.content = this._colorPicker.element; > } > >diff --git a/Source/WebInspectorUI/UserInterface/Debug/Bootstrap.js b/Source/WebInspectorUI/UserInterface/Debug/Bootstrap.js >index 0ec34df34b7..825f7db1567 100644 >--- a/Source/WebInspectorUI/UserInterface/Debug/Bootstrap.js >+++ b/Source/WebInspectorUI/UserInterface/Debug/Bootstrap.js >@@ -80,7 +80,7 @@ WI.runBootstrapOperations = function() { > } > > WI.toolbar.addToolbarItem(dumpMessagesToolbarItem, WI.Toolbar.Section.CenterRight); >- dumpMessagesToolbarItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, () => { >+ dumpMessagesToolbarItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, function(event) { > let nextState; > switch (dumpMessagesCurrentState()) { > case DumpMessagesState.Off: >@@ -94,12 +94,12 @@ WI.runBootstrapOperations = function() { > break; > } > applyDumpMessagesState(nextState); >- }); >- WI.settings.autoLogProtocolMessages.addEventListener(WI.Setting.Event.Changed, () => { >+ }, WI); >+ WI.settings.autoLogProtocolMessages.addEventListener(WI.Setting.Event.Changed, function(event) { > if (ignoreChangesToState) > return; > applyDumpMessagesState(dumpMessagesCurrentState()); >- }); >+ }, WI); > applyDumpMessagesState(dumpMessagesCurrentState()); > > // Next Level Inspector. >@@ -108,19 +108,19 @@ WI.runBootstrapOperations = function() { > let inspectInspectorToolbarItem = new WI.ButtonToolbarItem("inspect-inspector", inspectInspectorToolTip); > WI.toolbar.addToolbarItem(inspectInspectorToolbarItem, WI.Toolbar.Section.CenterRight); > inspectInspectorToolbarItem.element.textContent = inspectionLevel + 1; >- inspectInspectorToolbarItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, () => { >+ inspectInspectorToolbarItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, function(event) { > InspectorFrontendHost.inspectInspector(); >- }); >+ }, WI); > > function updateDebugUI() { > dumpMessagesToolbarItem.hidden = !WI.showDebugUISetting.value; > inspectInspectorToolbarItem.hidden = !WI.showDebugUISetting.value; > } > >- WI.showDebugUISetting.addEventListener(WI.Setting.Event.Changed, () => { >+ WI.showDebugUISetting.addEventListener(WI.Setting.Event.Changed, function(event) { > updateDebugUI(); > WI.notifications.dispatchEventToListeners(WI.Notification.DebugUIEnabledDidChange); >- }); >+ }, WI); > > updateDebugUI(); > }; >diff --git a/Source/WebInspectorUI/UserInterface/Main.html b/Source/WebInspectorUI/UserInterface/Main.html >index 6b4d613704f..e9e94ede089 100644 >--- a/Source/WebInspectorUI/UserInterface/Main.html >+++ b/Source/WebInspectorUI/UserInterface/Main.html >@@ -279,8 +279,6 @@ > <script src="Base/Platform.js"></script> > <script src="Base/Debouncer.js"></script> > <script src="Base/DebuggableType.js"></script> >- <script src="Base/LinkedList.js"></script> >- <script src="Base/ListMultimap.js"></script> > <script src="Base/Multimap.js"></script> > <script src="Base/Object.js"></script> > <script src="Base/Throttler.js"></script> >diff --git a/Source/WebInspectorUI/UserInterface/Models/Resource.js b/Source/WebInspectorUI/UserInterface/Models/Resource.js >index e931c127481..e4ffa001bfe 100644 >--- a/Source/WebInspectorUI/UserInterface/Models/Resource.js >+++ b/Source/WebInspectorUI/UserInterface/Models/Resource.js >@@ -1002,8 +1002,8 @@ WI.Resource = class Resource extends WI.SourceCode > > if (!this._finishThenRequestContentPromise) { > this._finishThenRequestContentPromise = new Promise((resolve, reject) => { >- this.addEventListener(WI.Resource.Event.LoadingDidFinish, resolve); >- this.addEventListener(WI.Resource.Event.LoadingDidFail, reject); >+ this.addEventListener(WI.Resource.Event.LoadingDidFinish, resolve, this); >+ this.addEventListener(WI.Resource.Event.LoadingDidFail, reject, this); > }).then(WI.SourceCode.prototype.requestContent.bind(this)); > } > >diff --git a/Source/WebInspectorUI/UserInterface/Test.html b/Source/WebInspectorUI/UserInterface/Test.html >index e710ec6573d..5f123b3155c 100644 >--- a/Source/WebInspectorUI/UserInterface/Test.html >+++ b/Source/WebInspectorUI/UserInterface/Test.html >@@ -39,8 +39,6 @@ > <script src="Base/Platform.js"></script> > <script src="Base/Debouncer.js"></script> > <script src="Base/DebuggableType.js"></script> >- <script src="Base/LinkedList.js"></script> >- <script src="Base/ListMultimap.js"></script> > <script src="Base/Multimap.js"></script> > <script src="Base/Object.js"></script> > <script src="Base/Throttler.js"></script> >diff --git a/Source/WebInspectorUI/UserInterface/TestStub.html b/Source/WebInspectorUI/UserInterface/TestStub.html >index 3f522e9f64c..294a53fb55d 100644 >--- a/Source/WebInspectorUI/UserInterface/TestStub.html >+++ b/Source/WebInspectorUI/UserInterface/TestStub.html >@@ -30,8 +30,6 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > These resources should match the order and groups used in Main.html and Test.html. > --> > <script src="Base/WebInspector.js"></script> >- <script src="Base/LinkedList.js"></script> >- <script src="Base/ListMultimap.js"></script> > <script src="Base/Object.js"></script> > <script src="Base/Utilities.js"></script> > >diff --git a/Source/WebInspectorUI/UserInterface/Views/AuditNavigationSidebarPanel.js b/Source/WebInspectorUI/UserInterface/Views/AuditNavigationSidebarPanel.js >index b5c196dae16..761fff057d1 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/AuditNavigationSidebarPanel.js >+++ b/Source/WebInspectorUI/UserInterface/Views/AuditNavigationSidebarPanel.js >@@ -42,9 +42,9 @@ WI.AuditNavigationSidebarPanel = class AuditNavigationSidebarPanel extends WI.Na > contentView.element.appendChild(contentPlaceholder); > > let finishEditingNavigationItem = new WI.ButtonNavigationItem("finish-editing-audits", WI.UIString("Done")); >- finishEditingNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, (event) => { >+ finishEditingNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, function(event) { > WI.auditManager.editing = false; >- }); >+ }, WI); > > let importHelpElement = WI.createNavigationItemHelp(WI.UIString("Press %s to stop editing"), finishEditingNavigationItem); > contentPlaceholder.appendChild(importHelpElement); >diff --git a/Source/WebInspectorUI/UserInterface/Views/AuditTestContentView.js b/Source/WebInspectorUI/UserInterface/Views/AuditTestContentView.js >index 0597e10c295..262d2cba250 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/AuditTestContentView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/AuditTestContentView.js >@@ -165,9 +165,9 @@ WI.AuditTestContentView = class AuditTestContentView extends WI.ContentView > > let startNavigationItem = new WI.ButtonNavigationItem("run-audit", WI.UIString("Start"), "Images/AuditStart.svg", 15, 15); > startNavigationItem.buttonStyle = WI.ButtonNavigationItem.Style.ImageAndText; >- startNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, () => { >+ startNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, function(event) { > WI.auditManager.start([this.representedObject]); >- }); >+ }, this); > > let importHelpElement = WI.createNavigationItemHelp(WI.UIString("Press %s to start running the audit"), startNavigationItem); > this.placeholderElement.appendChild(importHelpElement); >diff --git a/Source/WebInspectorUI/UserInterface/Views/ChangesDetailsSidebarPanel.js b/Source/WebInspectorUI/UserInterface/Views/ChangesDetailsSidebarPanel.js >index 9f96618875f..ceb4beab7b2 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/ChangesDetailsSidebarPanel.js >+++ b/Source/WebInspectorUI/UserInterface/Views/ChangesDetailsSidebarPanel.js >@@ -68,9 +68,10 @@ WI.ChangesDetailsSidebarPanel = class ChangesDetailsSidebarPanel extends WI.DOMD > > detached() > { >- super.detached(); >+ if (this.didInitialLayout) >+ WI.Frame.removeEventListener(WI.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this); > >- WI.Frame.removeEventListener(WI.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this); >+ super.detached(); > } > > // Protected >diff --git a/Source/WebInspectorUI/UserInterface/Views/CodeMirrorEditor.js b/Source/WebInspectorUI/UserInterface/Views/CodeMirrorEditor.js >index e445dd3156b..1c613d20208 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/CodeMirrorEditor.js >+++ b/Source/WebInspectorUI/UserInterface/Views/CodeMirrorEditor.js >@@ -47,9 +47,9 @@ WI.CodeMirrorEditor = class CodeMirrorEditor > if (options[codeMirrorOption] !== undefined) > return; > >- setting.addEventListener(WI.Setting.Event.Changed, (event) => { >+ setting.addEventListener(WI.Setting.Event.Changed, function(event) { > codeMirror.setOption(codeMirrorOption, setting.value); >- }); >+ }, codeMirror); > } > listenForChange(WI.settings.indentWithTabs, "indentWithTabs"); > listenForChange(WI.settings.indentUnit, "indentUnit"); >diff --git a/Source/WebInspectorUI/UserInterface/Views/ConsoleDrawer.js b/Source/WebInspectorUI/UserInterface/Views/ConsoleDrawer.js >index 16929cd2276..b49aef5e75c 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/ConsoleDrawer.js >+++ b/Source/WebInspectorUI/UserInterface/Views/ConsoleDrawer.js >@@ -41,7 +41,9 @@ WI.ConsoleDrawer = class ConsoleDrawer extends WI.ContentBrowser > this._toggleDrawerButton = new WI.ToggleButtonNavigationItem("toggle-drawer", WI.UIString("Hide Console"), WI.UIString("Show Console"), "Images/HideConsoleDrawer.svg", "Images/ShowConsoleDrawer.svg"); > > this._toggleDrawerButton.visibilityPriority = WI.NavigationItem.VisibilityPriority.High; >- this._toggleDrawerButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, () => { WI.toggleSplitConsole(); }); >+ this._toggleDrawerButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, function(event) { >+ WI.toggleSplitConsole(); >+ }, WI); > this.navigationBar.insertNavigationItem(this._toggleDrawerButton, 0); > > this.collapsed = true; >diff --git a/Source/WebInspectorUI/UserInterface/Views/ContentBrowser.js b/Source/WebInspectorUI/UserInterface/Views/ContentBrowser.js >index 7e9a2f91eff..77338caf5b2 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/ContentBrowser.js >+++ b/Source/WebInspectorUI/UserInterface/Views/ContentBrowser.js >@@ -55,11 +55,11 @@ WI.ContentBrowser = class ContentBrowser extends WI.View > let forwardButtonImage = isRTL ? leftArrow : rightArrow; > > this._backNavigationItem = new WI.ButtonNavigationItem("back", WI.UIString("Back (%s)").format(this._backKeyboardShortcut.displayName), backButtonImage, 8, 13); >- this._backNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, goBack); >+ this._backNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, goBack, this); > this._backNavigationItem.enabled = false; > > this._forwardNavigationItem = new WI.ButtonNavigationItem("forward", WI.UIString("Forward (%s)").format(this._forwardKeyboardShortcut.displayName), forwardButtonImage, 8, 13); >- this._forwardNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, goForward); >+ this._forwardNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, goForward, this); > this._forwardNavigationItem.enabled = false; > > let navigationButtonsGroup = new WI.GroupNavigationItem([this._backNavigationItem, this._forwardNavigationItem]); >diff --git a/Source/WebInspectorUI/UserInterface/Views/DataGridNode.js b/Source/WebInspectorUI/UserInterface/Views/DataGridNode.js >index d90a9480ae0..32f48d28292 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/DataGridNode.js >+++ b/Source/WebInspectorUI/UserInterface/Views/DataGridNode.js >@@ -442,8 +442,6 @@ WI.DataGridNode = class DataGridNode extends WI.Object > for (var i = 0; i < this.children.length; ++i) > this.children[i].revealed = false; > >- this.dispatchEventToListeners("collapsed"); >- > if (this.dataGrid) { > this.dataGrid.dispatchEventToListeners(WI.DataGrid.Event.CollapsedNode, {dataGridNode: this}); > this.dataGrid._noteRowsChanged(); >@@ -473,7 +471,7 @@ WI.DataGridNode = class DataGridNode extends WI.Object > for (var i = 0; i < this.children.length; ++i) > this.children[i]._detach(); > >- this.dispatchEventToListeners("populate"); >+ this.dispatchEventToListeners(DataGridNode.Event.Populate); > > if (this._attached) { > for (var i = 0; i < this.children.length; ++i) { >@@ -492,8 +490,6 @@ WI.DataGridNode = class DataGridNode extends WI.Object > > this._expanded = true; > >- this.dispatchEventToListeners("expanded"); >- > if (this.dataGrid) { > this.dataGrid.dispatchEventToListeners(WI.DataGrid.Event.ExpandedNode, {dataGridNode: this}); > this.dataGrid._noteRowsChanged(); >@@ -545,8 +541,6 @@ WI.DataGridNode = class DataGridNode extends WI.Object > } > > this.dataGrid.updateVisibleRows(this); >- >- this.dispatchEventToListeners("revealed"); > } > > select(suppressSelectedEvent) >@@ -592,7 +586,7 @@ WI.DataGridNode = class DataGridNode extends WI.Object > traverseNextNode(skipHidden, stayWithin, dontPopulate, info) > { > if (!dontPopulate && this.hasChildren) >- this.dispatchEventToListeners("populate"); >+ this.dispatchEventToListeners(DataGridNode.Event.Populate); > > if (info) > info.depthChange = 0; >@@ -628,11 +622,11 @@ WI.DataGridNode = class DataGridNode extends WI.Object > { > var node = (!skipHidden || this.revealed) ? this.previousSibling : null; > if (!dontPopulate && node && node.hasChildren) >- node.dispatchEventToListeners("populate"); >+ node.dispatchEventToListeners(DataGridNode.Event.Populate); > > while (node && ((!skipHidden || (node.revealed && node.expanded)) ? node.children.lastValue : null)) { > if (!dontPopulate && node.hasChildren) >- node.dispatchEventToListeners("populate"); >+ node.dispatchEventToListeners(DataGridNode.Event.Populate); > node = (!skipHidden || (node.revealed && node.expanded)) ? node.children.lastValue : null; > } > >@@ -754,6 +748,10 @@ WI.DataGridNode = class DataGridNode extends WI.Object > } > }; > >+WI.DataGridNode.Event = { >+ Populate: "data-grid-node-populate", >+}; >+ > // Used to create a new table row when entering new data by editing cells. > WI.PlaceholderDataGridNode = class PlaceholderDataGridNode extends WI.DataGridNode > { >diff --git a/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js b/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js >index 9bb6a68485e..57fe1d8db7b 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js >+++ b/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js >@@ -331,9 +331,9 @@ WI.DebuggerSidebarPanel = class DebuggerSidebarPanel extends WI.NavigationSideba > > createContentTreeOutline(options = {}) > { >- let treeOutline = super.createContentTreeOutline(options) >+ let treeOutline = super.createContentTreeOutline(options); > >- treeOutline.addEventListener(WI.TreeOutline.Event.ElementRevealed, (event) => { >+ treeOutline.addEventListener(WI.TreeOutline.Event.ElementRevealed, function(event) { > let treeElement = event.data.element; > let detailsSections = [this._pauseReasonSection, this._callStackSection, this._breakpointsSection, this._scriptsSection]; > let detailsSection = detailsSections.find((detailsSection) => detailsSection.element.contains(treeElement.listItemElement)); >@@ -347,7 +347,7 @@ WI.DebuggerSidebarPanel = class DebuggerSidebarPanel extends WI.NavigationSideba > let offset = detailsSection.headerElement.totalOffsetBottom - treeElement.listItemElement.totalOffsetTop; > if (offset > 0) > this.scrollElement.scrollBy(0, -offset); >- }); >+ }, this); > > return treeOutline; > } >diff --git a/Source/WebInspectorUI/UserInterface/Views/DefaultDashboardView.js b/Source/WebInspectorUI/UserInterface/Views/DefaultDashboardView.js >index 7faf0d5a6c6..eb0f2218cac 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/DefaultDashboardView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/DefaultDashboardView.js >@@ -29,7 +29,10 @@ WI.DefaultDashboardView = class DefaultDashboardView extends WI.DashboardView > { > super(representedObject, "default"); > >- representedObject.addEventListener(WI.DefaultDashboard.Event.DataDidChange, () => { this._updateDisplaySoon(); }); >+ representedObject.addEventListener(WI.DefaultDashboard.Event.DataDidChange, function(event) { >+ this._updateDisplaySoon(); >+ }, this); >+ > this._scheduledUpdateIdentifier = undefined; > > this._items = { >diff --git a/Source/WebInspectorUI/UserInterface/Views/HeapSnapshotClassDataGridNode.js b/Source/WebInspectorUI/UserInterface/Views/HeapSnapshotClassDataGridNode.js >index 5791ac1722d..85d9b257c18 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/HeapSnapshotClassDataGridNode.js >+++ b/Source/WebInspectorUI/UserInterface/Views/HeapSnapshotClassDataGridNode.js >@@ -35,7 +35,7 @@ WI.HeapSnapshotClassDataGridNode = class HeapSnapshotClassDataGridNode extends W > this._batched = false; > this._instances = null; > >- this.addEventListener("populate", this._populate, this); >+ this.addEventListener(WI.DataGridNode.Event.Populate, this._populate, this); > } > > // Protected >@@ -134,7 +134,7 @@ WI.HeapSnapshotClassDataGridNode = class HeapSnapshotClassDataGridNode extends W > > _populate() > { >- this.removeEventListener("populate", this._populate, this); >+ this.removeEventListener(WI.DataGridNode.Event.Populate, this._populate, this); > > this._tree.heapSnapshot.instancesWithClassName(this._data.className, (instances) => { > // FIXME: <https://webkit.org/b/157905> Web Inspector: Provide a way to toggle between showing only live objects and live+dead objects >diff --git a/Source/WebInspectorUI/UserInterface/Views/HeapSnapshotContentView.js b/Source/WebInspectorUI/UserInterface/Views/HeapSnapshotContentView.js >index 40096270ae8..bd37ae62e23 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/HeapSnapshotContentView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/HeapSnapshotContentView.js >@@ -37,7 +37,9 @@ WI.HeapSnapshotContentView = class HeapSnapshotContentView extends WI.ContentVie > this._exportButtonNavigationItem.tooltip = WI.UIString("Export (%s)").format(WI.saveKeyboardShortcut.displayName); > this._exportButtonNavigationItem.buttonStyle = WI.ButtonNavigationItem.Style.ImageAndText; > this._exportButtonNavigationItem.visibilityPriority = WI.NavigationItem.VisibilityPriority.High; >- this._exportButtonNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, () => { this._exportSnapshot(); }); >+ this._exportButtonNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, function(event) { >+ this._exportSnapshot(); >+ }, this); > > this._dataGrid = new WI.DataGrid(columns); > this._dataGrid.sortColumnIdentifier = "retainedSize"; >diff --git a/Source/WebInspectorUI/UserInterface/Views/HeapSnapshotInstanceDataGridNode.js b/Source/WebInspectorUI/UserInterface/Views/HeapSnapshotInstanceDataGridNode.js >index 54846f502be..e026f54c3e7 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/HeapSnapshotInstanceDataGridNode.js >+++ b/Source/WebInspectorUI/UserInterface/Views/HeapSnapshotInstanceDataGridNode.js >@@ -45,7 +45,7 @@ WI.HeapSnapshotInstanceDataGridNode = class HeapSnapshotInstanceDataGridNode ext > this.copyable = false; > > if (hasChildren) >- this.addEventListener("populate", this._populate, this); >+ this.addEventListener(WI.DataGridNode.Event.Populate, this._populate, this); > } > > // Static >@@ -218,7 +218,7 @@ WI.HeapSnapshotInstanceDataGridNode = class HeapSnapshotInstanceDataGridNode ext > > _populate() > { >- this.removeEventListener("populate", this._populate, this); >+ this.removeEventListener(WI.DataGridNode.Event.Populate, this._populate, this); > > function propertyName(edge) { > return edge ? WI.HeapSnapshotRootPath.pathComponentForIndividualEdge(edge) : ""; >diff --git a/Source/WebInspectorUI/UserInterface/Views/ImageResourceContentView.js b/Source/WebInspectorUI/UserInterface/Views/ImageResourceContentView.js >index 0a10de5a5dc..20954dd8864 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/ImageResourceContentView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/ImageResourceContentView.js >@@ -72,20 +72,20 @@ WI.ImageResourceContentView = class ImageResourceContentView extends WI.Resource > > // Protected > >- shown() >+ attached() > { >- super.shown(); >+ super.attached(); > > this._updateImageGrid(); > > WI.settings.showImageGrid.addEventListener(WI.Setting.Event.Changed, this._updateImageGrid, this); > } > >- hidden() >+ detached() > { > WI.settings.showImageGrid.removeEventListener(WI.Setting.Event.Changed, this._updateImageGrid, this); > >- super.hidden(); >+ super.detached(); > } > > // Private >diff --git a/Source/WebInspectorUI/UserInterface/Views/InlineSwatch.js b/Source/WebInspectorUI/UserInterface/Views/InlineSwatch.js >index 4de1fd4da8a..cd65bc76108 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/InlineSwatch.js >+++ b/Source/WebInspectorUI/UserInterface/Views/InlineSwatch.js >@@ -185,13 +185,17 @@ WI.InlineSwatch = class InlineSwatch extends WI.Object > case WI.InlineSwatch.Type.Color: > this._valueEditor = new WI.ColorPicker; > this._valueEditor.addEventListener(WI.ColorPicker.Event.ColorChanged, this._valueEditorValueDidChange, this); >- this._valueEditor.addEventListener(WI.ColorPicker.Event.FormatChanged, (event) => popover.update()); >+ this._valueEditor.addEventListener(WI.ColorPicker.Event.FormatChanged, function(event) { >+ popover.update(); >+ }, popover); > break; > > case WI.InlineSwatch.Type.Gradient: > this._valueEditor = new WI.GradientEditor; > this._valueEditor.addEventListener(WI.GradientEditor.Event.GradientChanged, this._valueEditorValueDidChange, this); >- this._valueEditor.addEventListener(WI.GradientEditor.Event.ColorPickerToggled, (event) => popover.update()); >+ this._valueEditor.addEventListener(WI.GradientEditor.Event.ColorPickerToggled, function(event) { >+ popover.update(); >+ }, popover); > break; > > case WI.InlineSwatch.Type.Bezier: >diff --git a/Source/WebInspectorUI/UserInterface/Views/LogContentView.js b/Source/WebInspectorUI/UserInterface/Views/LogContentView.js >index 35924ae386b..ca15ad5e913 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/LogContentView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/LogContentView.js >@@ -70,16 +70,16 @@ WI.LogContentView = class LogContentView extends WI.ContentView > > this._preserveLogNavigationItem = new WI.CheckboxNavigationItem("preserve-log", WI.UIString("Preserve Log"), !WI.settings.clearLogOnNavigate.value); > this._preserveLogNavigationItem.tooltip = WI.UIString("Do not clear the console on new page loads"); >- this._preserveLogNavigationItem.addEventListener(WI.CheckboxNavigationItem.Event.CheckedDidChange, () => { >+ this._preserveLogNavigationItem.addEventListener(WI.CheckboxNavigationItem.Event.CheckedDidChange, function(event) { > WI.settings.clearLogOnNavigate.value = !WI.settings.clearLogOnNavigate.value; >- }); >+ }, WI); > WI.settings.clearLogOnNavigate.addEventListener(WI.Setting.Event.Changed, this._handleClearLogOnNavigateSettingChanged, this); > > this._emulateInUserGestureNavigationItem = new WI.CheckboxNavigationItem("emulate-in-user-gesture", WI.UIString("Emulate User Gesture"), WI.settings.emulateInUserGesture.value); > this._emulateInUserGestureNavigationItem.tooltip = WI.UIString("Run console commands as if inside a user gesture"); >- this._emulateInUserGestureNavigationItem.addEventListener(WI.CheckboxNavigationItem.Event.CheckedDidChange, () => { >+ this._emulateInUserGestureNavigationItem.addEventListener(WI.CheckboxNavigationItem.Event.CheckedDidChange, function(event) { > WI.settings.emulateInUserGesture.value = !WI.settings.emulateInUserGesture.value; >- }); >+ }, WI); > WI.settings.emulateInUserGesture.addEventListener(WI.Setting.Event.Changed, this._handleEmulateInUserGestureSettingChanged, this); > > this._checkboxesNavigationItemGroup = new WI.GroupNavigationItem([this._preserveLogNavigationItem, this._emulateInUserGestureNavigationItem, new WI.DividerNavigationItem]); >diff --git a/Source/WebInspectorUI/UserInterface/Views/NetworkTableContentView.js b/Source/WebInspectorUI/UserInterface/Views/NetworkTableContentView.js >index 872eab8441e..9dac9b6b801 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/NetworkTableContentView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/NetworkTableContentView.js >@@ -108,22 +108,24 @@ WI.NetworkTableContentView = class NetworkTableContentView extends WI.ContentVie > > this._clearOnLoadNavigationItem = new WI.CheckboxNavigationItem("preserve-log", WI.UIString("Preserve Log"), !WI.settings.clearNetworkOnNavigate.value); > this._clearOnLoadNavigationItem.tooltip = WI.UIString("Do not clear network items on new page loads"); >- this._clearOnLoadNavigationItem.addEventListener(WI.CheckboxNavigationItem.Event.CheckedDidChange, () => { WI.settings.clearNetworkOnNavigate.value = !WI.settings.clearNetworkOnNavigate.value; }); >+ this._clearOnLoadNavigationItem.addEventListener(WI.CheckboxNavigationItem.Event.CheckedDidChange, function(event) { >+ WI.settings.clearNetworkOnNavigate.value = !WI.settings.clearNetworkOnNavigate.value; >+ }, WI); > WI.settings.clearNetworkOnNavigate.addEventListener(WI.Setting.Event.Changed, this._clearNetworkOnNavigateSettingChanged, this); > > this._harImportNavigationItem = new WI.ButtonNavigationItem("har-import", WI.UIString("Import"), "Images/Import.svg", 15, 15); > this._harImportNavigationItem.buttonStyle = WI.ButtonNavigationItem.Style.ImageAndText; > this._harImportNavigationItem.tooltip = WI.UIString("HAR Import"); >- this._harImportNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, () => { >+ this._harImportNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, function(event) { > this._importHAR(); >- }); >+ }, this); > > this._harExportNavigationItem = new WI.ButtonNavigationItem("har-export", WI.UIString("Export"), "Images/Export.svg", 15, 15); > this._harExportNavigationItem.buttonStyle = WI.ButtonNavigationItem.Style.ImageAndText; > this._harExportNavigationItem.tooltip = WI.UIString("HAR Export (%s)").format(WI.saveKeyboardShortcut.displayName); >- this._harExportNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, () => { >+ this._harExportNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, function(event) { > this._exportHAR(); >- }); >+ }, this); > > this._collectionsPathNavigationItem = new WI.HierarchicalPathNavigationItem; > this._collectionsPathNavigationItem.addEventListener(WI.HierarchicalPathNavigationItem.Event.PathComponentWasSelected, this._collectionsHierarchicalPathComponentWasSelected, this); >@@ -155,9 +157,9 @@ WI.NetworkTableContentView = class NetworkTableContentView extends WI.ContentVie > } > > this._clearNetworkItemsNavigationItem = new WI.ButtonNavigationItem("clear-network-items", WI.UIString("Clear Network Items (%s)").format(WI.clearKeyboardShortcut.displayName), "Images/NavigationItemTrash.svg", 15, 15); >- this._clearNetworkItemsNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, () => { >+ this._clearNetworkItemsNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, function(event) { > this.reset(); >- }); >+ }, this); > > WI.Target.addEventListener(WI.Target.Event.ResourceAdded, this._handleResourceAdded, this); > WI.Frame.addEventListener(WI.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this); >diff --git a/Source/WebInspectorUI/UserInterface/Views/ProfileDataGridNode.js b/Source/WebInspectorUI/UserInterface/Views/ProfileDataGridNode.js >index e29449e1b1f..1dd7e8ce924 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/ProfileDataGridNode.js >+++ b/Source/WebInspectorUI/UserInterface/Views/ProfileDataGridNode.js >@@ -38,7 +38,7 @@ WI.ProfileDataGridNode = class ProfileDataGridNode extends WI.DataGridNode > // FIXME: Make profile data grid nodes copyable. > this.copyable = false; > >- this.addEventListener("populate", this._populate, this); >+ this.addEventListener(WI.DataGridNode.Event.Populate, this._populate, this); > > this._updateChildrenForModifiers(); > this._recalculateData(); >@@ -258,7 +258,7 @@ WI.ProfileDataGridNode = class ProfileDataGridNode extends WI.DataGridNode > if (!this.shouldRefreshChildren) > return; > >- this.removeEventListener("populate", this._populate, this); >+ this.removeEventListener(WI.DataGridNode.Event.Populate, this._populate, this); > > this._node.forEachChild((child) => { > if (!this._childrenToChargeToSelf.has(child)) { >diff --git a/Source/WebInspectorUI/UserInterface/Views/ProfileNodeDataGridNode.js b/Source/WebInspectorUI/UserInterface/Views/ProfileNodeDataGridNode.js >index 3d3969c1c17..20da878d3e5 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/ProfileNodeDataGridNode.js >+++ b/Source/WebInspectorUI/UserInterface/Views/ProfileNodeDataGridNode.js >@@ -35,7 +35,7 @@ WI.ProfileNodeDataGridNode = class ProfileNodeDataGridNode extends WI.TimelineDa > > this._profileNode = profileNode; > >- this.addEventListener("populate", this._populate, this); >+ this.addEventListener(WI.DataGridNode.Event.Populate, this._populate, this); > } > > // Public >@@ -140,7 +140,7 @@ WI.ProfileNodeDataGridNode = class ProfileNodeDataGridNode extends WI.TimelineDa > if (!this.shouldRefreshChildren) > return; > >- this.removeEventListener("populate", this._populate, this); >+ this.removeEventListener(WI.DataGridNode.Event.Populate, this._populate, this); > this.removeChildren(); > > for (let node of this._profileNode.childNodes) >diff --git a/Source/WebInspectorUI/UserInterface/Views/ResourceDetailsSidebarPanel.js b/Source/WebInspectorUI/UserInterface/Views/ResourceDetailsSidebarPanel.js >index 759e5d65874..162dcfef4b3 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/ResourceDetailsSidebarPanel.js >+++ b/Source/WebInspectorUI/UserInterface/Views/ResourceDetailsSidebarPanel.js >@@ -621,7 +621,7 @@ WI.ResourceDetailsSidebarPanel = class ResourceDetailsSidebarPanel extends WI.De > this._resource.addEventListener(WI.Resource.Event.MetricsDidChange, this._refreshRequestAndResponse, this); > this._resource.addEventListener(WI.Resource.Event.SizeDidChange, this._refreshDecodedSize, this); > this._resource.addEventListener(WI.Resource.Event.TransferSizeDidChange, this._refreshTransferSize, this); >- this._resource.addEventListener(WI.Resource.Event.InitiatedResourcesDidChange, () => { >+ this._resource.addEventListener(WI.Resource.Event.InitiatedResourcesDidChange, function(event) { > this._refreshRelatedResourcesSectionThrottler.fire(); > }, this); > >diff --git a/Source/WebInspectorUI/UserInterface/Views/ResourceSidebarPanel.js b/Source/WebInspectorUI/UserInterface/Views/ResourceSidebarPanel.js >index 7b1d61025f8..3718be17510 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/ResourceSidebarPanel.js >+++ b/Source/WebInspectorUI/UserInterface/Views/ResourceSidebarPanel.js >@@ -70,7 +70,9 @@ WI.ResourceSidebarPanel = class ResourceSidebarPanel extends WI.NavigationSideba > > if (ResourceSidebarPanel.shouldPlaceResourcesAtTopLevel()) { > this.contentTreeOutline.disclosureButtons = false; >- WI.SourceCode.addEventListener(WI.SourceCode.Event.SourceMapAdded, () => { this.contentTreeOutline.disclosureButtons = true; }, this); >+ WI.SourceCode.addEventListener(WI.SourceCode.Event.SourceMapAdded, function(event) { >+ this.contentTreeOutline.disclosureButtons = true; >+ }, this); > } > } > >diff --git a/Source/WebInspectorUI/UserInterface/Views/ScopeChainDetailsSidebarPanel.js b/Source/WebInspectorUI/UserInterface/Views/ScopeChainDetailsSidebarPanel.js >index eb2ff6fc6a9..5c34988009e 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/ScopeChainDetailsSidebarPanel.js >+++ b/Source/WebInspectorUI/UserInterface/Views/ScopeChainDetailsSidebarPanel.js >@@ -262,8 +262,12 @@ WI.ScopeChainDetailsSidebarPanel = class ScopeChainDetailsSidebarPanel extends W > > let treeOutline = objectTree.treeOutline; > treeOutline.registerScrollVirtualizer(this.contentView.element, 16); >- treeOutline.addEventListener(WI.TreeOutline.Event.ElementAdded, this._treeElementAdded.bind(this, detailsSectionIdentifier), this); >- treeOutline.addEventListener(WI.TreeOutline.Event.ElementDisclosureDidChanged, this._treeElementDisclosureDidChange.bind(this, detailsSectionIdentifier), this); >+ treeOutline.addEventListener(WI.TreeOutline.Event.ElementAdded, function(event) { >+ this._treeElementAdded(detailsSectionIdentifier, event); >+ }, this); >+ treeOutline.addEventListener(WI.TreeOutline.Event.ElementDisclosureDidChanged, function(event) { >+ this._treeElementDisclosureDidChange(detailsSectionIdentifier, event); >+ }, this); > > rows.push(new WI.ObjectPropertiesDetailSectionRow(objectTree, detailsSection)); > } >@@ -298,8 +302,12 @@ WI.ScopeChainDetailsSidebarPanel = class ScopeChainDetailsSidebarPanel extends W > > let treeOutline = objectTree.treeOutline; > const watchExpressionSectionIdentifier = "watch-expressions"; >- treeOutline.addEventListener(WI.TreeOutline.Event.ElementAdded, this._treeElementAdded.bind(this, watchExpressionSectionIdentifier), this); >- treeOutline.addEventListener(WI.TreeOutline.Event.ElementDisclosureDidChanged, this._treeElementDisclosureDidChange.bind(this, watchExpressionSectionIdentifier), this); >+ treeOutline.addEventListener(WI.TreeOutline.Event.ElementAdded, function(event) { >+ this._treeElementAdded(watchExpressionSectionIdentifier, event); >+ }, this); >+ treeOutline.addEventListener(WI.TreeOutline.Event.ElementDisclosureDidChanged, function(event) { >+ this._treeElementDisclosureDidChange(watchExpressionSectionIdentifier, event); >+ }, this); > treeOutline.objectTreeElementAddContextMenuItems = this._objectTreeElementAddContextMenuItems.bind(this); > > let promises = []; >diff --git a/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.js b/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.js >index fb1b3d12f54..7e9673b3a79 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.js >+++ b/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.js >@@ -29,11 +29,12 @@ WI.SearchSidebarPanel = class SearchSidebarPanel extends WI.NavigationSidebarPan > { > super("search", WI.UIString("Search"), true, true); > >- this._searchInputSettings = WI.SearchUtilities.createSettings("search-sidebar", { >- handleChanged: (event) => { >+ this._searchInputSettings = WI.SearchUtilities.createSettings("search-sidebar"); >+ for (let setting of Object.values(this._searchInputSettings)) { >+ setting.addEventListener(WI.Setting.Event.Changed, function(event) { > this.focusSearchField(true); >- }, >- }); >+ }, this); >+ } > > var searchElement = document.createElement("div"); > searchElement.classList.add("search-bar"); >@@ -206,8 +207,8 @@ WI.SearchSidebarPanel = class SearchSidebarPanel extends WI.NavigationSidebarPan > } > > let promises = [ >- WI.Frame.awaitEvent(WI.Frame.Event.ResourceWasAdded), >- WI.Target.awaitEvent(WI.Target.Event.ResourceAdded) >+ WI.Frame.awaitEvent(WI.Frame.Event.ResourceWasAdded, this), >+ WI.Target.awaitEvent(WI.Target.Event.ResourceAdded, this), > ]; > Promise.race(promises).then(this._contentChanged.bind(this)); > }; >diff --git a/Source/WebInspectorUI/UserInterface/Views/SettingEditor.js b/Source/WebInspectorUI/UserInterface/Views/SettingEditor.js >index 648baa6b14a..1853d5da452 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/SettingEditor.js >+++ b/Source/WebInspectorUI/UserInterface/Views/SettingEditor.js >@@ -56,8 +56,12 @@ WI.SettingEditor = class SettingEditor extends WI.Object > > let editor = new WI.SettingEditor(type, label, options); > editor.value = setting.value; >- editor.addEventListener(WI.SettingEditor.Event.ValueDidChange, () => { setting.value = editor.value; }); >- setting.addEventListener(WI.Setting.Event.Changed, () => { editor.value = setting.value; }); >+ editor.addEventListener(WI.SettingEditor.Event.ValueDidChange, function(event) { >+ setting.value = editor.value; >+ }, setting); >+ setting.addEventListener(WI.Setting.Event.Changed, function(event) { >+ editor.value = setting.value; >+ }, editor); > > return editor; > } >diff --git a/Source/WebInspectorUI/UserInterface/Views/SettingsTabContentView.js b/Source/WebInspectorUI/UserInterface/Views/SettingsTabContentView.js >index 14aadeddc05..0250a4d7535 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/SettingsTabContentView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/SettingsTabContentView.js >@@ -182,9 +182,9 @@ WI.SettingsTabContentView = class SettingsTabContentView extends WI.TabContentVi > const indentValues = [WI.UIString("Tabs"), WI.UIString("Spaces")]; > let indentEditor = generalSettingsView.addGroupWithCustomSetting(WI.UIString("Prefer indent using:"), WI.SettingEditor.Type.Select, {values: indentValues}); > indentEditor.value = indentValues[WI.settings.indentWithTabs.value ? 0 : 1]; >- indentEditor.addEventListener(WI.SettingEditor.Event.ValueDidChange, () => { >+ indentEditor.addEventListener(WI.SettingEditor.Event.ValueDidChange, function(event) { > WI.settings.indentWithTabs.value = indentEditor.value === indentValues[0]; >- }); >+ }, WI); > > function addSpacesSetting(title, setting) { > let editor = generalSettingsView.addSetting(title, setting, WI.UIString("spaces"), {min: 1}); >@@ -192,9 +192,9 @@ WI.SettingsTabContentView = class SettingsTabContentView extends WI.TabContentVi > function updateLabel() { > editor.label = setting.value === 1 ? WI.UIString("space") : WI.UIString("spaces"); > } >- setting.addEventListener(WI.Setting.Event.Changed, (event) => { >+ setting.addEventListener(WI.Setting.Event.Changed, function(event) { > updateLabel(); >- }); >+ }, editor); > updateLabel(); > } > addSpacesSetting(WI.UIString("Tab width:"), WI.settings.tabSize); >@@ -219,8 +219,12 @@ WI.SettingsTabContentView = class SettingsTabContentView extends WI.TabContentVi > > let zoomEditor = generalSettingsView.addGroupWithCustomSetting(WI.UIString("Zoom:"), WI.SettingEditor.Type.Select, {values: zoomValues}); > zoomEditor.value = WI.getZoomFactor(); >- zoomEditor.addEventListener(WI.SettingEditor.Event.ValueDidChange, () => { WI.setZoomFactor(zoomEditor.value); }); >- WI.settings.zoomFactor.addEventListener(WI.Setting.Event.Changed, () => { zoomEditor.value = WI.getZoomFactor().maxDecimals(2); }); >+ zoomEditor.addEventListener(WI.SettingEditor.Event.ValueDidChange, function(event) { >+ WI.setZoomFactor(zoomEditor.value); >+ }, WI); >+ WI.settings.zoomFactor.addEventListener(WI.Setting.Event.Changed, function(event) { >+ zoomEditor.value = WI.getZoomFactor().maxDecimals(2); >+ }, zoomEditor); > > this.addSettingsView(generalSettingsView); > } >@@ -280,10 +284,10 @@ WI.SettingsTabContentView = class SettingsTabContentView extends WI.TabContentVi > for (let channel of channels) { > let logEditor = consoleSettingsView.addGroupWithCustomSetting(editorLabels[channel.source], WI.SettingEditor.Type.Select, {values: logLevels}); > logEditor.value = channel.level; >- logEditor.addEventListener(WI.SettingEditor.Event.ValueDidChange, () => { >+ logEditor.addEventListener(WI.SettingEditor.Event.ValueDidChange, function(event) { > for (let target of WI.targets) > target.ConsoleAgent.setLoggingChannelLevel(channel.source, logEditor.value); >- }); >+ }, WI); > } > } > >@@ -329,9 +333,9 @@ WI.SettingsTabContentView = class SettingsTabContentView extends WI.TabContentVi > > function listenForChange(setting) { > initialValues.set(setting, setting.value); >- setting.addEventListener(WI.Setting.Event.Changed, () => { >+ setting.addEventListener(WI.Setting.Event.Changed, function(event) { > reloadInspectorContainerElement.classList.toggle("hidden", Array.from(initialValues).every(([setting, initialValue]) => setting.value === initialValue)); >- }); >+ }, reloadInspectorContainerElement); > } > > listenForChange(WI.settings.experimentalEnableSourcesTab); >@@ -354,9 +358,9 @@ WI.SettingsTabContentView = class SettingsTabContentView extends WI.TabContentVi > let protocolMessagesGroup = this._debugSettingsView.addGroup(WI.unlocalizedString("Protocol Logging:")); > > let autoLogProtocolMessagesEditor = protocolMessagesGroup.addSetting(WI.settings.autoLogProtocolMessages, WI.unlocalizedString("Messages")); >- WI.settings.autoLogProtocolMessages.addEventListener(WI.Setting.Event.Changed, () => { >+ WI.settings.autoLogProtocolMessages.addEventListener(WI.Setting.Event.Changed, function(event) { > autoLogProtocolMessagesEditor.value = InspectorBackend.dumpInspectorProtocolMessages; >- }); >+ }, autoLogProtocolMessagesEditor); > > protocolMessagesGroup.addSetting(WI.settings.autoLogTimeStats, WI.unlocalizedString("Time Stats")); > >@@ -388,7 +392,9 @@ WI.SettingsTabContentView = class SettingsTabContentView extends WI.TabContentVi > > let layoutDirectionEditor = this._debugSettingsView.addGroupWithCustomSetting(WI.unlocalizedString("Layout Direction:"), WI.SettingEditor.Type.Select, {values: layoutDirectionValues}); > layoutDirectionEditor.value = WI.settings.layoutDirection.value; >- layoutDirectionEditor.addEventListener(WI.SettingEditor.Event.ValueDidChange, () => { WI.setLayoutDirection(layoutDirectionEditor.value); }); >+ layoutDirectionEditor.addEventListener(WI.SettingEditor.Event.ValueDidChange, function(event) { >+ WI.setLayoutDirection(layoutDirectionEditor.value); >+ }, WI); > > let resetInspectorButton = document.createElement("button"); > resetInspectorButton.textContent = WI.unlocalizedString("Reset Web Inspector"); >diff --git a/Source/WebInspectorUI/UserInterface/Views/ShaderProgramContentView.js b/Source/WebInspectorUI/UserInterface/Views/ShaderProgramContentView.js >index dd9254ed5be..a0d2319f088 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/ShaderProgramContentView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/ShaderProgramContentView.js >@@ -42,9 +42,9 @@ WI.ShaderProgramContentView = class ShaderProgramContentView extends WI.ContentV > textEditor.readOnly = false; > textEditor.addEventListener(WI.TextEditor.Event.Focused, this._editorFocused, this); > textEditor.addEventListener(WI.TextEditor.Event.NumberOfSearchResultsDidChange, this._numberOfSearchResultsDidChange, this); >- textEditor.addEventListener(WI.TextEditor.Event.ContentDidChange, (event) => { >+ textEditor.addEventListener(WI.TextEditor.Event.ContentDidChange, function(event) { > contentDidChangeDebouncer.delayForTime(250, event); >- }, this); >+ }, contentDidChangeDebouncer); > textEditor.element.classList.add("shader"); > > let shaderTypeContainer = textEditor.element.insertAdjacentElement("afterbegin", document.createElement("div")); >diff --git a/Source/WebInspectorUI/UserInterface/Views/SourcesNavigationSidebarPanel.js b/Source/WebInspectorUI/UserInterface/Views/SourcesNavigationSidebarPanel.js >index 1bd1dc6bc6e..ac8ded0d458 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/SourcesNavigationSidebarPanel.js >+++ b/Source/WebInspectorUI/UserInterface/Views/SourcesNavigationSidebarPanel.js >@@ -296,7 +296,7 @@ WI.SourcesNavigationSidebarPanel = class SourcesNavigationSidebarPanel extends W > > if (WI.SourcesNavigationSidebarPanel.shouldPlaceResourcesAtTopLevel()) { > this._resourcesTreeOutline.disclosureButtons = false; >- WI.SourceCode.addEventListener(WI.SourceCode.Event.SourceMapAdded, () => { >+ WI.SourceCode.addEventListener(WI.SourceCode.Event.SourceMapAdded, function(event) { > this._resourcesTreeOutline.disclosureButtons = true; > }, this); > } >@@ -476,9 +476,9 @@ WI.SourcesNavigationSidebarPanel = class SourcesNavigationSidebarPanel extends W > > createContentTreeOutline(options = {}) > { >- let treeOutline = super.createContentTreeOutline(options) >+ let treeOutline = super.createContentTreeOutline(options); > >- treeOutline.addEventListener(WI.TreeOutline.Event.ElementRevealed, (event) => { >+ treeOutline.addEventListener(WI.TreeOutline.Event.ElementRevealed, function(event) { > let treeElement = event.data.element; > let detailsSections = [this._pauseReasonSection, this._callStackSection, this._breakpointsSection]; > let detailsSection = detailsSections.find((detailsSection) => detailsSection.element.contains(treeElement.listItemElement)); >@@ -492,7 +492,7 @@ WI.SourcesNavigationSidebarPanel = class SourcesNavigationSidebarPanel extends W > let offset = detailsSection.headerElement.totalOffsetBottom - treeElement.listItemElement.totalOffsetTop; > if (offset > 0) > this.scrollElement.scrollBy(0, -offset); >- }); >+ }, this); > > return treeOutline; > } >diff --git a/Source/WebInspectorUI/UserInterface/Views/SpreadsheetCSSStyleDeclarationSection.js b/Source/WebInspectorUI/UserInterface/Views/SpreadsheetCSSStyleDeclarationSection.js >index fecbe60c23f..9ae0954b98a 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/SpreadsheetCSSStyleDeclarationSection.js >+++ b/Source/WebInspectorUI/UserInterface/Views/SpreadsheetCSSStyleDeclarationSection.js >@@ -81,12 +81,12 @@ WI.SpreadsheetCSSStyleDeclarationSection = class SpreadsheetCSSStyleDeclarationS > > if (this._style.selectorEditable) { > this._selectorTextField = new WI.SpreadsheetSelectorField(this, this._selectorElement); >- this._selectorTextField.addEventListener(WI.SpreadsheetSelectorField.Event.StartedEditing, (event) => { >+ this._selectorTextField.addEventListener(WI.SpreadsheetSelectorField.Event.StartedEditing, function(event) { > this._headerElement.classList.add("editing-selector"); >- }); >- this._selectorTextField.addEventListener(WI.SpreadsheetSelectorField.Event.StoppedEditing, (event) => { >+ }, this); >+ this._selectorTextField.addEventListener(WI.SpreadsheetSelectorField.Event.StoppedEditing, function(event) { > this._headerElement.classList.remove("editing-selector"); >- }); >+ }, this); > > this._selectorElement.tabIndex = 0; > } >diff --git a/Source/WebInspectorUI/UserInterface/Views/SpreadsheetStyleProperty.js b/Source/WebInspectorUI/UserInterface/Views/SpreadsheetStyleProperty.js >index 6cbc629b264..227b3327830 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/SpreadsheetStyleProperty.js >+++ b/Source/WebInspectorUI/UserInterface/Views/SpreadsheetStyleProperty.js >@@ -511,7 +511,7 @@ WI.SpreadsheetStyleProperty = class SpreadsheetStyleProperty extends WI.Object > let readOnly = !this._isEditable(); > let swatch = new WI.InlineSwatch(type, valueObject, readOnly); > >- swatch.addEventListener(WI.InlineSwatch.Event.ValueChanged, (event) => { >+ swatch.addEventListener(WI.InlineSwatch.Event.ValueChanged, function(event) { > let value = event.data.value && event.data.value.toString(); > if (!value) > return; >@@ -524,15 +524,15 @@ WI.SpreadsheetStyleProperty = class SpreadsheetStyleProperty extends WI.Object > }, this); > > if (this._delegate && typeof this._delegate.stylePropertyInlineSwatchActivated === "function") { >- swatch.addEventListener(WI.InlineSwatch.Event.Activated, () => { >+ swatch.addEventListener(WI.InlineSwatch.Event.Activated, function(event) { > this._delegate.stylePropertyInlineSwatchActivated(); >- }); >+ }, this); > } > > if (this._delegate && typeof this._delegate.stylePropertyInlineSwatchDeactivated === "function") { >- swatch.addEventListener(WI.InlineSwatch.Event.Deactivated, () => { >+ swatch.addEventListener(WI.InlineSwatch.Event.Deactivated, function(event) { > this._delegate.stylePropertyInlineSwatchDeactivated(); >- }); >+ }, this); > } > > tokenElement.append(swatch.element, innerElement); >diff --git a/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.js b/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.js >index e81e97ed74b..7a1dc1fb084 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.js >+++ b/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.js >@@ -141,7 +141,9 @@ WI.ThreadTreeElement = class ThreadTreeElement extends WI.GeneralTreeElement > if (!this._statusButton) { > let tooltip = WI.UIString("Resume Thread"); > this._statusButton = new WI.TreeElementStatusButton(WI.ImageUtilities.useSVGSymbol("Images/Resume.svg", "resume", tooltip)); >- this._statusButton.addEventListener(WI.TreeElementStatusButton.Event.Clicked, () => { WI.debuggerManager.continueUntilNextRunLoop(this._target); }); >+ this._statusButton.addEventListener(WI.TreeElementStatusButton.Event.Clicked, function(event) { >+ WI.debuggerManager.continueUntilNextRunLoop(this._target); >+ }, this); > this._statusButton.element.addEventListener("mousedown", (event) => { > // Prevent tree element from being selected. > event.stopPropagation(); >diff --git a/Source/WebInspectorUI/UserInterface/Views/TimelineTreeElement.js b/Source/WebInspectorUI/UserInterface/Views/TimelineTreeElement.js >index 94a07133218..b93d4992532 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/TimelineTreeElement.js >+++ b/Source/WebInspectorUI/UserInterface/Views/TimelineTreeElement.js >@@ -76,8 +76,9 @@ WI.TimelineTreeElement = class TimelineTreeElement extends WI.GeneralTreeElement > { > let tooltip = WI.UIString("Close %s timeline view").format(this.mainTitle); > let button = new WI.TreeElementStatusButton(WI.ImageUtilities.useSVGSymbol("Images/CloseLarge.svg", "close-button", tooltip)); >- button.addEventListener(WI.TreeElementStatusButton.Event.Clicked, () => { this.deselect(); }); >- >+ button.addEventListener(WI.TreeElementStatusButton.Event.Clicked, function(event) { >+ this.deselect(); >+ }, this); > this.status = button.element; > } > >@@ -86,10 +87,9 @@ WI.TimelineTreeElement = class TimelineTreeElement extends WI.GeneralTreeElement > let checkboxElement = document.createElement("input"); > checkboxElement.type = "checkbox"; > checkboxElement.checked = !this._placeholder; >- >- let button = new WI.TreeElementStatusButton(checkboxElement); >- checkboxElement.addEventListener("change", () => { this._dispatchEnabledDidChangeEvent(); }); >- >+ checkboxElement.addEventListener("change", (event) => { >+ this._dispatchEnabledDidChangeEvent(); >+ }); > this.status = checkboxElement; > } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 196956
:
367502
|
367517
|
367523
|
367527
|
367568
|
372431
|
372436
|
372441
|
372477
|
372530
|
376656
|
376661
|
376662
|
411024
|
411030
|
413134
|
413142
|
413341