+2020-11-04 Devin Rousso <drousso@apple.com>
+
+ Web Inspector: use weak collections for holding event listeners
+ https://bugs.webkit.org/show_bug.cgi?id=196956
+
+ Reviewed by Brian Burg.
+
+ * http/tests/inspector/dom/disconnect-dom-tree-after-main-frame-navigation.html:
+ Use newly named `WI.Object.prototype.activelyListeningObjectsWithPrototype` instead of the
+ previously named `WI.Object.prototype.retainedObjectsWithPrototype` since `WI.Object`
+ doesn't retain any `thisObject` anymore.
+
+ * inspector/debugger/setPauseOnMicrotasks.html:
+ Only remove the event listener if it didn't fire.
+
+ * inspector/dom/setEventListenerDisabled.html:
+ No need to remove the event listener as calling `reject` after a `Promise` is already
+ settled won't have any effect.
+
+ * inspector/unit-tests/event-listener.html: Removed.
+ * inspector/unit-tests/event-listener-expected.txt: Removed.
+ * inspector/unit-tests/event-listener-set.html: Removed.
+ * inspector/unit-tests/event-listener-set-expected.txt: Removed.
+ Remove the legacy `WI.EventListener` and `WI.EventListenerSet` as they basically do the same
+ thing as `WI.Object` with extra steps.
+
+ * inspector/unit-tests/linked-list.html: Removed.
+ * inspector/unit-tests/linked-list-expected.txt: Removed.
+ * inspector/unit-tests/list-multimap.html: Removed.
+ * inspector/unit-tests/list-multimap-expected.txt: Removed.
+ Remove `LinkedList` and `ListMultimap` as they're no longer used.
+
+ * platform/gtk/TestExpectations:
+
2020-11-04 Diego Pino Garcia <dpino@igalia.com>
[GTK] Unreviewed test gardening. Remove text flaky failures of tests that are actually passing.
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();
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);
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);
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);
})
InspectorTest.evaluateInPage(expression, () => {
InspectorTest.expectThat(!didPause, "Should not have paused.");
- WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);
+ if (!didPause)
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);
WI.debuggerManager.allMicrotasksBreakpoint.remove();
InspectorTest.assert(!WI.debuggerManager.allMicrotasksBreakpoint, "Should have destroyed all microtasks breakpoint.");
InspectorTest.evaluateInPage(expression, () => {
InspectorTest.expectThat(didPause, "Should have paused.");
- WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);
+ if (!didPause)
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);
WI.debuggerManager.allMicrotasksBreakpoint.remove();
InspectorTest.assert(!WI.debuggerManager.allMicrotasksBreakpoint, "Should have destroyed all microtasks breakpoint.");
suite.addTestCase({
name: "DOM.setEventListenerDisabled.DisabledClickEvent",
test(resolve, reject) {
- let listener = InspectorTest.singleFireEventListener("TestPageDocumentClicked", () => {
+ InspectorTest.singleFireEventListener("TestPageDocumentClicked", () => {
reject("Click event listener should not be called");
});
InspectorTest.singleFireEventListener("TestPageAfterClick", () => {
InspectorTest.pass("Click event listener did not fire.");
- InspectorTest.removeEventListener(listener);
-
logListener().then(resolve, reject);
});
+++ /dev/null
-Testing basic functionality of WI.EventListener.
-
-Connecting the listener.
-Invoked callback for kaboom event.
-Invoked callback for kaboom event.
-Disconnecting the listener.
-Connecting the listener.
-Invoked callback for kaboom event.
-Disconnecting the listener.
-Connecting the listener.
-Disconnecting the listener.
-Connecting the single-fire listener.
-Invoked callback for kaboom event.
-Disconnecting the single-fire listener.
-Invoked callback for kaboom event.
-
+++ /dev/null
-Testing basic functionality of WI.EventListenerSet.
-
-Registering listeners.
-Installing listeners.
-Dispatching events.
-Invoked callback for foo event.
-Invoked callback for bar event.
-Invoked callback for baz event.
-Uninstalling and disconnecting listeners.
-Registering listeners.
-Dispatching events.
-Invoked callback for foo event.
-Invoked callback for bar event.
-Invoked callback for baz event.
-Uninstalling listeners.
-Installing listeners.
-Dispatching events.
-Invoked callback for foo event.
-Invoked callback for bar event.
-Invoked callback for baz event.
-Unregistering everything.
-Dispatching events.
-Uninstalling and disconnecting listeners.
-Dispatching events.
-
+++ /dev/null
-<!doctype html>
-<html>
-<head>
-<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
-<script>
-function test()
-{
- const FooEvent = "foo";
- const BarEvent = "bar";
- const BazEvent = "baz";
- var emitter1 = new WI.Object();
- var emitter2 = new WI.Object();
- var context1 = new WI.Object();
- var context2 = new WI.Object();
- var data1 = [1, 2, 3];
- var data2 = [4, 6, 8];
-
- function fooCallback(event)
- {
- InspectorTest.assert(this === context1, "Callback invoked with wrong |this| binding.");
- InspectorTest.assert(event.target === emitter1, "Callback invoked with wrong event emitter.");
- InspectorTest.assert(event.data === data1, "Callback invoked with wrong event data.");
-
- InspectorTest.log("Invoked callback for foo event.");
- }
-
- function barCallback(event)
- {
- InspectorTest.assert(this === context1, "Callback invoked with wrong |this| binding.");
- InspectorTest.assert(event.target === emitter1, "Callback invoked with wrong event emitter.");
- InspectorTest.assert(event.data === data2, "Callback invoked with wrong event data.");
-
- InspectorTest.log("Invoked callback for bar event.");
- }
-
- function bazCallback(event)
- {
- InspectorTest.assert(this === context2, "Callback invoked with wrong |this| binding.");
- InspectorTest.assert(event.target === emitter2, "Callback invoked with wrong event emitter.");
- InspectorTest.assert(event.data === data2, "Callback invoked with wrong event data.");
-
- InspectorTest.log("Invoked callback for baz event.");
- }
-
- // Test for multiple firings of listeners in the set.
-
- var listenerSet = new WI.EventListenerSet(context1);
- InspectorTest.assert(!emitter1.hasEventListeners(FooEvent), "Emitter should not have any listeners.");
- emitter1.dispatchEventToListeners(FooEvent, data1); // Should not fire anything.
-
- InspectorTest.log("Registering listeners.");
- listenerSet.register(emitter1, FooEvent, fooCallback);
- listenerSet.register(emitter1, BarEvent, barCallback);
- listenerSet.register(emitter2, BazEvent, bazCallback, context2);
- InspectorTest.assert(!emitter1.hasEventListeners(FooEvent), "Emitter should not have a listener.");
- InspectorTest.assert(!emitter1.hasEventListeners(BarEvent), "Emitter should not have a listener.");
- InspectorTest.assert(!emitter2.hasEventListeners(BazEvent), "Emitter should not have a listener.");
-
- InspectorTest.log("Installing listeners.");
- listenerSet.install();
- InspectorTest.assert(emitter1.hasEventListeners(FooEvent), "Emitter should have a listener.");
- InspectorTest.assert(emitter1.hasEventListeners(BarEvent), "Emitter should have a listener.");
- InspectorTest.assert(emitter2.hasEventListeners(BazEvent), "Emitter should have a listener.");
-
- InspectorTest.log("Dispatching events.");
- emitter1.dispatchEventToListeners(FooEvent, data1); // Should fire.
- emitter1.dispatchEventToListeners(BarEvent, data2); // Should fire.
- emitter2.dispatchEventToListeners(BazEvent, data2); // Should fire.
- InspectorTest.log("Uninstalling and disconnecting listeners.");
- listenerSet.uninstall(true);
-
- InspectorTest.log("Registering listeners.");
- listenerSet.register(emitter1, FooEvent, fooCallback);
- listenerSet.register(emitter1, BarEvent, barCallback);
- listenerSet.register(emitter2, BazEvent, bazCallback, context2);
-
- listenerSet.install();
- InspectorTest.log("Dispatching events.");
- emitter1.dispatchEventToListeners(FooEvent, data1); // Should fire.
- emitter1.dispatchEventToListeners(BarEvent, data2); // Should fire.
- emitter2.dispatchEventToListeners(BazEvent, data2); // Should fire.
- InspectorTest.log("Uninstalling listeners.");
- listenerSet.uninstall();
-
- InspectorTest.log("Installing listeners.");
- listenerSet.install();
- InspectorTest.log("Dispatching events.");
- emitter1.dispatchEventToListeners(FooEvent, data1); // Should fire.
- emitter1.dispatchEventToListeners(BarEvent, data2); // Should fire.
- emitter2.dispatchEventToListeners(BazEvent, data2); // Should fire.
-
- InspectorTest.log("Unregistering everything.");
- listenerSet.unregister();
- InspectorTest.log("Dispatching events.");
- emitter1.dispatchEventToListeners(FooEvent, data1); // Should not fire.
- emitter1.dispatchEventToListeners(BarEvent, data2); // Should not fire.
- emitter2.dispatchEventToListeners(BazEvent, data2); // Should not fire.
-
- InspectorTest.log("Uninstalling and disconnecting listeners.");
- listenerSet.uninstall(true);
- InspectorTest.log("Dispatching events.");
- emitter1.dispatchEventToListeners(FooEvent, data1); // Should not fire.
- emitter1.dispatchEventToListeners(BarEvent, data2); // Should not fire.
- emitter2.dispatchEventToListeners(BazEvent, data2); // Should not fire.
-
- InspectorTest.assert(!emitter1.hasEventListeners(FooEvent), "Emitter should not have a listener.");
- InspectorTest.assert(!emitter1.hasEventListeners(BarEvent), "Emitter should not have a listener.");
- InspectorTest.assert(!emitter2.hasEventListeners(BazEvent), "Emitter should not have a listener.");
-
- InspectorTest.completeTest();
-}
-</script>
-</head>
-<body onload="runTest()">
- <p>Testing basic functionality of WI.EventListenerSet.</p>
-</body>
-</html>
+++ /dev/null
-<!doctype html>
-<html>
-<head>
-<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
-<script>
-function test()
-{
- const KaboomEvent = "kaboom";
- var emitter = new WI.Object();
- var context = new WI.Object();
- var data = [1, 2, 3];
-
- function kaboomCallback(event) {
- InspectorTest.assert(this === context, "Callback invoked with wrong |this| binding.");
- InspectorTest.assert(event.target === emitter, "Callback invoked with wrong event emitter.");
- InspectorTest.assert(event.data === data, "Callback invoked with wrong event data.");
-
- InspectorTest.log("Invoked callback for kaboom event.");
- }
-
- // Test for multiple firings of the listener.
-
- var listener = new WI.EventListener(context);
- InspectorTest.assert(!emitter.hasEventListeners(KaboomEvent), "Emitter should not have any listeners.");
- emitter.dispatchEventToListeners(KaboomEvent, data); // Should not fire anything.
-
- InspectorTest.log("Connecting the listener.");
- listener.connect(emitter, KaboomEvent, kaboomCallback);
- InspectorTest.assert(emitter.hasEventListeners(KaboomEvent), "Emitter should have a listener.");
- emitter.dispatchEventToListeners(KaboomEvent, data); // Should fire.
- emitter.dispatchEventToListeners(KaboomEvent, data); // Should fire.
- InspectorTest.log("Disconnecting the listener.");
- listener.disconnect();
-
- emitter.dispatchEventToListeners(KaboomEvent, data); // Should not fire anything.
- InspectorTest.assert(!emitter.hasEventListeners(KaboomEvent), "Emitter should not have any listeners.");
-
- // Test reconnection.
-
- InspectorTest.log("Connecting the listener.");
- listener.connect(emitter, KaboomEvent, kaboomCallback);
- emitter.dispatchEventToListeners(KaboomEvent, data); // Should fire.
- InspectorTest.log("Disconnecting the listener.");
- listener.disconnect();
-
- // Test unused listener.
-
- InspectorTest.log("Connecting the listener.");
- listener.connect(emitter, KaboomEvent, kaboomCallback);
- InspectorTest.log("Disconnecting the listener.");
- listener.disconnect();
-
- // Test for single firing of the listener.
-
- var singleListener = new WI.EventListener(context, true);
- InspectorTest.assert(!emitter.hasEventListeners(KaboomEvent), "Emitter should not have any listeners.");
- emitter.dispatchEventToListeners(KaboomEvent, data); // Should not fire anything.
-
- InspectorTest.log("Connecting the single-fire listener.");
- singleListener.connect(emitter, KaboomEvent, kaboomCallback);
- InspectorTest.assert(emitter.hasEventListeners(KaboomEvent), "Emitter should have a listener.");
- emitter.dispatchEventToListeners(KaboomEvent, data); // Should fire.
- InspectorTest.assert(!emitter.hasEventListeners(KaboomEvent), "Emitter should not have any listeners.");
- emitter.dispatchEventToListeners(KaboomEvent, data); // Should not fire.
- InspectorTest.log("Disconnecting the single-fire listener.");
- singleListener.disconnect(); // Should cause an error.
- emitter.dispatchEventToListeners(KaboomEvent, data); // Should not fire.
-
- // Test for various error cases and abuse.
-
- var badListener = new WI.EventListener(context);
- badListener.connect(data, data, data); // Should complain about non-callable callback.
- badListener.connect(null, KaboomEvent, kaboomCallback); // Should complain about non-callable callback.
- badListener.connect(emitter, KaboomEvent, null); // Should complain about non-callable callback.
- badListener.connect(emitter, null, kaboomCallback); // Should complain about null event.
-
- var badListener2 = new WI.EventListener(context);
- badListener2.disconnect(); // Should complain about already disconnected.
- badListener2.connect(emitter, KaboomEvent, kaboomCallback);
- badListener2.connect(emitter, KaboomEvent, kaboomCallback); // Should complain about already connected.
- emitter.dispatchEventToListeners(KaboomEvent, data); // Should fire.
- badListener2.connect(emitter, KaboomEvent, kaboomCallback); // Should complain about already connected.
- badListener2.disconnect();
- badListener2.disconnect(); // Should complain about already disconnected.
-
- InspectorTest.completeTest();
-}
-</script>
-</head>
-<body onload="runTest()">
- <p>Testing basic functionality of WI.EventListener.</p>
-</body>
-</html>
+++ /dev/null
-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"]
-
+++ /dev/null
-<!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>
+++ /dev/null
-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"]]
-
+++ /dev/null
-<!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>
webkit.org/b/149916 inspector/protocol/inspector-backend-invocation-return-value.html [ Pass Slow ]
webkit.org/b/149916 inspector/runtime/parse.html [ Pass Timeout ]
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 ]
webkit.org/b/149916 inspector/animation/lifecycle-web-animation.html [ Pass Slow ]
"InspectorFrontendHost": true,
"InspectorProtocol": true,
"InspectorTest": true,
- "LinkedList": true,
- "ListMultimap": true,
"Multimap": true,
"ProtocolTest": true,
"ProtocolTestHarness": true,
+2020-11-04 Devin Rousso <drousso@apple.com>
+
+ Web Inspector: use weak collections for holding event listeners
+ https://bugs.webkit.org/show_bug.cgi?id=196956
+
+ Reviewed by Brian Burg.
+
+ Replace the `ListMultimap`/`LinkedList` with a `Multimap` for holding listener data:
+ ```
+ Map<String eventType, Set<{Function listener, WeakRef thisObject}>> _listeners;
+ ```
+ This preserves addition order while also not strongly holding any `thisObject` so they can
+ be GCed (and remove the `listener` along with it).
+
+ * UserInterface/Base/Object.js:
+ (WI.Object.addEventListener):
+ (WI.Object.singleFireEventListener):
+ (WI.Object.awaitEvent):
+ (WI.Object.removeEventListener):
+ (WI.Object.prototype.singleFireEventListener):
+ (WI.Object.prototype.removeEventListener):
+ (WI.Object.prototype.dispatchEventToListeners.dispatch):
+ (WI.Object.hasEventListeners):
+ (WI.Object.activelyListeningObjectsWithPrototype): Added.
+ (WI.Object.prototype.activelyListeningObjectsWithPrototype): Added.
+
+ * UserInterface/Base/SearchUtilities.js:
+ (WI.SearchUtilities.createSettings):
+ (WI.SearchUtilities.createSettingsButton):
+ * UserInterface/Base/Main.js:
+ (WI.loaded):
+ (WI.contentLoaded):
+ * UserInterface/Models/Resource.js:
+ (WI.Resource.prototype.requestContent):
+ * UserInterface/Controllers/RuntimeManager.js:
+ (WI.RuntimeManager):
+ * UserInterface/Views/AuditTestCaseContentView.js:
+ (WI.AuditTestCaseContentView.prototype.showRunningPlaceholder):
+ * UserInterface/Views/AuditTestContentView.js:
+ (WI.AuditTestContentView.prototype.showNoResultPlaceholder):
+ * UserInterface/Views/AuditTestGroupContentView.js:
+ (WI.AuditTestGroupContentView.prototype.showRunningPlaceholder):
+ * UserInterface/Views/CodeMirrorEditor.js:
+ (WI.CodeMirrorEditor.create):
+ * UserInterface/Debug/Bootstrap.js:
+ (WI.runBootstrapOperations):
+ * UserInterface/Views/ConsoleDrawer.js:
+ (WI.ConsoleDrawer):
+ * UserInterface/Views/ConsoleMessageView.js:
+ (WI.ConsoleMessageView.prototype.clearSessionState):
+ (WI.ConsoleMessageView.prototype._appendSavedResultIndex):
+ (WI.ConsoleMessageView.prototype._rootPropertyPathForObject):
+ * UserInterface/Views/ContentBrowser.js:
+ (WI.ContentBrowser):
+ (WI.ContentBrowser.prototype.async handleFindNextShortcut):
+ (WI.ContentBrowser.prototype.async handleFindPreviousShortcut):
+ * UserInterface/Views/HeapSnapshotContentView.js:
+ (WI.HeapSnapshotContentView):
+ * UserInterface/Views/LogContentView.js:
+ (WI.LogContentView):
+ * UserInterface/Views/MediaTimelineOverviewGraph.js:
+ (WI.MediaTimelineOverviewGraph.prototype._processRecord):
+ * UserInterface/Views/NetworkDetailView.js:
+ (WI.NetworkDetailView.prototype.initialLayout):
+ * UserInterface/Views/ObjectTreeView.js:
+ (WI.ObjectTreeView.prototype.addShowMoreIfNeeded):
+ * UserInterface/Views/SearchSidebarPanel.js:
+ (WI.SearchSidebarPanel):
+ (WI.SearchSidebarPanel.prototype.closed):
+ (WI.SearchSidebarPanel.prototype.performSearch):
+ * UserInterface/Views/SettingEditor.js:
+ (WI.SettingEditor.createForSetting):
+ * UserInterface/Views/SettingsTabContentView.js:
+ (WI.SettingsTabContentView.prototype._createGeneralSettingsView):
+ (WI.SettingsTabContentView.prototype._createConsoleSettingsView):
+ (WI.SettingsTabContentView.prototype._createExperimentalSettingsView.listenForChange):
+ (WI.SettingsTabContentView.prototype._createExperimentalSettingsView):
+ (WI.SettingsTabContentView.prototype._createDebugSettingsView):
+ * UserInterface/Views/ShaderProgramContentView.js:
+ (WI.ShaderProgramContentView):
+ * UserInterface/Views/SourcesNavigationSidebarPanel.js:
+ (WI.SourcesNavigationSidebarPanel):
+ (WI.SourcesNavigationSidebarPanel.prototype.closed):
+ (WI.SourcesNavigationSidebarPanel.prototype.createContentTreeOutline):
+ * UserInterface/Views/SpreadsheetCSSStyleDeclarationSection.js:
+ (WI.SpreadsheetCSSStyleDeclarationSection.prototype.initialLayout):
+ * UserInterface/Views/SpreadsheetStyleProperty.js:
+ (WI.SpreadsheetStyleProperty.prototype._createInlineSwatch):
+ * UserInterface/Views/ThreadTreeElement.js:
+ (WI.ThreadTreeElement.prototype._updateStatus):
+ * UserInterface/Views/TimelineTreeElement.js:
+ (WI.TimelineTreeElement.prototype._showCloseButton):
+ Update callers of `WI.Object.prototype.addEventListener` to always pass a `thisObject`. This
+ is especially important for inlined `listener`, as there needs to be a strong reference to
+ some "longer lived" `thisObject` (which is held by a `WeakRef`) in order for the `listener`
+ to not be GCed.
+
+ * UserInterface/Models/DOMNodeStyles.js:
+ (WI.DOMNodeStyles):
+ (WI.DOMNodeStyles.prototype._parseStyleDeclarationPayload):
+ (WI.DOMNodeStyles.prototype._parseRulePayload):
+ (WI.DOMNodeStyles.prototype._handleCSSStyleSheetContentDidChange): Added.
+ (WI.DOMNodeStyles.prototype._styleSheetContentDidChange): Deleted.
+ * UserInterface/Views/TimelineRecordingProgressView.js:
+ (WI.TimelineRecordingProgressView):
+ (WI.TimelineRecordingProgressView.prototype.set visible):
+ (WI.TimelineRecordingProgressView.prototype._updateState):
+ Use a global event listener instead of adding event listeners to specific objects as it's
+ already likely that all the objects would be listened to anyways.
+
+ * UserInterface/Models/DOMTree.js:
+ (WI.DOMTree.prototype.disconnect):
+ * UserInterface/Controllers/ApplicationCacheManager.js:
+ (WI.ApplicationCacheManager.prototype.disable):
+ * UserInterface/Controllers/CallFrameTreeController.js:
+ (WI.CallFrameTreeController.prototype.disconnect):
+ * UserInterface/Controllers/DOMStorageManager.js:
+ (WI.DOMStorageManager.prototype.disable):
+ * UserInterface/Controllers/DatabaseManager.js:
+ (WI.DatabaseManager.prototype.disable):
+ * UserInterface/Controllers/IndexedDBManager.js:
+ (WI.IndexedDBManager.prototype.disable):
+ * UserInterface/Controllers/TimelineManager.js:
+ (WI.TimelineManager.prototype.capturingStopped):
+ * UserInterface/Views/ApplicationCacheDetailsSidebarPanel.js:
+ (WI.ApplicationCacheDetailsSidebarPanel.prototype.closed):
+ * UserInterface/Views/ApplicationCacheFrameContentView.js:
+ (WI.ApplicationCacheFrameContentView.prototype.closed):
+ * UserInterface/Views/AuditNavigationSidebarPanel.js:
+ (WI.AuditNavigationSidebarPanel.prototype.closed):
+ * UserInterface/Views/AuditTreeElement.js:
+ (WI.AuditTreeElement.prototype.ondetach):
+ * UserInterface/Views/CPUTimelineView.js:
+ (WI.CPUTimelineView.prototype.closed):
+ * UserInterface/Views/CanvasContentView.js:
+ (WI.CanvasContentView.prototype.detached):
+ * UserInterface/Views/CanvasOverviewContentView.js:
+ (WI.CanvasOverviewContentView.prototype.detached):
+ * UserInterface/Views/CanvasSidebarPanel.js:
+ (WI.CanvasSidebarPanel.prototype.set canvas):
+ (WI.CanvasSidebarPanel.prototype.set recording):
+ (WI.CanvasSidebarPanel.prototype.hidden):
+ * UserInterface/Views/ClusterContentView.js:
+ (WI.ClusterContentView.prototype.closed):
+ * UserInterface/Views/CollectionContentView.js:
+ (WI.CollectionContentView.prototype.removeContentViewForItem):
+ (WI.CollectionContentView.prototype.detached):
+ * UserInterface/Views/ContentBrowserTabContentView.js:
+ (WI.ContentBrowserTabContentView.prototype.hidden):
+ (WI.ContentBrowserTabContentView.prototype.closed):
+ * UserInterface/Views/DOMNodeDetailsSidebarPanel.js:
+ (WI.DOMNodeDetailsSidebarPanel.prototype.closed):
+ * UserInterface/Views/DOMTreeContentView.js:
+ (WI.DOMTreeContentView.prototype.closed):
+ * UserInterface/Views/DOMTreeUpdater.js:
+ (WI.DOMTreeUpdater.prototype.close):
+ * UserInterface/Views/ElementsTabContentView.js:
+ (WI.ElementsTabContentView.prototype.closed):
+ * UserInterface/Views/FrameDOMTreeContentView.js:
+ (WI.FrameDOMTreeContentView.prototype.closed):
+ * UserInterface/Views/GeneralStyleDetailsSidebarPanel.js:
+ (WI.GeneralStyleDetailsSidebarPanel.prototype.removeEventListeners):
+ * UserInterface/Views/HeapAllocationsTimelineView.js:
+ (WI.HeapAllocationsTimelineView):
+ (WI.HeapAllocationsTimelineView.prototype.closed):
+ * UserInterface/Views/ImageResourceContentView.js:
+ (WI.ImageResourceContentView.prototype.closed): Deleted.
+ * UserInterface/Views/InlineSwatch.js:
+ (WI.InlineSwatch.prototype.didDismissPopover):
+ * UserInterface/Views/LayoutTimelineView.js:
+ (WI.LayoutTimelineView.prototype.closed):
+ * UserInterface/Views/LocalResourceOverrideWarningView.js:
+ (WI.LocalResourceOverrideWarningView.prototype.detached):
+ * UserInterface/Views/MemoryTimelineView.js:
+ (WI.MemoryTimelineView.prototype.closed):
+ * UserInterface/Views/MultipleScopeBarItem.js:
+ (WI.MultipleScopeBarItem.prototype.set scopeBarItems):
+ * UserInterface/Views/NavigationSidebarPanel.js:
+ (WI.NavigationSidebarPanel.prototype.closed):
+ * UserInterface/Views/NetworkTimelineView.js:
+ (WI.NetworkTimelineView.prototype.closed):
+ * UserInterface/Views/OverviewTimelineView.js:
+ (WI.OverviewTimelineView.prototype.closed):
+ * UserInterface/Views/ProbeDetailsSidebarPanel.js:
+ (WI.ProbeDetailsSidebarPanel.prototype.closed):
+ * UserInterface/Views/QuickConsole.js:
+ (WI.QuickConsole.prototype.closed):
+ * UserInterface/Views/RecordingContentView.js:
+ (WI.RecordingContentView.prototype._handleRecordingProcessedAction):
+ * UserInterface/Views/RenderingFrameTimelineView.js:
+ (WI.RenderingFrameTimelineView.prototype.closed):
+ * UserInterface/Views/ResourceCollectionContentView.js:
+ (WI.ResourceCollectionContentView.prototype.detached):
+ (WI.ResourceCollectionContentView.prototype.contentViewRemoved):
+ * UserInterface/Views/ResourceContentView.js:
+ (WI.ResourceContentView.prototype.closed):
+ * UserInterface/Views/ResourceDetailsSidebarPanel.js:
+ (WI.ResourceDetailsSidebarPanel.prototype.set resource):
+ (WI.ResourceDetailsSidebarPanel.prototype._applyResourceEventListeners):
+ (WI.ResourceDetailsSidebarPanel.prototype._handleResourceInitiatedResourcesDidChange): Added.
+ * UserInterface/Views/ResourceHeadersContentView.js:
+ (WI.ResourceHeadersContentView.prototype.closed):
+ * UserInterface/Views/ResourceSecurityContentView.js:
+ (WI.ResourceSecurityContentView.prototype.closed):
+ * UserInterface/Views/ResourceSizesContentView.js:
+ (WI.ResourceSizesContentView.prototype.closed):
+ * UserInterface/Views/ResourceTimingContentView.js:
+ (WI.ResourceTimingContentView.prototype.closed):
+ * UserInterface/Views/ScopeChainDetailsSidebarPanel.js:
+ (WI.ScopeChainDetailsSidebarPanel.prototype._generateCallFramesSection):
+ (WI.ScopeChainDetailsSidebarPanel.prototype._generateWatchExpressionsSection):
+ (WI.ScopeChainDetailsSidebarPanel.prototype.closed):
+ * UserInterface/Views/ScriptContentView.js:
+ (WI.ScriptContentView.prototype.closed):
+ * UserInterface/Views/ScriptDetailsTimelineView.js:
+ (WI.ScriptDetailsTimelineView.prototype.closed):
+ * UserInterface/Views/ScriptProfileTimelineView.js:
+ (WI.ScriptProfileTimelineView.prototype.closed):
+ * UserInterface/Views/SourceCodeTextEditor.js:
+ (WI.SourceCodeTextEditor.prototype.close):
+ (WI.SourceCodeTextEditor.prototype._showPopover):
+ (WI.SourceCodeTextEditor.prototype._showPopoverForObject):
+ (WI.SourceCodeTextEditor.prototype._dismissPopover):
+ (WI.SourceCodeTextEditor.prototype._trackPopoverEvents): Deleted.
+ * UserInterface/Views/StorageSidebarPanel.js:
+ (WI.StorageSidebarPanel.prototype.closed):
+ * UserInterface/Views/TextResourceContentView.js:
+ (WI.TextResourceContentView.prototype.closed):
+ * UserInterface/Views/TimelineOverview.js:
+ (WI.TimelineOverview.prototype.closed):
+ * UserInterface/Views/TimelineRecordingContentView.js:
+ (WI.TimelineRecordingContentView):
+ (WI.TimelineRecordingContentView.prototype.closed):
+ (WI.TimelineRecordingContentView.prototype._recordingUnloaded):
+ * UserInterface/Views/TimelineRuler.js:
+ (WI.TimelineRuler.prototype.clearMarkers):
+ * UserInterface/Views/TimelineTabContentView.js:
+ (WI.TimelineTabContentView.prototype.closed):
+ * UserInterface/Views/TreeOutlineGroup.js:
+ (WI.TreeOutlineGroup.prototype.itemRemoved):
+ Replace the `removeEventListener(null, null, this)` pattern by instead having callers remove
+ each event listener explicitly. This is a safer design as it can avoid situations where
+ parent classes inadvertently remove event listeners added by subclasses. For objects with
+ lots of event listeners this is also more efficient as it doesn't require as much iteration.
+
+ * UserInterface/Views/RecordingActionTreeElement.js:
+ (WI.RecordingActionTreeElement):
+ (WI.RecordingActionTreeElement.prototype._handleValidityChanged):
+ Use `singleFireEventListener` where possible.
+
+ * UserInterface/Controllers/DebuggerManager.js:
+ (WI.DebuggerManager.prototype.pause):
+ (WI.DebuggerManager.prototype.resume):
+ (WI.DebuggerManager.prototype.stepNext):
+ (WI.DebuggerManager.prototype.stepOver):
+ (WI.DebuggerManager.prototype.stepInto):
+ (WI.DebuggerManager.prototype.stepOut):
+ * UserInterface/Views/BreakpointTreeElement.js:
+ (WI.BreakpointTreeElement.prototype.onattach):
+ (WI.BreakpointTreeElement.prototype.ondetach):
+ (WI.BreakpointTreeElement.prototype.get listenerSet): Deleted.
+ * UserInterface/Views/DataGrid.js:
+ (WI.DataGrid.prototype.insertColumn):
+ (WI.DataGrid.prototype.removeColumn):
+ * UserInterface/Views/JavaScriptBreakpointTreeElement.js:
+ (WI.JavaScriptBreakpointTreeElement):
+ (WI.JavaScriptBreakpointTreeElement.prototype.onattach):
+ (WI.JavaScriptBreakpointTreeElement.prototype.ondetach):
+ * UserInterface/Views/ProbeSetDataGrid.js:
+ (WI.ProbeSetDataGrid):
+ (WI.ProbeSetDataGrid.prototype.closed):
+ (WI.ProbeSetDataGrid.prototype._setupData):
+ (WI.ProbeSetDataGrid.prototype._teardownData):
+ * UserInterface/Views/ProbeSetDetailsSection.js:
+ (WI.ProbeSetDetailsSection):
+ (WI.ProbeSetDetailsSection.prototype.closed):
+ Remove the legacy `WI.EventListener` and `WI.EventListenerSet` as they basically do the same
+ thing as `WI.Object` with extra steps.
+
+ * UserInterface/Models/WebSocketResource.js:
+ * UserInterface/Proxies/HeapSnapshotWorkerProxy.js:
+ * UserInterface/Controllers/TargetManager.js:
+ * UserInterface/Views/DataGridNode.js:
+ (WI.DataGridNode.prototype.collapse):
+ (WI.DataGridNode.prototype.expand):
+ (WI.DataGridNode.prototype.reveal):
+ (WI.DataGridNode.prototype.traverseNextNode):
+ (WI.DataGridNode.prototype.traversePreviousNode):
+ * UserInterface/Views/HeapSnapshotClassDataGridNode.js:
+ (WI.HeapSnapshotClassDataGridNode):
+ (WI.HeapSnapshotClassDataGridNode.prototype._populate):
+ * UserInterface/Views/HeapSnapshotInstanceDataGridNode.js:
+ (WI.HeapSnapshotInstanceDataGridNode):
+ * UserInterface/Views/ProfileDataGridNode.js:
+ (WI.ProfileDataGridNode):
+ (WI.ProfileDataGridNode.prototype._populate):
+ * UserInterface/Views/ProfileNodeDataGridNode.js:
+ (WI.ProfileNodeDataGridNode):
+ (WI.ProfileNodeDataGridNode.prototype._populate):
+ * UserInterface/Views/TreeOutline.js:
+ * UserInterface/Workers/HeapSnapshot/HeapSnapshotWorker.js:
+ (HeapSnapshotWorker.prototype.createSnapshot):
+ Ensure that all event names are strings defined on the class `Event` object.
+
+ * UserInterface/Views/Sidebar.js:
+ (WI.Sidebar.prototype.set selectedSidebarPanel):
+ Drive-by: fix an issue where `hidden` is called twice, once from the selected sidebar panel
+ being changed and then again when that sidebar panel is removed.
+
+ * .eslintrc:
+ * UserInterface/Base/EventListener.js: Removed.
+ * UserInterface/Base/EventListenerSet.js: Removed.
+ * UserInterface/Base/LinkedList.js: Removed.
+ * UserInterface/Base/ListMultimap.js: Removed.
+ * UserInterface/Main.html:
+ * UserInterface/Test.html:
+ * UserInterface/TestStub.html:
+ * Tools/SourceMaps/index.html:
+
2020-11-03 Devin Rousso <drousso@apple.com>
Web Inspector: Elements: should have the option to Edit Breakpoint... or at least Reveal Breakpoint in Sources Tab
<script src="../../UserInterface/External/CodeMirror/xml.js"></script>
<script src="../../UserInterface/Base/WebInspector.js"></script>
- <script src="../../UserInterface/Base/LinkedList.js"></script>
- <script src="../../UserInterface/Base/ListMultimap.js"></script>
+ <script src="../../UserInterface/Base/Multimap.js"></script>
<script src="../../UserInterface/Base/Object.js"></script>
<script src="../../UserInterface/Base/Utilities.js"></script>
<script src="../../UserInterface/Controllers/FormatterSourceMap.js"></script>
+++ /dev/null
-/*
- * Copyright (C) 2014, 2015 Apple Inc. All rights reserved.
- * Copyright (C) 2013, 2014 University of Washington. 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. ``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
- * 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.
- */
-
-WI.EventListener = class EventListener
-{
- constructor(thisObject, fireOnce)
- {
- this._thisObject = thisObject;
- this._emitter = null;
- this._callback = null;
- this._fireOnce = fireOnce;
- }
-
- // Public
-
- connect(emitter, type, callback, usesCapture)
- {
- console.assert(!this._emitter && !this._callback, "EventListener already bound to a callback.", this);
- console.assert(emitter, `Missing event emitter for event: ${type}.`);
- console.assert(type, "Missing event type.");
- console.assert(callback, `Missing callback for event: ${type}.`);
- var emitterIsValid = emitter && (emitter instanceof WI.Object || emitter instanceof Node || (typeof emitter.addEventListener === "function"));
- console.assert(emitterIsValid, "Event emitter ", emitter, ` (type: ${type}) is null or does not implement Node or WI.Object.`);
-
- if (!emitterIsValid || !type || !callback)
- return;
-
- this._emitter = emitter;
- this._type = type;
- this._usesCapture = !!usesCapture;
-
- if (emitter instanceof Node)
- callback = callback.bind(this._thisObject);
-
- if (this._fireOnce) {
- var listener = this;
- this._callback = function() {
- listener.disconnect();
- callback.apply(this, arguments);
- };
- } else
- this._callback = callback;
-
- if (this._emitter instanceof Node)
- this._emitter.addEventListener(this._type, this._callback, this._usesCapture);
- else
- this._emitter.addEventListener(this._type, this._callback, this._thisObject);
- }
-
- disconnect()
- {
- console.assert(this._emitter && this._callback, "EventListener is not bound to a callback.", this);
-
- if (!this._emitter || !this._callback)
- return;
-
- if (this._emitter instanceof Node)
- this._emitter.removeEventListener(this._type, this._callback, this._usesCapture);
- else
- this._emitter.removeEventListener(this._type, this._callback, this._thisObject);
-
- if (this._fireOnce)
- delete this._thisObject;
- delete this._emitter;
- delete this._type;
- delete this._callback;
- }
-};
+++ /dev/null
-/*
- * Copyright (C) 2014, 2015 Apple Inc. All rights reserved.
- * Copyright (C) 2013, 2014 University of Washington. 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. ``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
- * 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.
- */
-
-// This class supports adding and removing many listeners at once.
-// Add DOM or Inspector event listeners to the set using `register()`.
-// Use `install()` and `uninstall()` to enable or disable all listeners
-// in the set at once.
-
-WI.EventListenerSet = class EventListenerSet
-{
- constructor(defaultThisObject, name)
- {
- this.name = name;
- this._defaultThisObject = defaultThisObject;
-
- this._listeners = [];
- this._installed = false;
- }
-
- // Public
-
- register(emitter, type, callback, thisObject, usesCapture)
- {
- console.assert(emitter, `Missing event emitter for event: ${type}.`);
- console.assert(type, "Missing event type.");
- console.assert(callback, `Missing callback for event: ${type}.`);
- var emitterIsValid = emitter && (emitter instanceof WI.Object || emitter instanceof Node || (typeof emitter.addEventListener === "function"));
- console.assert(emitterIsValid, "Event emitter ", emitter, ` (type: ${type}) is null or does not implement Node or WI.Object.`);
-
- if (!emitterIsValid || !type || !callback)
- return;
-
- this._listeners.push({listener: new WI.EventListener(thisObject || this._defaultThisObject), emitter, type, callback, usesCapture});
- }
-
- unregister()
- {
- if (this._installed)
- this.uninstall();
- this._listeners = [];
- }
-
- install()
- {
- console.assert(!this._installed, "Already installed listener group: " + this.name);
- if (this._installed)
- return;
-
- this._installed = true;
-
- for (var data of this._listeners)
- data.listener.connect(data.emitter, data.type, data.callback, data.usesCapture);
- }
-
- uninstall(unregisterListeners)
- {
- console.assert(this._installed, "Trying to uninstall listener group " + this.name + ", but it isn't installed.");
- if (!this._installed)
- return;
-
- this._installed = false;
-
- for (var data of this._listeners)
- data.listener.disconnect();
-
- if (unregisterListeners)
- this._listeners = [];
- }
-};
+++ /dev/null
-/*
- * 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;
- }
-}
+++ /dev/null
-/*
- * 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();
- }
-}
// 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");
];
// Register for events.
- WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, WI._debuggerDidPause);
- 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.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.browserManager.enable();
- WI.Frame.addEventListener(WI.Frame.Event.MainResourceDidChange, WI._mainResourceDidChange);
+ WI.Frame.addEventListener(WI.Frame.Event.MainResourceDidChange, WI._mainResourceDidChange, WI);
document.addEventListener("DOMContentLoaded", WI.contentLoaded);
WI.layoutMeasurementContainer = document.body.appendChild(document.createElement("div"));
WI.layoutMeasurementContainer.id = "layout-measurement-container";
- 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 setInvisibleCharacterClassName() {
document.body.classList.toggle("show-invisible-characters", WI.settings.showInvisibleCharacters.value);
}
- WI.settings.showInvisibleCharacters.addEventListener(WI.Setting.Event.Changed, setInvisibleCharacterClassName);
+ WI.settings.showInvisibleCharacters.addEventListener(WI.Setting.Event.Changed, setInvisibleCharacterClassName, WI);
setInvisibleCharacterClassName();
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();
// Create the user interface elements.
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"));
WI.consoleLogViewController = WI.consoleContentView.logViewController;
WI.navigationSidebar = new WI.SingleSidebar(document.getElementById("navigation-sidebar"), WI.Sidebar.Sides.Leading, WI.UIString("Navigation", "Navigation @ Sidebar", "Label for the navigation sidebar."));
- WI.navigationSidebar.addEventListener(WI.Sidebar.Event.WidthDidChange, WI._sidebarWidthDidChange);
- WI.navigationSidebar.addEventListener(WI.Sidebar.Event.CollapsedStateDidChange, WI._sidebarWidthDidChange);
+ WI.navigationSidebar.addEventListener(WI.Sidebar.Event.WidthDidChange, WI._sidebarWidthDidChange, WI);
+ WI.navigationSidebar.addEventListener(WI.Sidebar.Event.CollapsedStateDidChange, WI._sidebarWidthDidChange, WI);
WI.detailsSidebar = new WI.MultiSidebar(document.getElementById("details-sidebar"), WI.Sidebar.Sides.Trailing, WI.UIString("Details", "Details @ Sidebar", "Label for the details sidebar."));
- WI.detailsSidebar.addEventListener(WI.Sidebar.Event.WidthDidChange, WI._sidebarWidthDidChange);
- WI.detailsSidebar.addEventListener(WI.Sidebar.Event.CollapsedStateDidChange, WI._sidebarWidthDidChange);
- WI.detailsSidebar.addEventListener(WI.MultiSidebar.Event.MultipleSidebarsVisibleChanged, WI._sidebarWidthDidChange);
+ WI.detailsSidebar.addEventListener(WI.Sidebar.Event.WidthDidChange, WI._sidebarWidthDidChange, WI);
+ WI.detailsSidebar.addEventListener(WI.Sidebar.Event.CollapsedStateDidChange, WI._sidebarWidthDidChange, WI);
+ WI.detailsSidebar.addEventListener(WI.MultiSidebar.Event.MultipleSidebarsVisibleChanged, 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);
WI._showTabAtIndexKeyboardShortcuts = [1, 2, 3, 4, 5, 6, 7, 8, 9].map((i) => new WI.KeyboardShortcut(WI.KeyboardShortcut.Modifier.CommandOrControl | WI.KeyboardShortcut.Modifier.Option, `${i}`, (event) => { WI._showTabAtIndexFromShortcut(i); }));
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);
if (supportsDockRight || supportsDockLeft || supportsDockBottom) {
WI._closeTabBarButton = new WI.ButtonNavigationItem("dock-close", WI.UIString("Close"), "Images/CloseLarge.svg");
- WI._closeTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI.close);
+ WI._closeTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI.close, WI);
dockingConfigurationNavigationItems.push(WI._closeTabBarButton);
}
if ((supportsDockRight || supportsDockLeft) && (supportsDockBottom || supportsUndocked)) {
WI._dockToSideTabBarButton = new WI.ButtonNavigationItem("dock-right", WI.UIString("Dock to side of window"), WI.resolvedLayoutDirection() === WI.LayoutDirection.RTL ? "Images/DockLeft.svg" : "Images/DockRight.svg", 16, 16);
WI._dockToSideTabBarButton.element.classList.add(WI.Popover.IgnoreAutoDismissClassName);
- WI._dockToSideTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI.resolvedLayoutDirection() === WI.LayoutDirection.RTL ? WI._dockLeft : WI._dockRight);
+ WI._dockToSideTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI.resolvedLayoutDirection() === WI.LayoutDirection.RTL ? WI._dockLeft : WI._dockRight, WI);
dockingConfigurationNavigationItems.push(WI._dockToSideTabBarButton);
}
if (supportsDockBottom && (supportsDockRight || supportsDockLeft || supportsUndocked)) {
WI._dockBottomTabBarButton = new WI.ButtonNavigationItem("dock-bottom", WI.UIString("Dock to bottom of window"), "Images/DockBottom.svg", 16, 16);
WI._dockBottomTabBarButton.element.classList.add(WI.Popover.IgnoreAutoDismissClassName);
- WI._dockBottomTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._dockBottom);
+ WI._dockBottomTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._dockBottom, WI);
dockingConfigurationNavigationItems.push(WI._dockBottomTabBarButton);
}
if (supportsUndocked && (supportsDockRight || supportsDockLeft || supportsDockBottom)) {
WI._undockTabBarButton = new WI.ButtonNavigationItem("undock", WI.UIString("Detach into separate window"), "Images/Undock.svg", 16, 16);
WI._undockTabBarButton.element.classList.add(WI.Popover.IgnoreAutoDismissClassName);
- WI._undockTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._undock);
+ WI._undockTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._undock, WI);
dockingConfigurationNavigationItems.push(WI._undockTabBarButton);
}
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._inspectModeTabBarButton = new WI.ActivateButtonNavigationItem("inspect", elementSelectionToolTip, activatedElementSelectionToolTip, "Images/Crosshair.svg");
- WI._inspectModeTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._toggleInspectMode);
+ WI._inspectModeTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._toggleInspectMode, WI);
inspectedPageControlNavigationItems.push(WI._inspectModeTabBarButton);
if (InspectorFrontendHost.isRemote || WI.isDebugUIEnabled()) {
if (InspectorBackend.hasCommand("Page.overrideUserAgent") && InspectorBackend.hasCommand("Page.overrideSetting")) {
const deviceSettingsTooltip = WI.UIString("Device Settings");
WI._deviceSettingsTabBarButton = new WI.ActivateButtonNavigationItem("device-settings", deviceSettingsTooltip, deviceSettingsTooltip, "Images/Device.svg");
- WI._deviceSettingsTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._handleDeviceSettingsTabBarButtonClicked);
+ WI._deviceSettingsTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._handleDeviceSettingsTabBarButtonClicked, WI);
inspectedPageControlNavigationItems.push(WI._deviceSettingsTabBarButton);
WI._deviceSettingsPopover = null;
else
reloadToolTip = WI.UIString("Reload page (%s)\nReload page ignoring cache (%s)").format(WI._reloadPageKeyboardShortcut.displayName, WI._reloadPageFromOriginKeyboardShortcut.displayName);
WI._reloadTabBarButton = new WI.ButtonNavigationItem("reload", reloadToolTip, "Images/ReloadToolbar.svg");
- WI._reloadTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._reloadTabBarButtonClicked);
+ WI._reloadTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._reloadTabBarButtonClicked, WI);
inspectedPageControlNavigationItems.push(WI._reloadTabBarButton);
WI._downloadTabBarButton = new WI.ButtonNavigationItem("download", WI.UIString("Download Web Archive"), "Images/DownloadArrow.svg");
- WI._downloadTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._downloadWebArchive);
+ WI._downloadTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI._downloadWebArchive, WI);
inspectedPageControlNavigationItems.push(WI._downloadTabBarButton);
}
WI._consoleWarningsTabBarButton = new WI.ButtonNavigationItem("console-warnings", WI.UIString("0 Console warnings"), "Images/IssuesEnabled.svg");
WI._consoleWarningsTabBarButton.imageType = WI.ButtonNavigationItem.ImageType.IMG;
WI._consoleWarningsTabBarButton.hidden = true;
- WI._consoleWarningsTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, () => {
+ WI._consoleWarningsTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, function(event) {
WI.showConsoleTab(WI.LogContentView.Scopes.Warnings, {
initiatorHint: WI.TabBrowser.TabNavigationInitiator.Dashboard,
});
WI._consoleErrorsTabBarButton = new WI.ButtonNavigationItem("console-errors", WI.UIString("0 Console errors"), "Images/ErrorsEnabled.svg");
WI._consoleErrorsTabBarButton.imageType = WI.ButtonNavigationItem.ImageType.IMG;
WI._consoleErrorsTabBarButton.hidden = true;
- WI._consoleErrorsTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, () => {
+ WI._consoleErrorsTabBarButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, function(event) {
WI.showConsoleTab(WI.LogContentView.Scopes.Errors, {
initiatorHint: WI.TabBrowser.TabNavigationInitiator.Dashboard,
});
}
// 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);
function updateConsoleSavedResultPrefixCSSVariable() {
document.body.style.setProperty("--console-saved-result-prefix", "\"" + WI.RuntimeManager.preferredSavedResultPrefix() + "\"");
updateZoomFactorCSSVariable();
- WI.settings.frontendAppearance.addEventListener(WI.Setting.Event.Changed, (event) => {
+ WI.settings.frontendAppearance.addEventListener(WI.Setting.Event.Changed, function(event) {
InspectorFrontendHost.setForcedAppearance(WI.settings.frontendAppearance.value);
}, WI);
static addEventListener(eventType, listener, thisObject)
{
- thisObject = thisObject || null;
+ console.assert(typeof eventType === "string", this, eventType, listener, thisObject);
+ console.assert(typeof listener === "function", this, eventType, listener, thisObject);
+ console.assert(typeof thisObject === "object" || window.InspectorTest || window.ProtocolTest, this, eventType, listener, thisObject);
- console.assert(eventType, "Object.addEventListener: invalid event type ", eventType, "(listener: ", listener, "thisObject: ", thisObject, ")");
- if (!eventType)
- return null;
+ thisObject ??= this;
- console.assert(listener, "Object.addEventListener: invalid listener ", listener, "(event type: ", eventType, "thisObject: ", thisObject, ")");
- if (!listener)
- return null;
+ let data = {
+ listener,
+ thisObjectWeakRef: new WeakRef(thisObject),
+ };
- if (!this._listeners)
- this._listeners = new Map();
+ WI.Object._listenerThisObjectFinalizationRegistry.register(thisObject, {eventTarget: this, eventType, data}, data);
- let listenersTable = this._listeners.get(eventType);
- if (!listenersTable) {
- listenersTable = new ListMultimap();
- this._listeners.set(eventType, listenersTable);
- }
+ this._listeners ??= new Multimap;
+ this._listeners.add(eventType, data);
+
+ console.assert(Array.from(this._listeners.get(eventType)).filter((item) => item.listener === listener && item.thisObjectWeakRef.deref() === thisObject).length === 1, this, eventType, listener, thisObject);
- listenersTable.add(thisObject, 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 removeEventListener(eventType, listener, thisObject)
+ static awaitEvent(eventType, thisObject)
{
- eventType = eventType || null;
- listener = listener || null;
- thisObject = thisObject || null;
-
- if (!this._listeners)
- return;
-
- if (thisObject && !eventType) {
- this._listeners.forEach(function(listenersTable) {
- listenersTable.deleteAll(thisObject);
- });
-
- return;
- }
-
- let listenersTable = this._listeners.get(eventType);
- if (!listenersTable || listenersTable.size === 0)
- return;
-
- let didDelete = listenersTable.delete(thisObject, listener);
- console.assert(didDelete, "removeEventListener cannot remove " + eventType.toString() + " because it doesn't exist.");
+ return new Promise((resolve, reject) => {
+ this.singleFireEventListener(eventType, resolve, thisObject);
+ });
}
- static awaitEvent(eventType)
+ static removeEventListener(eventType, listener, thisObject)
{
- let wrapper = new WI.WrappedPromise;
- this.singleFireEventListener(eventType, (event) => wrapper.resolve(event));
- return wrapper.promise;
- }
+ console.assert(this._listeners, this, eventType, listener, thisObject);
+ console.assert(typeof eventType === "string", this, eventType, listener, thisObject);
+ console.assert(typeof listener === "function", this, eventType, listener, thisObject);
+ console.assert(typeof thisObject === "object" || window.InspectorTest || window.ProtocolTest, this, eventType, listener, thisObject);
- // Only used by tests.
- static hasEventListeners(eventType)
- {
- if (!this._listeners)
- return false;
+ thisObject ??= this;
- let listenersTable = this._listeners.get(eventType);
- return listenersTable && listenersTable.size > 0;
- }
+ let listenersForEventType = this._listeners.get(eventType);
+ console.assert(listenersForEventType, this, eventType, listener, thisObject);
- // This should only be used within regression tests to detect leaks.
- static retainedObjectsWithPrototype(proto)
- {
- let results = new Set;
+ let didDelete = false;
+ for (let data of listenersForEventType) {
+ let unwrapped = data.thisObjectWeakRef.deref();
+ if (!unwrapped || unwrapped !== thisObject || data.listener !== listener)
+ continue;
- if (this._listeners) {
- this._listeners.forEach(function(listenersTable, eventType) {
- listenersTable.forEach(function(pair) {
- let thisObject = pair[0];
- if (thisObject instanceof proto)
- results.add(thisObject);
- });
- });
+ if (this._listeners.delete(eventType, data))
+ didDelete = true;
+ WI.Object._listenerThisObjectFinalizationRegistry.unregister(data);
}
-
- return results;
+ console.assert(didDelete, this, eventType, listener, thisObject);
}
// Public
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); }
- hasEventListeners() { return WI.Object.hasEventListeners.apply(this, arguments); }
- retainedObjectsWithPrototype() { return WI.Object.retainedObjectsWithPrototype.apply(this, arguments); }
+ removeEventListener() { return WI.Object.removeEventListener.apply(this, arguments); }
dispatchEventToListeners(eventType, eventData)
{
if (!object || event._stoppedPropagation)
return;
- let listenerTypesMap = object._listeners;
- if (!listenerTypesMap || !object.hasOwnProperty("_listeners"))
+ let listeners = object._listeners;
+ if (!listeners || !object.hasOwnProperty("_listeners") || !listeners.size)
return;
- console.assert(listenerTypesMap instanceof Map);
-
- let listenersTable = listenerTypesMap.get(eventType);
- if (!listenersTable)
+ let listenersForEventType = listeners.get(eventType);
+ if (!listenersForEventType)
return;
- // Make a copy with slice so mutations during the loop doesn't affect us.
- let listeners = listenersTable.toArray();
+ // Copy the set of listeners so we don't have to worry about mutating while iterating.
+ for (let data of Array.from(listenersForEventType)) {
+ let unwrapped = data.thisObjectWeakRef.deref();
+ if (!unwrapped)
+ continue;
+
+ data.listener.call(unwrapped, event);
- // 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;
}
return event.defaultPrevented;
}
+
+ // Test
+
+ static hasEventListeners(eventType)
+ {
+ console.assert(window.InspectorTest || window.ProtocolTest);
+ return this._listeners?.has(eventType);
+ }
+
+ static activelyListeningObjectsWithPrototype(proto)
+ {
+ console.assert(window.InspectorTest || window.ProtocolTest);
+ let results = new Set;
+ if (this._listeners) {
+ for (let data of this._listeners.values()) {
+ let unwrapped = data.thisObjectWeakRef.deref();
+ if (unwrapped instanceof proto)
+ results.add(unwrapped);
+ }
+ }
+ return results;
+ }
+
+ hasEventListeners() { return WI.Object.hasEventListeners.apply(this, arguments); }
+ activelyListeningObjectsWithPrototype() { return WI.Object.activelyListeningObjectsWithPrototype.apply(this, arguments); }
};
+WI.Object._listenerThisObjectFinalizationRegistry = new FinalizationRegistry((heldValue) => {
+ heldValue.eventTarget._listeners.delete(heldValue.eventType, heldValue.data);
+});
+
WI.Event = class Event
{
constructor(target, type, data)
};
}
- 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) => {
- setting.value = defaultSetting.value;
- });
+ defaultSetting.addEventListener(WI.Setting.Event.Changed, function(event) {
+ this.value = defaultSetting.value;
+ }, setting);
settings[key] = setting;
-
- if (options.handleChanged)
- setting.addEventListener(WI.Setting.Event.Changed, options.handleChanged);
}
return settings;
}
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;
target.ApplicationCacheAgent.disable();
}
- WI.Frame.removeEventListener(null, null, this);
+ WI.Frame.removeEventListener(WI.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this);
+ WI.Frame.removeEventListener(WI.Frame.Event.ChildFrameWasRemoved, this._childFrameWasRemoved, this);
this._reset();
}
disconnect()
{
- this._treeOutline.removeEventListener(null, null, this);
+ if (this._treeOutline.selectable)
+ this._treeOutline.removeEventListener(WI.TreeOutline.Event.SelectionDidChange, this._treeSelectionDidChange, this);
+ else
+ this._treeOutline.removeEventListener(WI.TreeOutline.Event.ElementClicked, this._treeElementClicked, this);
}
// Private
target.DOMStorageAgent.disable();
}
- WI.Frame.removeEventListener(null, null, this);
+ WI.Frame.removeEventListener(WI.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this);
+ WI.Frame.removeEventListener(WI.Frame.Event.SecurityOriginDidChange, this._securityOriginDidChange, this);
this._reset();
}
target.DatabaseAgent.disable();
}
- WI.Frame.removeEventListener(null, null, this);
+ WI.Frame.removeEventListener(WI.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this);
this._reset();
}
this.dispatchEventToListeners(WI.DebuggerManager.Event.WaitingToPause);
- let listener = new WI.EventListener(this, true);
-
- let managerResult = new Promise(function(resolve, reject) {
- listener.connect(WI.debuggerManager, WI.DebuggerManager.Event.Paused, resolve);
- });
-
- let promises = [];
- for (let [target, targetData] of this._targetDebuggerDataMap)
+ let promises = [this.awaitEvent(WI.DebuggerManager.Event.Paused, this)];
+ for (let targetData of this._targetDebuggerDataMap.values())
promises.push(targetData.pauseIfNeeded());
-
- return Promise.all([managerResult, ...promises]);
+ return Promise.all(promises);
}
resume()
if (!this.paused)
return Promise.resolve();
- let listener = new WI.EventListener(this, true);
-
- let managerResult = new Promise(function(resolve, reject) {
- listener.connect(WI.debuggerManager, WI.DebuggerManager.Event.Resumed, resolve);
- });
-
- let promises = [];
- for (let [target, targetData] of this._targetDebuggerDataMap)
+ let promises = [this.awaitEvent(WI.DebuggerManager.Event.Resumed, this)];
+ for (let targetData of this._targetDebuggerDataMap.values())
promises.push(targetData.resumeIfNeeded());
-
- return Promise.all([managerResult, ...promises]);
+ return Promise.all(promises);
}
stepNext()
if (!this.paused)
return Promise.reject(new Error("Cannot step next because debugger is not paused."));
- let listener = new WI.EventListener(this, true);
-
- let managerResult = new Promise(function(resolve, reject) {
- listener.connect(WI.debuggerManager, WI.DebuggerManager.Event.ActiveCallFrameDidChange, resolve);
- });
-
- let protocolResult = this._activeCallFrame.target.DebuggerAgent.stepNext()
- .catch(function(error) {
- listener.disconnect();
- console.error("DebuggerManager.stepNext failed: ", error);
- throw error;
- });
-
- return Promise.all([managerResult, protocolResult]);
+ return Promise.all([
+ this.awaitEvent(WI.DebuggerManager.Event.ActiveCallFrameDidChange, this),
+ this._activeCallFrame.target.DebuggerAgent.stepNext(),
+ ]);
}
stepOver()
if (!this.paused)
return Promise.reject(new Error("Cannot step over because debugger is not paused."));
- let listener = new WI.EventListener(this, true);
-
- let managerResult = new Promise(function(resolve, reject) {
- listener.connect(WI.debuggerManager, WI.DebuggerManager.Event.ActiveCallFrameDidChange, resolve);
- });
-
- let protocolResult = this._activeCallFrame.target.DebuggerAgent.stepOver()
- .catch(function(error) {
- listener.disconnect();
- console.error("DebuggerManager.stepOver failed: ", error);
- throw error;
- });
-
- return Promise.all([managerResult, protocolResult]);
+ return Promise.all([
+ this.awaitEvent(WI.DebuggerManager.Event.ActiveCallFrameDidChange, this),
+ this._activeCallFrame.target.DebuggerAgent.stepOver(),
+ ]);
}
stepInto()
if (!this.paused)
return Promise.reject(new Error("Cannot step into because debugger is not paused."));
- let listener = new WI.EventListener(this, true);
-
- let managerResult = new Promise(function(resolve, reject) {
- listener.connect(WI.debuggerManager, WI.DebuggerManager.Event.ActiveCallFrameDidChange, resolve);
- });
-
- let protocolResult = this._activeCallFrame.target.DebuggerAgent.stepInto()
- .catch(function(error) {
- listener.disconnect();
- console.error("DebuggerManager.stepInto failed: ", error);
- throw error;
- });
-
- return Promise.all([managerResult, protocolResult]);
+ return Promise.all([
+ this.awaitEvent(WI.DebuggerManager.Event.ActiveCallFrameDidChange, this),
+ this._activeCallFrame.target.DebuggerAgent.stepInto(),
+ ]);
}
stepOut()
if (!this.paused)
return Promise.reject(new Error("Cannot step out because debugger is not paused."));
- let listener = new WI.EventListener(this, true);
-
- let managerResult = new Promise(function(resolve, reject) {
- listener.connect(WI.debuggerManager, WI.DebuggerManager.Event.ActiveCallFrameDidChange, resolve);
- });
-
- let protocolResult = this._activeCallFrame.target.DebuggerAgent.stepOut()
- .catch(function(error) {
- listener.disconnect();
- console.error("DebuggerManager.stepOut failed: ", error);
- throw error;
- });
-
- return Promise.all([managerResult, protocolResult]);
+ return Promise.all([
+ this.awaitEvent(WI.DebuggerManager.Event.ActiveCallFrameDidChange, this),
+ this._activeCallFrame.target.DebuggerAgent.stepOut(),
+ ]);
}
continueUntilNextRunLoop(target)
target.IndexedDBAgent.disable();
}
- WI.Frame.removeEventListener(null, null, this);
+ WI.Frame.removeEventListener(WI.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this);
+ WI.Frame.removeEventListener(WI.Frame.Event.SecurityOriginDidChange, this._securityOriginDidChange, this);
this._reset();
}
this._activeExecutionContext = null;
- WI.settings.consoleSavedResultAlias.addEventListener(WI.Setting.Event.Changed, (event) => {
+ WI.settings.consoleSavedResultAlias.addEventListener(WI.Setting.Event.Changed, function(event) {
for (let target of WI.targets) {
// COMPATIBILITY (iOS 12.2): Runtime.setSavedResultAlias did not exist.
if (target.hasCommand("Runtime.setSavedResultAlias"))
target.RuntimeAgent.setSavedResultAlias(WI.settings.consoleSavedResultAlias.value);
}
- });
+ }, this);
}
// Static
WI.RuntimeManager.TopLevelExecutionContextIdentifier = undefined;
WI.RuntimeManager.Event = {
- DidEvaluate: Symbol("runtime-manager-did-evaluate"),
- DefaultExecutionContextChanged: Symbol("runtime-manager-default-execution-context-changed"),
- ActiveExecutionContextChanged: Symbol("runtime-manager-active-execution-context-changed"),
+ DidEvaluate: "runtime-manager-did-evaluate",
+ DefaultExecutionContextChanged: "runtime-manager-default-execution-context-changed",
+ ActiveExecutionContextChanged: "runtime-manager-active-execution-context-changed",
};
};
WI.TargetManager.Event = {
- TargetAdded: Symbol("target-manager-target-added"),
- TargetRemoved: Symbol("target-manager-target-removed"),
+ TargetAdded: "target-manager-target-added",
+ TargetRemoved: "target-manager-target-removed",
DidCommitProvisionalTarget: "target-manager-provisional-target-committed",
};
if (this._capturingState === TimelineManager.CapturingState.Inactive)
return;
- WI.DOMNode.removeEventListener(null, null, this);
- WI.memoryManager.removeEventListener(null, null, this);
- WI.heapManager.removeEventListener(null, null, this);
+ WI.DOMNode.removeEventListener(WI.DOMNode.Event.DidFireEvent, this._handleDOMNodeDidFireEvent, this);
+ WI.DOMNode.removeEventListener(WI.DOMNode.Event.PowerEfficientPlaybackStateChanged, this._handleDOMNodePowerEfficientPlaybackStateChanged, this);
+
+ WI.heapManager.removeEventListener(WI.HeapManager.Event.GarbageCollected, this._garbageCollected, this);
+
+ WI.memoryManager.removeEventListener(WI.MemoryManager.Event.MemoryPressure, this._memoryPressure, this);
+
WI.Target.removeEventListener(WI.Target.Event.ResourceAdded, this._resourceWasAdded, this);
WI.Frame.removeEventListener(WI.Frame.Event.ResourceWasAdded, this._resourceWasAdded, this);
- WI.settings.timelinesAutoStop.removeEventListener(null, null, this);
+
+ WI.settings.timelinesAutoStop.removeEventListener(WI.Setting.Event.Changed, this._handleTimelinesAutoStopSettingChanged, this);
this._activeRecording.capturingStopped(this._capturingEndTime);
WI.isEngineeringBuild = true;
// Disable Pause in Internal Scripts if Show Internal Scripts is dibbled.
-WI.settings.engineeringShowInternalScripts.addEventListener(WI.Setting.Event.Changed, (event) => {
+WI.settings.engineeringShowInternalScripts.addEventListener(WI.Setting.Event.Changed, function(event) {
if (!WI.settings.engineeringShowInternalScripts.value)
WI.settings.engineeringPauseForInternalScripts.value = false;
}, WI.settings.engineeringPauseForInternalScripts);
// Enable Show Internal Scripts if Pause in Internal Scripts is enabled.
-WI.settings.engineeringPauseForInternalScripts.addEventListener(WI.Setting.Event.Changed, (event) => {
+WI.settings.engineeringPauseForInternalScripts.addEventListener(WI.Setting.Event.Changed, function(event) {
if (WI.settings.engineeringPauseForInternalScripts.value)
WI.settings.engineeringShowInternalScripts.value = true;
}, WI.settings.engineeringShowInternalScripts);
ignoreChangesToState = false;
}
- dumpMessagesTabBarNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, () => {
+ dumpMessagesTabBarNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, function(event) {
let nextState;
switch (dumpMessagesCurrentState()) {
case DumpMessagesState.Off:
break;
}
applyDumpMessagesState(nextState);
- });
- WI.settings.protocolAutoLogMessages.addEventListener(WI.Setting.Event.Changed, () => {
+ }, dumpMessagesTabBarNavigationItem);
+ WI.settings.protocolAutoLogMessages.addEventListener(WI.Setting.Event.Changed, function(event) {
if (ignoreChangesToState)
return;
applyDumpMessagesState(dumpMessagesCurrentState());
- });
+ }, dumpMessagesTabBarNavigationItem);
applyDumpMessagesState(dumpMessagesCurrentState());
// Next Level Inspector.
const inspectInspectorToolTip = WI.unlocalizedString("Open Web Inspector [%d]").format(inspectionLevel + 1);
let inspectInspectorTabBarNavigationItem = new WI.ButtonNavigationItem("inspect-inspector", inspectInspectorToolTip);
inspectInspectorTabBarNavigationItem.element.textContent = inspectionLevel + 1;
- inspectInspectorTabBarNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, () => {
+ inspectInspectorTabBarNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, function(event) {
InspectorFrontendHost.inspectInspector();
- });
+ }, inspectInspectorTabBarNavigationItem);
let groupNavigationItem = new WI.GroupNavigationItem([
dumpMessagesTabBarNavigationItem,
function setFocusDebugOutline() {
document.body.classList.toggle("focus-debug", WI.settings.debugOutlineFocusedElement.value);
}
-
- WI.settings.debugOutlineFocusedElement.addEventListener(WI.Setting.Event.Changed, setFocusDebugOutline);
-
+ WI.settings.debugOutlineFocusedElement.addEventListener(WI.Setting.Event.Changed, setFocusDebugOutline, WI.settings.debugOutlineFocusedElement);
setFocusDebugOutline();
function updateDebugUI() {
WI.tabBar.needsLayout();
}
- WI.showDebugUISetting.addEventListener(WI.Setting.Event.Changed, () => {
+ WI.showDebugUISetting.addEventListener(WI.Setting.Event.Changed, function(event) {
updateDebugUI();
- });
+ }, groupNavigationItem);
updateDebugUI();
};
<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/ReferencePage.js"></script>
<script src="Base/BlobUtilities.js"></script>
<script src="Base/DOMUtilities.js"></script>
- <script src="Base/EventListener.js"></script>
- <script src="Base/EventListenerSet.js"></script>
<script src="Base/FileUtilities.js"></script>
<script src="Base/HTTPUtilities.js"></script>
<script src="Base/ImageUtilities.js"></script>
this._pendingRefreshTask = null;
this.refresh();
+
+ this._trackedStyleSheets = new WeakSet;
+ WI.CSSStyleSheet.addEventListener(WI.CSSStyleSheet.Event.ContentDidChange, this._handleCSSStyleSheetContentDidChange, this);
}
// Static
if (styleSheet) {
if (type === WI.CSSStyleDeclaration.Type.Inline)
styleSheet.markAsInlineStyleAttributeStyleSheet();
- styleSheet.addEventListener(WI.CSSStyleSheet.Event.ContentDidChange, this._styleSheetContentDidChange, this);
+ this._trackedStyleSheets.add(styleSheet);
}
if (inherited && !inheritedPropertyCount)
}
if (styleSheet)
- styleSheet.addEventListener(WI.CSSStyleSheet.Event.ContentDidChange, this._styleSheetContentDidChange, this);
+ this._trackedStyleSheets.add(styleSheet);
rule = new WI.CSSRule(this, styleSheet, id, type, sourceCodeLocation, selectorText, selectors, matchedSelectorIndices, style, groupings);
this.dispatchEventToListeners(WI.DOMNodeStyles.Event.NeedsRefresh);
}
- _styleSheetContentDidChange(event)
+ _handleCSSStyleSheetContentDidChange(event)
{
- var styleSheet = event.target;
- console.assert(styleSheet);
- if (!styleSheet)
+ let styleSheet = event.target;
+ if (!this._trackedStyleSheets.has(styleSheet))
return;
// Ignore the stylesheet we know we just changed and handled above.
disconnect()
{
- WI.domManager.removeEventListener(null, null, this);
- this._frame.removeEventListener(null, null, this);
+ this._frame.removeEventListener(WI.Frame.Event.PageExecutionContextChanged, this._framePageExecutionContextChanged, this);
+
+ WI.domManager.removeEventListener(WI.DOMManager.Event.DocumentUpdated, this._documentUpdated, this);
+
+ if (!this._frame.isMainFrame()) {
+ WI.domManager.removeEventListener(WI.DOMManager.Event.NodeRemoved, this._nodeRemoved, this);
+ this._frame.removeEventListener(WI.Frame.Event.MainResourceDidChange, this._frameMainResourceDidChange, this);
+ }
}
invalidate()
if (!this._finishThenRequestContentPromise) {
this._finishThenRequestContentPromise = new Promise((resolve, reject) => {
- this.addEventListener(WI.Resource.Event.LoadingDidFinish, resolve);
- this.addEventListener(WI.Resource.Event.LoadingDidFail, reject);
+ this.singleFireEventListener(WI.Resource.Event.LoadingDidFinish, resolve, this);
+ this.singleFireEventListener(WI.Resource.Event.LoadingDidFail, reject, this);
}).then(this.requestContent.bind(this));
}
};
WI.WebSocketResource.Event = {
- FrameAdded: Symbol("web-socket-frame-added"),
- ReadyStateChanged: Symbol("web-socket-resource-ready-state-changed"),
+ FrameAdded: "web-socket-frame-added",
+ ReadyStateChanged: "web-socket-resource-ready-state-changed",
};
WI.WebSocketResource.ReadyState = {
* THE POSSIBILITY OF SUCH DAMAGE.
*/
-// Events dispatched on this class: "HeapSnapshot.CollectionEvent"
-
WI.HeapSnapshotWorkerProxy = class HeapSnapshotWorkerProxy extends WI.Object
{
constructor()
console.error("Unexpected HeapSnapshotWorker message", data);
}
};
+
+WI.HeapSnapshotWorkerProxy.Event = {
+ Collection: "heap-snapshot-collection",
+};
<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/ReferencePage.js"></script>
<script src="Base/BlobUtilities.js"></script>
<script src="Base/DOMUtilities.js"></script>
- <script src="Base/EventListener.js"></script>
- <script src="Base/EventListenerSet.js"></script>
<script src="Base/FileUtilities.js"></script>
<script src="Base/ImageUtilities.js"></script>
<script src="Base/MIMETypeUtilities.js"></script>
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/Multimap.js"></script>
<script src="Base/Object.js"></script>
<script src="Base/Utilities.js"></script>
closed()
{
- WI.applicationCacheManager.removeEventListener(null, null, this);
+ if (this.didInitialLayout) {
+ WI.applicationCacheManager.removeEventListener(WI.ApplicationCacheManager.Event.NetworkStateUpdated, this._networkStateUpdated, this);
+ WI.applicationCacheManager.removeEventListener(WI.ApplicationCacheManager.Event.FrameManifestStatusChanged, this._frameManifestStatusChanged, this);
+ }
super.closed();
}
closed()
{
- WI.applicationCacheManager.removeEventListener(null, null, this);
+ WI.applicationCacheManager.removeEventListener(WI.ApplicationCacheManager.Event.FrameManifestStatusChanged, this._updateStatus, this);
super.closed();
}
{
super.closed();
- WI.auditManager.removeEventListener(null, null, this);
+ if (this.didInitialLayout) {
+ WI.auditManager.removeEventListener(WI.AuditManager.Event.EditingChanged, this._handleAuditManagerEditingChanged, this);
+ WI.auditManager.removeEventListener(WI.AuditManager.Event.RunningStateChanged, this._handleAuditManagerRunningStateChanged, this);
+ WI.auditManager.removeEventListener(WI.AuditManager.Event.TestAdded, this._handleAuditTestAdded, this);
+ WI.auditManager.removeEventListener(WI.AuditManager.Event.TestCompleted, this._handleAuditTestCompleted, this);
+ WI.auditManager.removeEventListener(WI.AuditManager.Event.TestRemoved, this._handleAuditTestRemoved, this);
+ WI.auditManager.removeEventListener(WI.AuditManager.Event.TestScheduled, this._handleAuditTestScheduled, this);
+ }
}
updateFilter()
let stopAuditNavigationItem = new WI.ButtonNavigationItem("stop-audit", WI.UIString("Stop"), "Images/AuditStop.svg", 13, 13);
stopAuditNavigationItem.buttonStyle = WI.ButtonNavigationItem.Style.ImageAndText;
- stopAuditNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, (event) => {
+ stopAuditNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, function(event) {
WI.auditManager.stop();
- }, WI.auditManager);
+ }, stopAuditNavigationItem);
let stopAuditHelpElement = WI.createNavigationItemHelp(WI.UIString("Press %s to stop running."), stopAuditNavigationItem);
this.placeholderElement.appendChild(stopAuditHelpElement);
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]);
- });
+ }, startNavigationItem);
let importHelpElement = WI.createNavigationItemHelp(WI.UIString("Press %s to start running the audit."), startNavigationItem);
this.placeholderElement.appendChild(importHelpElement);
let stopAuditNavigationItem = new WI.ButtonNavigationItem("stop-audit", WI.UIString("Stop"), "Images/AuditStop.svg", 13, 13);
stopAuditNavigationItem.buttonStyle = WI.ButtonNavigationItem.Style.ImageAndText;
- stopAuditNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, (event) => {
+ stopAuditNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, function(event) {
WI.auditManager.stop();
- }, WI.auditManager);
+ }, stopAuditNavigationItem);
let stopAuditHelpElement = WI.createNavigationItemHelp(WI.UIString("Press %s to stop running."), stopAuditNavigationItem);
this.placeholderElement.appendChild(stopAuditHelpElement);
ondetach()
{
- WI.auditManager.removeEventListener(null, null, this);
- this.representedObject.removeEventListener(null, null, this);
+ if (this.representedObject instanceof WI.AuditTestBase) {
+ this.representedObject.removeEventListener(WI.AuditTestBase.Event.DisabledChanged, this._handleTestDisabledChanged, this);
+ this.representedObject.removeEventListener(WI.AuditTestBase.Event.ResultChanged, this._handleTestResultChanged, this);
+
+ if (this.representedObject instanceof WI.AuditTestCase)
+ this.representedObject.removeEventListener(WI.AuditTestBase.Event.Scheduled, this._handleTestCaseScheduled, this);
+ else if (this.representedObject instanceof WI.AuditTestGroup)
+ this.representedObject.removeEventListener(WI.AuditTestBase.Event.Scheduled, this._handleTestGroupScheduled, this);
+
+ if (this.representedObject.editable) {
+ this.representedObject.removeEventListener(WI.AuditTestBase.Event.NameChanged, this._handleTestNameChanged, this);
+ this.representedObject.removeEventListener(WI.AuditTestBase.Event.SupportedChanged, this._handleTestSupportedChanged, this);
+
+ if (this.representedObject instanceof WI.AuditTestGroup)
+ this.representedObject.removeEventListener(WI.AuditTestGroup.Event.TestAdded, this._handleTestGroupTestAdded, this);
+ }
+
+ WI.auditManager.removeEventListener(WI.AuditManager.Event.EditingChanged, this._handleManagerEditingChanged, this);
+ WI.auditManager.removeEventListener(WI.AuditManager.Event.TestScheduled, this._handleAuditManagerTestScheduled, this);
+ WI.auditManager.removeEventListener(WI.AuditManager.Event.TestCompleted, this._handleAuditManagerTestCompleted, this);
+ }
super.ondetach();
}
this._breakpoint = breakpoint;
this._probeSet = null;
- this._listenerSet = new WI.EventListenerSet(this, "BreakpointTreeElement listeners");
- this._listenerSet.register(breakpoint, WI.Breakpoint.Event.DisabledStateDidChange, this.updateStatus);
- this._listenerSet.register(breakpoint, WI.Breakpoint.Event.AutoContinueDidChange, this.updateStatus);
- this._listenerSet.register(WI.debuggerManager, WI.DebuggerManager.Event.BreakpointsEnabledDidChange, this.updateStatus);
- this._listenerSet.register(WI.debuggerManager, WI.DebuggerManager.Event.ProbeSetAdded, this._probeSetAdded);
- this._listenerSet.register(WI.debuggerManager, WI.DebuggerManager.Event.ProbeSetRemoved, this._probeSetRemoved);
-
this.status = WI.ImageUtilities.useSVGSymbol("Images/Breakpoint.svg");
this.status.className = "status-image";
-
- this._listenerSet.register(this.status, "mousedown", this._statusImageElementMouseDown);
- this._listenerSet.register(this.status, "click", this._statusImageElementClicked);
+ this.status.addEventListener("mousedown", this._statusImageElementMouseDown.bind(this));
+ this.status.addEventListener("click", this._statusImageElementClicked.bind(this));
this.updateStatus();
{
super.onattach();
- this._listenerSet.install();
+ this._breakpoint.addEventListener(WI.Breakpoint.Event.DisabledStateDidChange, this.updateStatus, this);
+ this._breakpoint.addEventListener(WI.Breakpoint.Event.AutoContinueDidChange, this.updateStatus, this);
+
+ WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.BreakpointsEnabledDidChange, this.updateStatus, this);
+ WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.ProbeSetAdded, this._probeSetAdded, this);
+ WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.ProbeSetRemoved, this._probeSetRemoved, this);
for (var probeSet of WI.debuggerManager.probeSets)
if (probeSet.breakpoint === this._breakpoint)
{
super.ondetach();
- this._listenerSet.uninstall();
+ this._breakpoint.removeEventListener(WI.Breakpoint.Event.DisabledStateDidChange, this.updateStatus, this);
+ this._breakpoint.removeEventListener(WI.Breakpoint.Event.AutoContinueDidChange, this.updateStatus, this);
+
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.BreakpointsEnabledDidChange, this.updateStatus, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.ProbeSetAdded, this._probeSetAdded, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.ProbeSetRemoved, this._probeSetRemoved, this);
if (this._probeSet)
this._removeProbeSet(this._probeSet);
// Protected
- get listenerSet() { return this._listenerSet; }
-
updateStatus()
{
if (!this.status)
closed()
{
- console.assert(this.representedObject instanceof WI.Timeline);
- this.representedObject.removeEventListener(null, null, this);
+ this.representedObject.removeEventListener(WI.Timeline.Event.RecordAdded, this._cpuTimelineRecordAdded, this);
}
reset()
detached()
{
- this.representedObject.removeEventListener(null, null, this);
- this.representedObject.shaderProgramCollection.removeEventListener(null, null, this);
+ this.representedObject.removeEventListener(WI.Canvas.Event.MemoryChanged, this._updateMemoryCost, this);
+ this.representedObject.removeEventListener(WI.Canvas.Event.RecordingStarted, this.needsLayout, this);
+ this.representedObject.removeEventListener(WI.Canvas.Event.RecordingProgress, this.needsLayout, this);
+ this.representedObject.removeEventListener(WI.Canvas.Event.RecordingStopped, this.needsLayout, this);
+ this.representedObject.shaderProgramCollection.removeEventListener(WI.Collection.Event.ItemAdded, this.needsLayout, this);
+ this.representedObject.shaderProgramCollection.removeEventListener(WI.Collection.Event.ItemRemoved, this.needsLayout, this);
if (this._canvasNode) {
- this._canvasNode.removeEventListener(null, null, this);
+ this._canvasNode.removeEventListener(WI.DOMNode.Event.AttributeModified, this._refreshPixelSize, this);
+ this._canvasNode.removeEventListener(WI.DOMNode.Event.AttributeRemoved, this._refreshPixelSize, this);
this._canvasNode = null;
}
- WI.settings.showImageGrid.removeEventListener(null, null, this);
+ WI.settings.showImageGrid.removeEventListener(WI.Setting.Event.Changed, this._updateImageGrid, this);
super.detached();
}
{
WI.domManager.hideDOMNodeHighlight();
- WI.canvasManager.removeEventListener(null, null, this);
+ WI.canvasManager.removeEventListener(WI.CanvasManager.Event.RecordingSaved, this._handleRecordingSaved, this);
- WI.settings.canvasRecordingAutoCaptureFrameCount.removeEventListener(null, null, this);
- WI.settings.canvasRecordingAutoCaptureEnabled.removeEventListener(null, null, this);
+ WI.settings.canvasRecordingAutoCaptureFrameCount.removeEventListener(WI.Setting.Event.Changed, this._handleCanvasRecordingAutoCaptureFrameCountChanged, this);
+ WI.settings.canvasRecordingAutoCaptureEnabled.removeEventListener(WI.Setting.Event.Changed, this._handleCanvasRecordingAutoCaptureEnabledChanged, this);
super.detached();
}
return;
if (this._canvas) {
- this._canvas.removeEventListener(null, null, this);
- this._canvas.recordingCollection.removeEventListener(null, null, this);
+ this._canvas.removeEventListener(WI.Canvas.Event.RecordingStarted, this._updateRecordNavigationItem, this);
+ this._canvas.removeEventListener(WI.Canvas.Event.RecordingStopped, this._updateRecordNavigationItem, this);
+ this._canvas.recordingCollection.removeEventListener(WI.Collection.Event.ItemAdded, this._recordingAdded, this);
+ this._canvas.recordingCollection.removeEventListener(WI.Collection.Event.ItemRemoved, this._recordingRemoved, this);
}
this._canvas = canvas;
+
if (this._canvas) {
this._canvas.addEventListener(WI.Canvas.Event.RecordingStarted, this._updateRecordNavigationItem, this);
this._canvas.addEventListener(WI.Canvas.Event.RecordingStopped, this._updateRecordNavigationItem, this);
if (recording === this._recording)
return;
- if (this._recording)
- this._recording.removeEventListener(null, null, this);
+ if (this._recording && !this._recording.ready) {
+ this._recording.removeEventListener(WI.Recording.Event.ProcessedAction, this._handleRecordingProcessedAction, this);
+ this._recording.removeEventListener(WI.Recording.Event.StartProcessingFrame, this._handleRecordingStartProcessingFrame, this);
+ }
if (recording)
this.canvas = recording.source;
hidden()
{
- this.contentBrowser.removeEventListener(null, null, this);
+ this.contentBrowser.removeEventListener(WI.ContentBrowser.Event.CurrentRepresentedObjectsDidChange, this.updateRepresentedObjects, this);
super.hidden();
}
}
if (this._recording.ready) {
- this._recording.removeEventListener(null, null, this);
+ this._recording.removeEventListener(WI.Recording.Event.ProcessedAction, this._handleRecordingProcessedAction, this);
+ this._recording.removeEventListener(WI.Recording.Event.StartProcessingFrame, this._handleRecordingStartProcessingFrame, this);
if (this._recordingProcessingOptionsContainer) {
this._recordingProcessingOptionsContainer.remove();
this._contentViewContainer.closeAllContentViews();
- WI.ContentView.removeEventListener(null, null, this);
+ WI.ContentView.removeEventListener(WI.ContentView.Event.SelectionPathComponentsDidChange, this._contentViewSelectionPathComponentDidChange, this);
+ WI.ContentView.removeEventListener(WI.ContentView.Event.SupplementalRepresentedObjectsDidChange, this._contentViewSupplementalRepresentedObjectsDidChange, this);
+ WI.ContentView.removeEventListener(WI.ContentView.Event.NumberOfSearchResultsDidChange, this._contentViewNumberOfSearchResultsDidChange, this);
}
canGoBack()
if (options[codeMirrorOption] !== undefined)
return;
- setting.addEventListener(WI.Setting.Event.Changed, (event) => {
- codeMirror.setOption(codeMirrorOption, setting.value);
- });
+ setting.addEventListener(WI.Setting.Event.Changed, function(event) {
+ this.setOption(codeMirrorOption, setting.value);
+ }, codeMirror);
}
listenForChange(WI.settings.indentWithTabs, "indentWithTabs");
listenForChange(WI.settings.indentUnit, "indentUnit");
contentView.hidden();
}
- contentView.removeEventListener(null, null, this);
-
if (!this.subviews.length)
this.showContentPlaceholder();
}
detached()
{
- this.representedObject.removeEventListener(null, null, this);
+ this.representedObject.removeEventListener(WI.Collection.Event.ItemAdded, this._handleItemAdded, this);
+ this.representedObject.removeEventListener(WI.Collection.Event.ItemRemoved, this._handleItemRemoved, this);
super.detached();
}
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();
+ }, this._toggleDrawerButton);
this.navigationBar.insertNavigationItem(this._toggleDrawerButton, 0);
this.collapsed = true;
if (this._objectTree instanceof WI.ObjectTreeView)
this._objectTree.resetPropertyPath();
- // FIXME: <https://webkit.org/b/196956> Web Inspector: use weak collections for holding event listeners
- WI.settings.consoleSavedResultAlias.removeEventListener(null, null, this);
-
WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.BlackboxChanged, this._handleDebuggerBlackboxChanged, this);
}
function updateSavedVariableText() {
savedVariableElement.textContent = " = " + WI.RuntimeManager.preferredSavedResultPrefix() + savedResultIndex;
}
- WI.settings.consoleSavedResultAlias.addEventListener(WI.Setting.Event.Changed, updateSavedVariableText, this);
+ WI.settings.consoleSavedResultAlias.addEventListener(WI.Setting.Event.Changed, updateSavedVariableText, savedVariableElement);
updateSavedVariableText();
if (this._objectTree)
let propertyPath = new WI.PropertyPath(object, prefixSavedResultIndex());
- // FIXME: <https://webkit.org/b/196956> Web Inspector: use weak collections for holding event listeners
- WI.settings.consoleSavedResultAlias.addEventListener(WI.Setting.Event.Changed, (event) => {
- propertyPath.pathComponent = prefixSavedResultIndex();
- }, this);
+ WI.settings.consoleSavedResultAlias.addEventListener(WI.Setting.Event.Changed, function(event) {
+ this.pathComponent = prefixSavedResultIndex();
+ }, propertyPath);
return propertyPath;
}
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]);
let currentContentView = this.currentContentView;
if (currentContentView?.supportsSearch) {
currentContentView.performSearch(this._findBanner.searchQuery);
- await currentContentView.awaitEvent(WI.ContentView.Event.NumberOfSearchResultsDidChange);
+ await currentContentView.awaitEvent(WI.ContentView.Event.NumberOfSearchResultsDidChange, this);
if (this._findBanner.searchQuery !== searchQuery || this.currentContentView !== currentContentView)
return;
}
let currentContentView = this.currentContentView;
if (currentContentView?.supportsSearch) {
currentContentView.performSearch(this._findBanner.searchQuery);
- await currentContentView.awaitEvent(WI.ContentView.Event.NumberOfSearchResultsDidChange);
+ await currentContentView.awaitEvent(WI.ContentView.Event.NumberOfSearchResultsDidChange, this);
if (this._findBanner.searchQuery !== searchQuery || this.currentContentView !== currentContentView)
return;
}
let image = WI.resolvedLayoutDirection() === WI.LayoutDirection.RTL ? "Images/ToggleRightSidebar.svg" : "Images/ToggleLeftSidebar.svg";
this._showNavigationSidebarItem = new WI.ActivateButtonNavigationItem("toggle-navigation-sidebar", showToolTip, hideToolTip, image, 16, 16);
- this._showNavigationSidebarItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI.toggleNavigationSidebar, WI);
+ this._showNavigationSidebarItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI.toggleNavigationSidebar, this);
this._showNavigationSidebarItem.activated = !WI.navigationSidebar.collapsed;
this._showNavigationSidebarItem.visibilityPriority = WI.NavigationItem.VisibilityPriority.High;
let image = WI.resolvedLayoutDirection() === WI.LayoutDirection.RTL ? "Images/ToggleLeftSidebar.svg" : "Images/ToggleRightSidebar.svg";
this._showDetailsSidebarItem = new WI.ActivateButtonNavigationItem("toggle-details-sidebar", showToolTip, hideToolTip, image, 16, 16);
- this._showDetailsSidebarItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI.toggleDetailsSidebar, WI);
+ this._showDetailsSidebarItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, WI.toggleDetailsSidebar, this);
this._showDetailsSidebarItem.activated = !WI.detailsSidebar.collapsed;
this._showDetailsSidebarItem.enabled = false;
this._showDetailsSidebarItem.visibilityPriority = WI.NavigationItem.VisibilityPriority.High;
{
super.closed();
- WI.navigationSidebar.removeEventListener(null, null, this);
- WI.detailsSidebar.removeEventListener(null, null, this);
+ if (this._navigationSidebarPanelConstructor)
+ WI.navigationSidebar.removeEventListener(WI.Sidebar.Event.CollapsedStateDidChange, this._navigationSidebarCollapsedStateDidChange, this);
+
+ if (this._detailsSidebarPanelConstructors.length) {
+ WI.detailsSidebar.removeEventListener(WI.Sidebar.Event.CollapsedStateDidChange, this._detailsSidebarCollapsedStateDidChange, this);
+ WI.detailsSidebar.removeEventListener(WI.Sidebar.Event.SidebarPanelSelected, this._detailsSidebarPanelSelected, this);
+ }
if (this.navigationSidebarPanel && typeof this.navigationSidebarPanel.closed === "function")
this.navigationSidebarPanel.closed();
closed()
{
- WI.domManager.removeEventListener(null, null, this);
+ if (this.didInitialLayout) {
+ WI.domManager.removeEventListener(WI.DOMManager.Event.AttributeModified, this._attributesChanged, this);
+ WI.domManager.removeEventListener(WI.DOMManager.Event.AttributeRemoved, this._attributesChanged, this);
+ WI.domManager.removeEventListener(WI.DOMManager.Event.CharacterDataModified, this._characterDataModified, this);
+ WI.domManager.removeEventListener(WI.DOMManager.Event.CustomElementStateChanged, this._customElementStateChanged, this);
+ }
super.closed();
}
{
super.closed();
- WI.settings.showRulers.removeEventListener(null, null, this);
- WI.debuggerManager.removeEventListener(null, null, this);
- WI.domManager.removeEventListener(null, null, this);
- WI.domDebuggerManager.removeEventListener(null, null, this);
- WI.DOMBreakpoint.removeEventListener(null, null, this);
+ WI.settings.showRulers.removeEventListener(WI.Setting.Event.Changed, this._showRulersChanged, this);
+
+ WI.domManager.removeEventListener(WI.DOMManager.Event.AttributeModified, this._domNodeChanged, this);
+ WI.domManager.removeEventListener(WI.DOMManager.Event.AttributeRemoved, this._domNodeChanged, this);
+ WI.domManager.removeEventListener(WI.DOMManager.Event.CharacterDataModified, this._domNodeChanged, this);
+
+ WI.cssManager.removeEventListener(WI.CSSManager.Event.DefaultAppearanceDidChange, this._defaultAppearanceDidChange, this);
+
+ if (WI.domDebuggerManager.supported) {
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.BreakpointsEnabledDidChange, this._breakpointsEnabledDidChange, this);
+
+ WI.domDebuggerManager.removeEventListener(WI.DOMDebuggerManager.Event.DOMBreakpointAdded, this._domBreakpointAddedOrRemoved, this);
+ WI.domDebuggerManager.removeEventListener(WI.DOMDebuggerManager.Event.DOMBreakpointRemoved, this._domBreakpointAddedOrRemoved, this);
+
+ WI.DOMBreakpoint.removeEventListener(WI.Breakpoint.Event.DisabledStateDidChange, this._handleDOMBreakpointDisabledStateChanged, this);
+ WI.DOMBreakpoint.removeEventListener(WI.DOMBreakpoint.Event.DOMNodeWillChange, this._handleDOMBreakpointDOMNodeWillChange, this);
+ WI.DOMBreakpoint.removeEventListener(WI.DOMBreakpoint.Event.DOMNodeDidChange, this._handleDOMBreakpointDOMNodeDidChange, this);
+ }
this._domTreeOutline.close();
this._pendingBreakpointNodes.clear();
WI.DOMTreeUpdater.prototype = {
close: function()
{
- WI.domManager.removeEventListener(null, null, this);
+ WI.domManager.removeEventListener(WI.DOMManager.Event.NodeInserted, this._nodeInserted, this);
+ WI.domManager.removeEventListener(WI.DOMManager.Event.NodeRemoved, this._nodeRemoved, this);
+ WI.domManager.removeEventListener(WI.DOMManager.Event.AttributeModified, this._attributesUpdated, this);
+ WI.domManager.removeEventListener(WI.DOMManager.Event.AttributeRemoved, this._attributesUpdated, this);
+ WI.domManager.removeEventListener(WI.DOMManager.Event.CharacterDataModified, this._characterDataModified, this);
+ WI.domManager.removeEventListener(WI.DOMManager.Event.DocumentUpdated, this._documentUpdated, this);
+ WI.domManager.removeEventListener(WI.DOMManager.Event.ChildNodeCountUpdated, this._childNodeCountUpdated, this);
},
_documentUpdated: function(event)
insertionIndex = this.orderedColumns.length;
insertionIndex = Number.constrain(insertionIndex, 0, this.orderedColumns.length);
- var listeners = new WI.EventListenerSet(this, "DataGrid column DOM listeners");
-
// Copy configuration properties instead of keeping a reference to the passed-in object.
var column = Object.shallowCopy(columnData);
- column["listeners"] = listeners;
column["ordinal"] = insertionIndex;
column["columnIdentifier"] = columnIdentifier;
}
if (column["sortable"]) {
- listeners.register(headerCellElement, "click", this._headerCellClicked);
+ headerCellElement.addEventListener("click", this._headerCellClicked.bind(this));
headerCellElement.classList.add(WI.DataGrid.SortableColumnStyleClassName);
}
var collapseDiv = headerCellElement.createChild("div", "collapser-button");
collapseDiv.title = this._collapserButtonCollapseColumnsToolTip();
- listeners.register(collapseDiv, "mouseover", this._mouseoverColumnCollapser);
- listeners.register(collapseDiv, "mouseout", this._mouseoutColumnCollapser);
- listeners.register(collapseDiv, "click", this._clickInColumnCollapser);
+ collapseDiv.addEventListener("mouseover", this._mouseoverColumnCollapser.bind(this));
+ collapseDiv.addEventListener("mouseout", this._mouseoutColumnCollapser.bind(this));
+ collapseDiv.addEventListener("click", this._clickInColumnCollapser.bind(this));
headerCellElement.collapsesGroup = column["collapsesGroup"];
headerCellElement.classList.add("collapser");
var referenceElement = this._fillerRowElement.children[insertionIndex];
this._fillerRowElement.insertBefore(fillerCellElement, referenceElement);
- listeners.install();
-
this.setColumnVisible(columnIdentifier, !column.hidden);
}
column["ordinal"] = ordinal - 1;
}
- removedColumn["listeners"].uninstall(true);
-
if (removedColumn["disclosure"])
this.disclosureColumnIdentifier = undefined;
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();
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) {
this._expanded = true;
- this.dispatchEventToListeners("expanded");
-
if (this.dataGrid) {
this.dataGrid.dispatchEventToListeners(WI.DataGrid.Event.ExpandedNode, {dataGridNode: this});
this.dataGrid._noteRowsChanged();
}
this.dataGrid.updateVisibleRows(this);
-
- this.dispatchEventToListeners("revealed");
}
select(suppressSelectedEvent)
traverseNextNode(skipHidden, stayWithin, dontPopulate, info)
{
if (!dontPopulate && this.hasChildren)
- this.dispatchEventToListeners("populate");
+ this.dispatchEventToListeners(DataGridNode.Event.Populate);
if (info)
info.depthChange = 0;
{
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;
}
}
};
+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
{
{
super.closed();
- WI.networkManager.removeEventListener(null, null, this);
- WI.Frame.removeEventListener(null, null, this);
+ WI.networkManager.removeEventListener(WI.NetworkManager.Event.MainFrameDidChange, this._mainFrameDidChange, this);
+ WI.Frame.removeEventListener(WI.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this);
}
get allowMultipleDetailSidebars()
closed()
{
- this._domTree.removeEventListener(null, null, this);
+ this._domTree.removeEventListener(WI.DOMTree.Event.RootDOMNodeInvalidated, this._rootDOMNodeInvalidated, this);
super.closed();
}
if (!effectiveDOMNode)
return;
- effectiveDOMNode.removeEventListener(null, null, this);
+ effectiveDOMNode.removeEventListener(WI.DOMNode.Event.EnabledPseudoClassesChanged, this._updatePseudoClassCheckboxes, this);
+ effectiveDOMNode.removeEventListener(WI.DOMNode.Event.AttributeModified, this._handleNodeAttributeModified, this);
+ effectiveDOMNode.removeEventListener(WI.DOMNode.Event.AttributeRemoved, this._handleNodeAttributeRemoved, this);
}
initialLayout()
timeline.addEventListener(WI.Timeline.Event.RecordAdded, this._heapAllocationsTimelineRecordAdded, this);
WI.HeapSnapshotProxy.addEventListener(WI.HeapSnapshotProxy.Event.Invalidated, this._heapSnapshotInvalidated, this);
- WI.HeapSnapshotWorkerProxy.singleton().addEventListener("HeapSnapshot.CollectionEvent", this._heapSnapshotCollectionEvent, this);
+ WI.HeapSnapshotWorkerProxy.singleton().addEventListener(WI.HeapSnapshotWorkerProxy.Event.Collection, this._heapSnapshotCollectionEvent, this);
}
// Public
closed()
{
- console.assert(this.representedObject instanceof WI.Timeline);
- this.representedObject.removeEventListener(null, null, this);
+ this.representedObject.removeEventListener(WI.Timeline.Event.RecordAdded, this._heapAllocationsTimelineRecordAdded, this);
this._dataGrid.closed();
this._contentViewContainer.closeAllContentViews();
- WI.ContentView.removeEventListener(null, null, this);
- WI.HeapSnapshotProxy.removeEventListener(null, null, this);
- WI.HeapSnapshotWorkerProxy.singleton().removeEventListener("HeapSnapshot.CollectionEvent", this._heapSnapshotCollectionEvent, this);
+ WI.ContentView.removeEventListener(WI.ContentView.Event.SelectionPathComponentsDidChange, this._contentViewSelectionPathComponentDidChange, this);
+ WI.HeapSnapshotProxy.removeEventListener(WI.HeapSnapshotProxy.Event.Invalidated, this._heapSnapshotInvalidated, this);
+ WI.HeapSnapshotWorkerProxy.singleton().removeEventListener(WI.HeapSnapshotWorkerProxy.Event.Collection, this._heapSnapshotCollectionEvent, this);
}
layout()
this._batched = false;
this._instances = null;
- this.addEventListener("populate", this._populate, this);
+ this.addEventListener(WI.DataGridNode.Event.Populate, this._populate, this);
}
// Protected
_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
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";
this._base = base || null;
if (hasChildren)
- this.addEventListener("populate", this._populate, this);
+ this.addEventListener(WI.DataGridNode.Event.Populate, this._populate, this);
}
// Static
_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) : "";
super.hidden();
}
- closed()
- {
- WI.networkManager.removeEventListener(null, null, this);
-
- super.closed();
- }
-
// DropZoneView delegate
dropZoneShouldAppearForDragEvent(dropZone, event)
if (this._valueEditor.removeListeners)
this._valueEditor.removeListeners();
- if (this._valueEditor instanceof WI.Object)
- this._valueEditor.removeEventListener(null, null, this);
+ if (this._valueEditor instanceof WI.BezierEditor)
+ this._valueEditor.removeEventListener(WI.BezierEditor.Event.BezierChanged, this._valueEditorValueDidChange, this);
+ else if (this._valueEditor instanceof WI.BoxShadowEditor)
+ this._valueEditor.removeEventListener(WI.BoxShadowEditor.Event.BoxShadowChanged, this._valueEditorValueDidChange, this);
+ else if (this._valueEditor instanceof WI.ColorPicker)
+ this._valueEditor.removeEventListener(WI.ColorPicker.Event.ColorChanged, this._valueEditorValueDidChange, this);
+ else if (this._valueEditor instanceof WI.GradientEditor)
+ this._valueEditor.removeEventListener(WI.GradientEditor.Event.GradientChanged, this._valueEditorValueDidChange, this);
+ else if (this._valueEditor instanceof WI.SpringEditor)
+ this._valueEditor.removeEventListener(WI.SpringEditor.Event.SpringChanged, this._valueEditorValueDidChange, this);
this._valueEditor = null;
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) {
+ this.update();
+ }, popover);
break;
case WI.InlineSwatch.Type.Image:
title = breakpoint.displayName;
super(breakpoint, {classNames, title});
-
- if (!breakpoint.special) {
- this.listenerSet.register(breakpoint, WI.JavaScriptBreakpoint.Event.LocationDidChange, this._breakpointLocationDidChange);
- this._updateTitles();
- }
- this.listenerSet.register(breakpoint, WI.JavaScriptBreakpoint.Event.ResolvedStateDidChange, this.updateStatus);
}
// Public
return {text: [this.breakpoint.contentIdentifier]};
}
+ onattach()
+ {
+ super.onattach();
+
+ if (!this.breakpoint.special) {
+ this.breakpoint.addEventListener(WI.JavaScriptBreakpoint.Event.LocationDidChange, this._breakpointLocationDidChange, this);
+ this._updateTitles();
+ }
+ this.breakpoint.addEventListener(WI.JavaScriptBreakpoint.Event.ResolvedStateDidChange, this.updateStatus, this);
+ }
+
+ ondetach()
+ {
+ if (!this.breakpoint.special)
+ this.breakpoint.removeEventListener(WI.JavaScriptBreakpoint.Event.LocationDidChange, this._breakpointLocationDidChange, this);
+ this.breakpoint.removeEventListener(WI.JavaScriptBreakpoint.Event.ResolvedStateDidChange, this.updateStatus, this);
+
+ super.ondetach();
+ }
+
// Private
_updateTitles()
closed()
{
- console.assert(this.representedObject instanceof WI.Timeline);
- this.representedObject.removeEventListener(null, null, this);
+ this.representedObject.removeEventListener(WI.Timeline.Event.RecordAdded, this._layoutTimelineRecordAdded, this);
this._dataGrid.closed();
}
detached()
{
- WI.networkManager.removeEventListener(null, null, this);
+ WI.networkManager.removeEventListener(WI.NetworkManager.Event.LocalResourceOverrideAdded, this._handleLocalResourceOverrideAddedOrRemoved, this);
+ WI.networkManager.removeEventListener(WI.NetworkManager.Event.LocalResourceOverrideRemoved, this._handleLocalResourceOverrideAddedOrRemoved, this);
super.detached();
}
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;
- });
+ }, this);
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;
- });
+ }, this);
WI.settings.emulateInUserGesture.addEventListener(WI.Setting.Event.Changed, this._handleEmulateInUserGestureSettingChanged, this);
this._checkboxesNavigationItemGroup = new WI.GroupNavigationItem([this._preserveLogNavigationItem, this._emulateInUserGestureNavigationItem, new WI.DividerNavigationItem]);
if (isNaN(record.startTime)) {
this._recordsWithoutStartTime.add(record);
- record.singleFireEventListener(WI.TimelineRecord.Event.Updated, (event) => {
+ record.singleFireEventListener(WI.TimelineRecord.Event.Updated, function(event) {
this._processRecord(record);
this.needsLayout();
- });
+ }, this);
return;
}
closed()
{
- console.assert(this.representedObject instanceof WI.Timeline);
- this.representedObject.removeEventListener(null, null, this);
+ this.representedObject.removeEventListener(WI.Timeline.Event.RecordAdded, this._memoryTimelineRecordAdded, this);
}
reset()
set scopeBarItems(scopeBarItems)
{
if (this._scopeBarItems) {
- for (var scopeBarItem of this._scopeBarItems)
- scopeBarItem.removeEventListener(null, null, this);
+ for (var scopeBarItem of this._scopeBarItems) {
+ scopeBarItem.removeEventListener(WI.ScopeBarItem.Event.SelectionChanged, this._itemSelectionDidChange, this);
+ scopeBarItem.removeEventListener(WI.ScopeBarItem.Event.HiddenChanged, this._handleItemHiddenChanged, this);
+ }
}
this._scopeBarItems = scopeBarItems || [];
closed()
{
window.removeEventListener("resize", this._boundUpdateContentOverflowShadowVisibilitySoon);
- WI.Frame.removeEventListener(null, null, this);
+
+ if (this._shouldAutoPruneStaleTopLevelResourceTreeElements) {
+ WI.Frame.removeEventListener(WI.Frame.Event.MainResourceDidChange, this._checkForStaleResources, this);
+ WI.Frame.removeEventListener(WI.Frame.Event.ChildFrameWasRemoved, this._checkForStaleResources, this);
+ WI.Frame.removeEventListener(WI.Frame.Event.ResourceWasRemoved, this._checkForStaleResources, this);
+ }
}
get contentBrowser()
initialLayout()
{
let closeNavigationItem = new WI.ButtonNavigationItem("close", WI.UIString("Close detail view"), "Images/CloseLarge.svg", 16, 16);
- closeNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, this._handleCloseButton.bind(this));
+ closeNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, this._handleCloseButton, this);
closeNavigationItem.visibilityPriority = WI.NavigationItem.VisibilityPriority.High;
let contentViewNavigationItemsGroup = new WI.GroupNavigationItem;
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;
+ }, this);
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);
}
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);
this._hidePopover();
this._hideDetailView();
- WI.Target.removeEventListener(null, null, this);
- WI.Frame.removeEventListener(null, null, this);
- WI.Resource.removeEventListener(null, null, this);
- WI.settings.resourceCachingDisabled.removeEventListener(null, null, this);
- WI.settings.clearNetworkOnNavigate.removeEventListener(null, null, this);
+ WI.settings.clearNetworkOnNavigate.removeEventListener(WI.Setting.Event.Changed, this._clearNetworkOnNavigateSettingChanged, this);
+
+ // COMPATIBILITY (iOS 10.3): Network.setDisableResourceCaching did not exist.
+ if (InspectorBackend.hasCommand("Network.setResourceCachingDisabled"))
+ WI.settings.resourceCachingDisabled.removeEventListener(WI.Setting.Event.Changed, this._resourceCachingDisabledSettingChanged, this);
+
+ WI.Target.removeEventListener(WI.Target.Event.ResourceAdded, this._handleResourceAdded, this);
+ WI.Frame.removeEventListener(WI.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this);
+ WI.Frame.removeEventListener(WI.Frame.Event.ResourceWasAdded, this._handleResourceAdded, this);
+ WI.Frame.removeEventListener(WI.Frame.Event.ChildFrameWasAdded, this._handleFrameWasAdded, this);
+ WI.Resource.removeEventListener(WI.Resource.Event.LoadingDidFinish, this._resourceLoadingDidFinish, this);
+ WI.Resource.removeEventListener(WI.Resource.Event.LoadingDidFail, this._resourceLoadingDidFail, this);
+ WI.Resource.removeEventListener(WI.Resource.Event.SizeDidChange, this._handleResourceSizeDidChange, this);
+ WI.Resource.removeEventListener(WI.Resource.Event.TransferSizeDidChange, this._resourceTransferSizeDidChange, this);
WI.networkManager.removeEventListener(WI.NetworkManager.Event.MainFrameDidChange, this._mainFrameDidChange, this);
super.closed();
closed()
{
- console.assert(this.representedObject instanceof WI.Timeline);
- this.representedObject.removeEventListener(null, null, this);
+ this.representedObject.removeEventListener(WI.Timeline.Event.RecordAdded, this._networkTimelineRecordAdded, this);
this._dataGrid.closed();
}
button.addEventListener("click", (event) => {
event.stop();
- representation.singleFireEventListener(ObjectTreeView.Event.Updated, () => {
+ representation.singleFireEventListener(ObjectTreeView.Event.Updated, function(event) {
// The `treeElement` may have already been removed by some other means (e.g. `removeChildren`).
if (treeElement.parent === parentTreeElement)
parentTreeElement.removeChild(treeElement);
- });
+ }, button);
for (let other of buttons)
other.disabled = true;
closed()
{
for (let timeline of this._recording.timelines.values())
- timeline.removeEventListener(null, null, this);
+ timeline.removeEventListener(WI.Timeline.Event.RecordAdded, this._handleTimelineRecordAdded, this);
- this._recording.removeEventListener(null, null, this);
+ this._recording.removeEventListener(WI.TimelineRecording.Event.SourceCodeTimelineAdded, this._sourceCodeTimelineAdded, this);
+ this._recording.removeEventListener(WI.TimelineRecording.Event.MarkerAdded, this._markerAdded, this);
+ this._recording.removeEventListener(WI.TimelineRecording.Event.Reset, this._recordingReset, this);
}
get navigationItems()
closed()
{
- WI.debuggerManager.removeEventListener(null, null, this);
+ if (this.didInitialLayout) {
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.ProbeSetAdded, this._probeSetAdded, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.ProbeSetRemoved, this._probeSetRemoved, this);
+ }
super.closed();
}
this._lastUpdatedFrame = null;
this._nodesSinceLastNavigation = [];
- this._listenerSet = new WI.EventListenerSet(this, "ProbeSetDataGrid instance listeners");
- this._listenerSet.register(probeSet, WI.ProbeSet.Event.ProbeAdded, this._setupProbe);
- this._listenerSet.register(probeSet, WI.ProbeSet.Event.ProbeRemoved, this._teardownProbe);
- this._listenerSet.register(probeSet, WI.ProbeSet.Event.SamplesCleared, this._setupData);
- this._listenerSet.register(WI.Probe, WI.Probe.Event.ExpressionChanged, this._probeExpressionChanged);
- this._listenerSet.install();
+ probeSet.addEventListener(WI.ProbeSet.Event.ProbeAdded, this._setupProbe, this);
+ probeSet.addEventListener(WI.ProbeSet.Event.ProbeRemoved, this._teardownProbe, this);
+ probeSet.addEventListener(WI.ProbeSet.Event.SamplesCleared, this._setupData, this);
+
+ WI.Probe.addEventListener(WI.Probe.Event.ExpressionChanged, this._probeExpressionChanged, this);
this._setupData();
}
for (var probe of this.probeSet)
this._teardownProbe(probe);
- this._listenerSet.uninstall(true);
+ this.probeSet.removeEventListener(WI.ProbeSet.Event.ProbeAdded, this._setupProbe, this);
+ this.probeSet.removeEventListener(WI.ProbeSet.Event.ProbeRemoved, this._teardownProbe, this);
+ this.probeSet.removeEventListener(WI.ProbeSet.Event.SamplesCleared, this._setupData, this);
+
+ WI.Probe.removeEventListener(WI.Probe.Event.ExpressionChanged, this._probeExpressionChanged, this);
}
// Private
for (var frame of this._data.frames)
this._updateNodeForFrame(frame);
- this._dataListeners = new WI.EventListenerSet(this, "ProbeSetDataGrid data table listeners");
- this._dataListeners.register(this._data, WI.ProbeSetDataTable.Event.FrameInserted, this._dataFrameInserted);
- this._dataListeners.register(this._data, WI.ProbeSetDataTable.Event.SeparatorInserted, this._dataSeparatorInserted);
- this._dataListeners.register(this._data, WI.ProbeSetDataTable.Event.WillRemove, this._teardownData);
- this._dataListeners.install();
+ this._data.addEventListener(WI.ProbeSetDataTable.Event.FrameInserted, this._dataFrameInserted, this);
+ this._data.addEventListener(WI.ProbeSetDataTable.Event.SeparatorInserted, this._dataSeparatorInserted, this);
+ this._data.addEventListener(WI.ProbeSetDataTable.Event.WillRemove, this._teardownData, this);
}
_teardownData()
{
- this._dataListeners.uninstall(true);
+ this._data.removeEventListener(WI.ProbeSetDataTable.Event.FrameInserted, this._dataFrameInserted, this);
+ this._data.removeEventListener(WI.ProbeSetDataTable.Event.SeparatorInserted, this._dataSeparatorInserted, this);
+ this._data.removeEventListener(WI.ProbeSetDataTable.Event.WillRemove, this._teardownData, this);
+
this.removeChildren();
this._frameNodes = new Map;
this._lastUpdatedFrame = null;
this.element.classList.add("probe-set");
- this._listenerSet = new WI.EventListenerSet(this, "ProbeSetDetailsSection UI listeners");
this._probeSet = probeSet;
this._dataGrid = dataGrid;
this._removeProbeButtonItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, this._removeProbeButtonClicked, this);
this._navigationBar.addNavigationItem(this._removeProbeButtonItem);
- this._listenerSet.register(this._probeSet, WI.ProbeSet.Event.SampleAdded, this._probeSetSamplesChanged);
- this._listenerSet.register(this._probeSet, WI.ProbeSet.Event.SamplesCleared, this._probeSetSamplesChanged);
+ this._probeSet.addEventListener(WI.ProbeSet.Event.SampleAdded, this._probeSetSamplesChanged, this);
+ this._probeSet.addEventListener(WI.ProbeSet.Event.SamplesCleared, this._probeSetSamplesChanged, this);
if (this._probeSet.breakpoint instanceof WI.JavaScriptBreakpoint) {
// Update the source link when the breakpoint's resolved state changes,
// so that it can become a live location link when possible.
this._updateLinkElement();
- this._listenerSet.register(this._probeSet.breakpoint, WI.JavaScriptBreakpoint.Event.ResolvedStateDidChange, this._updateLinkElement);
+ this._probeSet.breakpoint.addEventListener(WI.JavaScriptBreakpoint.Event.ResolvedStateDidChange, this._updateLinkElement, this);
}
- this._listenerSet.install();
}
// Public
closed()
{
- this._listenerSet.uninstall(true);
+ this._probeSet.removeEventListener(WI.ProbeSet.Event.SampleAdded, this._probeSetSamplesChanged, this);
+ this._probeSet.removeEventListener(WI.ProbeSet.Event.SamplesCleared, this._probeSetSamplesChanged, this);
+
+ if (this._probeSet.breakpoint instanceof WI.JavaScriptBreakpoint)
+ this._probeSet.breakpoint.removeEventListener(WI.JavaScriptBreakpoint.Event.ResolvedStateDidChange, this._updateLinkElement, this);
+
this.element.remove();
}
this._childrenToChargeToSelf = new Set;
this._extraSelfTimeFromChargedChildren = 0;
- this.addEventListener("populate", this._populate, this);
+ this.addEventListener(WI.DataGridNode.Event.Populate, this._populate, this);
this._updateChildrenForModifiers();
this._recalculateData();
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)) {
this._profileNode = profileNode;
- this.addEventListener("populate", this._populate, this);
+ this.addEventListener(WI.DataGridNode.Event.Populate, this._populate, this);
}
// Public
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)
closed()
{
- WI.settings.consoleSavedResultAlias.removeEventListener(null, null, this);
- WI.Frame.removeEventListener(null, null, this);
- WI.debuggerManager.removeEventListener(null, null, this);
- WI.runtimeManager.removeEventListener(null, null, this);
- WI.targetManager.removeEventListener(null, null, this);
- WI.consoleDrawer.removeEventListener(null, null, this);
- WI.TabBrowser.removeEventListener(null, null, this);
+ WI.settings.consoleSavedResultAlias.removeEventListener(WI.Setting.Event.Changed, this._handleConsoleSavedResultAliasSettingChanged, this);
+ WI.settings.engineeringShowInternalExecutionContexts.removeEventListener(WI.Setting.Event.Changed, this._handleEngineeringShowInternalExecutionContextsSettingChanged, this);
+
+ WI.Frame.removeEventListener(WI.Frame.Event.PageExecutionContextChanged, this._handleFramePageExecutionContextChanged, this);
+ WI.Frame.removeEventListener(WI.Frame.Event.ExecutionContextsCleared, this._handleFrameExecutionContextsCleared, this);
+
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.ActiveCallFrameDidChange, this._handleDebuggerActiveCallFrameDidChange, this);
+
+ WI.runtimeManager.removeEventListener(WI.RuntimeManager.Event.ActiveExecutionContextChanged, this._handleActiveExecutionContextChanged, this);
+
+ WI.notifications.removeEventListener(WI.Notification.TransitionPageTarget, this._handleTransitionPageTarget, this);
+
+ WI.targetManager.removeEventListener(WI.TargetManager.Event.TargetRemoved, this._handleTargetRemoved, this);
+
+ WI.domManager.removeEventListener(WI.DOMManager.Event.InspectedNodeChanged, this._handleInspectedNodeChanged, this);
+
+ WI.consoleDrawer.removeEventListener(WI.ConsoleDrawer.Event.CollapsedStateChanged, this._updateStyles, this);
+ WI.TabBrowser.removeEventListener(WI.TabBrowser.Event.SelectedTabContentViewDidChange, this._updateStyles, this);
super.closed();
}
this._copyText = copyText;
if (this.representedObject.valid)
- this.representedObject.addEventListener(WI.RecordingAction.Event.ValidityChanged, this._handleValidityChanged, this);
+ this.representedObject.singleFireEventListener(WI.RecordingAction.Event.ValidityChanged, this._handleValidityChanged, this);
}
// Static
_handleValidityChanged(event)
{
this.addClassName("invalid");
-
- this.representedObject.removeEventListener(null, null, this);
}
};
this._updateSliderValue();
if (this.representedObject.ready)
- this.representedObject.removeEventListener(null, null, this);
+ this.representedObject.removeEventListener(WI.Recording.Event.ProcessedAction, this._handleRecordingProcessedAction, this);
}
};
closed()
{
- console.assert(this.representedObject instanceof WI.Timeline);
- this.representedObject.removeEventListener(null, null, this);
+ this.representedObject.removeEventListener(WI.Timeline.Event.RecordAdded, this._renderingFrameTimelineRecordAdded, this);
this._dataGrid.closed();
}
detached()
{
- WI.settings.showImageGrid.removeEventListener(null, null, this);
+ WI.settings.showImageGrid.removeEventListener(WI.Setting.Event.Changed, this._handleShowImageGridSettingChanged, this);
super.detached();
}
contentViewRemoved(contentView)
{
this._updateImageTypeScopeBar();
+
+ contentView.removeEventListener(WI.ResourceContentView.Event.ContentError, this._handleContentError, this);
}
// Private
{
super.closed();
- if (WI.NetworkManager.supportsOverridingResponses())
- WI.networkManager.removeEventListener(null, null, this);
+ if (WI.NetworkManager.supportsOverridingResponses()) {
+ WI.networkManager.removeEventListener(WI.NetworkManager.Event.LocalResourceOverrideAdded, this._handleLocalResourceOverrideChanged, this);
+ WI.networkManager.removeEventListener(WI.NetworkManager.Event.LocalResourceOverrideRemoved, this._handleLocalResourceOverrideChanged, this);
+ }
if (!this.managesOwnIssues)
- WI.consoleManager.removeEventListener(null, null, this);
+ WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.IssueAdded, this._issueWasAdded, this);
}
// Protected
return;
if (this._resource && this._needsToRemoveResourceEventListeners) {
- this._resource.removeEventListener(null, null, this);
+ this._resource.removeEventListener(WI.Resource.Event.URLDidChange, this._refreshURL, this);
+ this._resource.removeEventListener(WI.Resource.Event.MIMETypeDidChange, this._refreshMIMEType, this);
+ this._resource.removeEventListener(WI.Resource.Event.TypeDidChange, this._refreshResourceType, this);
+ this._resource.removeEventListener(WI.Resource.Event.LoadingDidFail, this._refreshErrorReason, this);
+ this._resource.removeEventListener(WI.Resource.Event.RequestHeadersDidChange, this._refreshRequestHeaders, this);
+ this._resource.removeEventListener(WI.Resource.Event.ResponseReceived, this._refreshRequestAndResponse, this);
+ this._resource.removeEventListener(WI.Resource.Event.CacheStatusDidChange, this._refreshRequestAndResponse, this);
+ this._resource.removeEventListener(WI.Resource.Event.MetricsDidChange, this._refreshRequestAndResponse, this);
+ this._resource.removeEventListener(WI.Resource.Event.SizeDidChange, this._refreshDecodedSize, this);
+ this._resource.removeEventListener(WI.Resource.Event.TransferSizeDidChange, this._refreshTransferSize, this);
+ this._resource.removeEventListener(WI.Resource.Event.InitiatedResourcesDidChange, this._handleResourceInitiatedResourcesDidChange, this);
+
this._refreshRelatedResourcesSectionThrottler.cancel();
this._needsToRemoveResourceEventListeners = false;
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._refreshRelatedResourcesSectionThrottler.fire();
- }, this);
+ this._resource.addEventListener(WI.Resource.Event.InitiatedResourcesDidChange, this._handleResourceInitiatedResourcesDidChange, this);
this._needsToRemoveResourceEventListeners = true;
}
+
+ _handleResourceInitiatedResourcesDidChange(event)
+ {
+ this._refreshRelatedResourcesSectionThrottler.fire();
+ }
};
closed()
{
- this._resource.removeEventListener(null, null, this);
+ this._resource.removeEventListener(WI.Resource.Event.MetricsDidChange, this._resourceMetricsDidChange, this);
+ this._resource.removeEventListener(WI.Resource.Event.RequestHeadersDidChange, this._resourceRequestHeadersDidChange, this);
+ this._resource.removeEventListener(WI.Resource.Event.ResponseReceived, this._resourceResponseReceived, this);
super.closed();
}
closed()
{
- this._resource.removeEventListener(null, null, this);
+ if (this.didInitialLayout) {
+ this._resource.removeEventListener(WI.Resource.Event.ResponseReceived, this._handleResourceResponseReceived, this);
+ this._resource.removeEventListener(WI.Resource.Event.MetricsDidChange, this._handleResourceMetricsDidChange, this);
+ }
super.closed();
}
closed()
{
- this._resource.removeEventListener(null, null, this);
+ this._resource.removeEventListener(WI.Resource.Event.SizeDidChange, this._resourceSizeDidChange, this);
+ this._resource.removeEventListener(WI.Resource.Event.TransferSizeDidChange, this._resourceTransferSizeDidChange, this);
+ this._resource.removeEventListener(WI.Resource.Event.MetricsDidChange, this._resourceMetricsDidChange, this);
super.closed();
}
closed()
{
- this._resource.removeEventListener(null, null, this);
+ this._resource.removeEventListener(WI.Resource.Event.MetricsDidChange, this._resourceMetricsDidChange, this);
+ this._resource.removeEventListener(WI.Resource.Event.TimestampsDidChange, this._resourceTimestampsDidChange, this);
super.closed();
}
closed()
{
- WI.runtimeManager.removeEventListener(null, null, this);
- WI.Frame.removeEventListener(null, null, this);
- WI.debuggerManager.removeEventListener(null, null, this);
+ WI.runtimeManager.removeEventListener(WI.RuntimeManager.Event.DidEvaluate, this._didEvaluateExpression, this);
+ WI.runtimeManager.removeEventListener(WI.RuntimeManager.Event.ActiveExecutionContextChanged, this._activeExecutionContextChanged, this);
+
+ WI.Frame.removeEventListener(WI.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this);
+
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.ActiveCallFrameDidChange, this._activeCallFrameDidChange, this);
super.closed();
}
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));
}
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 = [];
{
super.closed();
- WI.settings.showJavaScriptTypeInformation.removeEventListener(null, null, this);
- WI.settings.enableControlFlowProfiler.removeEventListener(null, null, this);
+ WI.settings.showJavaScriptTypeInformation.removeEventListener(WI.Setting.Event.Changed, this._showJavaScriptTypeInformationSettingChanged, this);
+ WI.settings.enableControlFlowProfiler.removeEventListener(WI.Setting.Event.Changed, this._enableControlFlowProfilerSettingChanged, this);
this._textEditor.close();
}
closed()
{
- console.assert(this.representedObject instanceof WI.Timeline);
- this.representedObject.removeEventListener(null, null, this);
+ this.representedObject.removeEventListener(WI.Timeline.Event.RecordAdded, this._scriptTimelineRecordAdded, this);
+ this.representedObject.removeEventListener(WI.Timeline.Event.Refreshed, this._scriptTimelineRecordRefreshed, this);
this._dataGrid.closed();
}
closed()
{
- console.assert(this.representedObject instanceof WI.Timeline);
- this.representedObject.removeEventListener(null, null, this);
+ this.representedObject.removeEventListener(WI.Timeline.Event.Refreshed, this._scriptTimelineRecordRefreshed, this);
}
get navigationItems()
{
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);
+ }
this._inputContainer = this.element.appendChild(document.createElement("div"));
this._inputContainer.classList.add("search-bar");
{
super.closed();
- WI.Frame.removeEventListener(null, null, this);
+ WI.Frame.removeEventListener(WI.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this);
}
focusSearchField(performSearch)
}
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));
};
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) {
+ this.value = editor.value;
+ }, setting);
+ setting.addEventListener(WI.Setting.Event.Changed, function(event) {
+ this.value = setting.value;
+ }, editor);
return editor;
}
];
let appearanceEditor = generalSettingsView.addGroupWithCustomSetting(WI.UIString("Appearance:"), WI.SettingEditor.Type.Select, {values: appearanceValues});
appearanceEditor.value = WI.settings.frontendAppearance.value;
- appearanceEditor.addEventListener(WI.SettingEditor.Event.ValueDidChange, () => {
- WI.settings.frontendAppearance.value = appearanceEditor.value;
- }, WI.settings.frontendAppearance);
+ appearanceEditor.addEventListener(WI.SettingEditor.Event.ValueDidChange, function(event) {
+ WI.settings.frontendAppearance.value = this.value;
+ }, appearanceEditor);
generalSettingsView.addSeparator();
}
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, () => {
- WI.settings.indentWithTabs.value = indentEditor.value === indentValues[0];
- });
+ indentEditor.addEventListener(WI.SettingEditor.Event.ValueDidChange, function(event) {
+ WI.settings.indentWithTabs.value = this.value === indentValues[0];
+ }, indentEditor);
function addSpacesSetting(title, setting) {
let editor = generalSettingsView.addSetting(title, setting, WI.UIString("spaces"), {min: 1});
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);
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(this.value);
+ }, zoomEditor);
+ WI.settings.zoomFactor.addEventListener(WI.Setting.Event.Changed, function(event) {
+ this.value = WI.getZoomFactor().maxDecimals(2);
+ }, zoomEditor);
this._createReferenceLink(generalSettingsView);
let logEditor = consoleSettingsView.addGroupWithCustomSetting(label, 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);
- });
+ target.ConsoleAgent.setLoggingChannelLevel(channel.source, this.value);
+ }, logEditor);
}
}
function listenForChange(setting) {
initialValues.set(setting, setting.value);
- setting.addEventListener(WI.Setting.Event.Changed, () => {
- reloadInspectorContainerElement.classList.toggle("hidden", Array.from(initialValues).every(([setting, initialValue]) => setting.value === initialValue));
- });
+ setting.addEventListener(WI.Setting.Event.Changed, function(event) {
+ this.classList.toggle("hidden", Array.from(initialValues).every(([setting, initialValue]) => setting.value === initialValue));
+ }, reloadInspectorContainerElement);
}
listenForChange(WI.settings.experimentalEnablePreviewFeatures);
let protocolMessagesGroup = this._debugSettingsView.addGroup(WI.unlocalizedString("Protocol Logging:"));
let protocolAutoLogMessagesEditor = protocolMessagesGroup.addSetting(WI.settings.protocolAutoLogMessages, WI.unlocalizedString("Messages"));
- WI.settings.protocolAutoLogMessages.addEventListener(WI.Setting.Event.Changed, () => {
- protocolAutoLogMessagesEditor.value = InspectorBackend.dumpInspectorProtocolMessages;
- });
+ WI.settings.protocolAutoLogMessages.addEventListener(WI.Setting.Event.Changed, function(event) {
+ this.value = InspectorBackend.dumpInspectorProtocolMessages;
+ }, protocolAutoLogMessagesEditor);
protocolMessagesGroup.addSetting(WI.settings.protocolAutoLogTimeStats, WI.unlocalizedString("Time Stats"));
protocolMessagesGroup.addSetting(WI.settings.protocolLogAsText, WI.unlocalizedString("Log as Text"));
let layoutDirectionEditor = this._debugSettingsView.addGroupWithCustomSetting(WI.unlocalizedString("Layout Direction:"), WI.SettingEditor.Type.Select, {values: layoutDirectionValues});
layoutDirectionEditor.value = WI.settings.debugLayoutDirection.value;
- layoutDirectionEditor.addEventListener(WI.SettingEditor.Event.ValueDidChange, () => { WI.setLayoutDirection(layoutDirectionEditor.value); });
+ layoutDirectionEditor.addEventListener(WI.SettingEditor.Event.ValueDidChange, function(event) {
+ WI.setLayoutDirection(this.value);
+ }, layoutDirectionEditor);
this._debugSettingsView.addSeparator();
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);
+ }, textEditor);
switch (shaderType) {
case WI.ShaderProgram.ShaderType.Compute:
close()
{
if (this._supportsDebugging) {
- WI.JavaScriptBreakpoint.removeEventListener(null, null, this);
- WI.debuggerManager.removeEventListener(null, null, this);
- WI.targetManager.removeEventListener(null, null, this);
+ WI.JavaScriptBreakpoint.removeEventListener(WI.Breakpoint.Event.DisabledStateDidChange, this._breakpointStatusDidChange, this);
+ WI.JavaScriptBreakpoint.removeEventListener(WI.Breakpoint.Event.AutoContinueDidChange, this._breakpointStatusDidChange, this);
+
+ WI.JavaScriptBreakpoint.removeEventListener(WI.JavaScriptBreakpoint.Event.ResolvedStateDidChange, this._breakpointStatusDidChange, this);
+ WI.JavaScriptBreakpoint.removeEventListener(WI.JavaScriptBreakpoint.Event.LocationDidChange, this._updateBreakpointLocation, this);
+
+ WI.targetManager.removeEventListener(WI.TargetManager.Event.TargetAdded, this._targetAdded, this);
+ WI.targetManager.removeEventListener(WI.TargetManager.Event.TargetRemoved, this._targetRemoved, this);
+
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.BreakpointsEnabledDidChange, this._breakpointsEnabledDidChange, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.BreakpointAdded, this._breakpointAdded, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.BreakpointRemoved, this._breakpointRemoved, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.CallFramesDidChange, this._callFramesDidChange, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.ActiveCallFrameDidChange, this._activeCallFrameDidChange, this);
+
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, this._debuggerDidPause, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Resumed, this._debuggerDidResume, this);
if (this._activeCallFrameSourceCodeLocation) {
this._activeCallFrameSourceCodeLocation.removeEventListener(WI.SourceCodeLocation.Event.LocationChanged, this._activeCallFrameSourceCodeLocationChanged, this);
}
}
- WI.consoleManager.removeEventListener(null, null, this);
- WI.notifications.removeEventListener(null, null, this);
- this._sourceCode.removeEventListener(null, null, this);
+ WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.IssueAdded, this._issueWasAdded, this);
+
+ this._sourceCode.removeEventListener(WI.SourceCode.Event.FormatterDidChange, this._handleFormatterDidChange, this);
+ if (this._sourceCode instanceof WI.SourceMapResource || this._sourceCode.sourceMaps.length > 0)
+ WI.notifications.removeEventListener(WI.Notification.GlobalModifierKeysDidChange, this._updateTokenTrackingControllerState, this);
+ else
+ this._sourceCode.removeEventListener(WI.SourceCode.Event.SourceMapAdded, this._sourceCodeSourceMapAdded, this);
+
+ WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.Cleared, this._logCleared, this);
}
canBeFormatted()
content.classList.add(WI.SourceCodeTextEditor.PopoverDebuggerContentStyleClassName);
- this._popover = this._popover || new WI.Popover(this);
+ if (!this._popover) {
+ this._popover = new WI.Popover(this);
+ this._popover.element.addEventListener("mouseover", this._popoverMouseover.bind(this));
+ this._popover.element.addEventListener("mouseout", this._popoverMouseout.bind(this));
+ }
+
this._popover.presentNewContentWithFrame(content, bounds.pad(5), [WI.RectEdge.MIN_Y, WI.RectEdge.MAX_Y, WI.RectEdge.MAX_X]);
+
if (shouldHighlightRange)
this.tokenTrackingController.highlightRange(candidate.expressionRange);
-
- this._trackPopoverEvents();
}
_showPopoverForFunction(data)
// Show the popover once we have the first set of properties for the object.
var candidate = this.tokenTrackingController.candidate;
- objectTree.addEventListener(WI.ObjectTreeView.Event.Updated, function() {
+ objectTree.singleFireEventListener(WI.ObjectTreeView.Event.Updated, function(event) {
if (candidate === this.tokenTrackingController.candidate)
this._showPopover(content);
- objectTree.removeEventListener(null, null, this);
}, this);
}
return;
this._popover.dismiss();
-
- if (this._popoverEventListeners && this._popoverEventListenersAreRegistered) {
- this._popoverEventListenersAreRegistered = false;
- this._popoverEventListeners.unregister();
- }
- }
-
- _trackPopoverEvents()
- {
- if (!this._popoverEventListeners)
- this._popoverEventListeners = new WI.EventListenerSet(this, "Popover listeners");
- if (!this._popoverEventListenersAreRegistered) {
- this._popoverEventListenersAreRegistered = true;
- this._popoverEventListeners.register(this._popover.element, "mouseover", this._popoverMouseover);
- this._popoverEventListeners.register(this._popover.element, "mouseout", this._popoverMouseout);
- this._popoverEventListeners.install();
- }
}
_popoverMouseover(event)
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);
}
closed()
{
- WI.settings.resourceGroupingMode.removeEventListener(null, null, this);
- WI.Frame.removeEventListener(null, null, this);
- WI.Target.removeEventListener(null, null, this);
- WI.networkManager.removeEventListener(null, null, this);
- WI.debuggerManager.removeEventListener(null, null, this);
- WI.domDebuggerManager.removeEventListener(null, null, this);
- WI.JavaScriptBreakpoint.removeEventListener(null, null, this);
- WI.IssueMessage.removeEventListener(null, null, this);
- WI.DOMBreakpoint.removeEventListener(null, null, this);
- WI.consoleManager.removeEventListener(null, null, this);
- WI.timelineManager.removeEventListener(null, null, this);
- WI.auditManager.removeEventListener(null, null, this);
- WI.cssManager.removeEventListener(null, null, this);
- WI.targetManager.removeEventListener(null, null, this);
- WI.notifications.removeEventListener(null, null, this);
- WI.SourceCode.removeEventListener(null, null, this);
+ WI.settings.resourceGroupingMode.removeEventListener(WI.Setting.Event.Changed, this._handleResourceGroupingModeChanged, this);
+
+ WI.Frame.removeEventListener(WI.Frame.Event.MainResourceDidChange, this._handleFrameMainResourceDidChange, this);
+ WI.Frame.removeEventListener(WI.Frame.Event.ResourceWasAdded, this._handleResourceAdded, this);
+ WI.Target.removeEventListener(WI.Target.Event.ResourceAdded, this._handleResourceAdded, this);
+
+ WI.networkManager.removeEventListener(WI.NetworkManager.Event.FrameWasAdded, this._handleFrameWasAdded, this);
+
+ if (WI.NetworkManager.supportsBootstrapScript()) {
+ WI.networkManager.removeEventListener(WI.NetworkManager.Event.BootstrapScriptCreated, this._handleBootstrapScriptCreated, this);
+ WI.networkManager.removeEventListener(WI.NetworkManager.Event.BootstrapScriptDestroyed, this._handleBootstrapScriptDestroyed, this);
+ }
+
+ if (WI.NetworkManager.supportsOverridingResponses()) {
+ WI.networkManager.removeEventListener(WI.NetworkManager.Event.LocalResourceOverrideAdded, this._handleLocalResourceOverrideAdded, this);
+ WI.networkManager.removeEventListener(WI.NetworkManager.Event.LocalResourceOverrideRemoved, this._handleLocalResourceOverrideRemoved, this);
+ }
+
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.BreakpointAdded, this._handleDebuggerBreakpointAdded, this);
+ WI.domDebuggerManager.removeEventListener(WI.DOMDebuggerManager.Event.DOMBreakpointAdded, this._handleDebuggerBreakpointAdded, this);
+ WI.domDebuggerManager.removeEventListener(WI.DOMDebuggerManager.Event.EventBreakpointAdded, this._handleDebuggerBreakpointAdded, this);
+ WI.domDebuggerManager.removeEventListener(WI.DOMDebuggerManager.Event.URLBreakpointAdded, this._handleDebuggerBreakpointAdded, this);
+
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.BreakpointRemoved, this._handleDebuggerBreakpointRemoved, this);
+ WI.domDebuggerManager.removeEventListener(WI.DOMDebuggerManager.Event.DOMBreakpointRemoved, this._handleDebuggerBreakpointRemoved, this);
+ WI.domDebuggerManager.removeEventListener(WI.DOMDebuggerManager.Event.EventBreakpointRemoved, this._handleDebuggerBreakpointRemoved, this);
+ WI.domDebuggerManager.removeEventListener(WI.DOMDebuggerManager.Event.URLBreakpointRemoved, this._handleDebuggerBreakpointRemoved, this);
+
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.BreakpointsEnabledDidChange, this._handleDebuggerBreakpointsEnabledDidChange, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.ScriptAdded, this._handleDebuggerScriptAdded, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.ScriptRemoved, this._handleDebuggerScriptRemoved, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.ScriptsCleared, this._handleDebuggerScriptsCleared, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, this._handleDebuggerPaused, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Resumed, this._handleDebuggerResumed, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.CallFramesDidChange, this._handleDebuggerCallFramesDidChange, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.ActiveCallFrameDidChange, this._handleDebuggerActiveCallFrameDidChange, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.WaitingToPause, this._handleDebuggerWaitingToPause, this);
+
+ WI.JavaScriptBreakpoint.removeEventListener(WI.JavaScriptBreakpoint.Event.DisplayLocationDidChange, this._handleDebuggerObjectDisplayLocationDidChange, this);
+ WI.IssueMessage.removeEventListener(WI.IssueMessage.Event.DisplayLocationDidChange, this._handleDebuggerObjectDisplayLocationDidChange, this);
+
+ WI.DOMBreakpoint.removeEventListener(WI.DOMBreakpoint.Event.DOMNodeWillChange, this._handleDOMBreakpointDOMNodeWillChange, this);
+ WI.DOMBreakpoint.removeEventListener(WI.DOMBreakpoint.Event.DOMNodeDidChange, this._handleDOMBreakpointDOMNodeDidChange, this);
+
+ WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.IssueAdded, this._handleConsoleIssueAdded, this);
+ WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.Cleared, this._handleConsoleCleared, this);
+
+ WI.timelineManager.removeEventListener(WI.TimelineManager.Event.CapturingStateChanged, this._handleTimelineCapturingStateChanged, this);
+
+ WI.auditManager.removeEventListener(WI.AuditManager.Event.TestScheduled, this._handleAuditManagerTestScheduled, this);
+ WI.auditManager.removeEventListener(WI.AuditManager.Event.TestCompleted, this._handleAuditManagerTestCompleted, this);
+
+ WI.cssManager.removeEventListener(WI.CSSManager.Event.StyleSheetAdded, this._handleCSSStyleSheetAdded, this);
+ WI.cssManager.removeEventListener(WI.CSSManager.Event.StyleSheetRemoved, this._handleCSSStyleSheetRemoved, this);
+
+ WI.targetManager.removeEventListener(WI.TargetManager.Event.TargetAdded, this._handleTargetAdded, this);
+ WI.targetManager.removeEventListener(WI.TargetManager.Event.TargetRemoved, this._handleTargetRemoved, this);
+
+ // COMPATIBILITY (iOS 14.0): Inspector.activateExtraDomains was removed in favor of a declared debuggable type
+ WI.notifications.removeEventListener(WI.Notification.ExtraDomainsActivated, this._handleExtraDomainsActivated, this);
super.closed();
}
{
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._localOverridesSection];
let detailsSection = detailsSections.find((detailsSection) => detailsSection.element.contains(treeElement.listItemElement));
let offset = detailsSection.headerElement.totalOffsetBottom - treeElement.listItemElement.totalOffsetTop;
if (offset > 0)
this.scrollElement.scrollBy(0, -offset);
- });
+ }, this);
return treeOutline;
}
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;
}
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;
}
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);
{
super.closed();
- WI.domStorageManager.removeEventListener(null, null, this);
- WI.databaseManager.removeEventListener(null, null, this);
- WI.indexedDBManager.removeEventListener(null, null, this);
- WI.applicationCacheManager.removeEventListener(null, null, this);
+ WI.domStorageManager.removeEventListener(WI.DOMStorageManager.Event.CookieStorageObjectWasAdded, this._cookieStorageObjectWasAdded, this);
+ WI.domStorageManager.removeEventListener(WI.DOMStorageManager.Event.DOMStorageObjectWasAdded, this._domStorageObjectWasAdded, this);
+ WI.domStorageManager.removeEventListener(WI.DOMStorageManager.Event.DOMStorageObjectWasInspected, this._domStorageObjectWasInspected, this);
+ WI.domStorageManager.removeEventListener(WI.DOMStorageManager.Event.Cleared, this._domStorageCleared, this);
+ WI.databaseManager.removeEventListener(WI.DatabaseManager.Event.DatabaseWasAdded, this._databaseWasAdded, this);
+ WI.databaseManager.removeEventListener(WI.DatabaseManager.Event.DatabaseWasInspected, this._databaseWasInspected, this);
+ WI.databaseManager.removeEventListener(WI.DatabaseManager.Event.Cleared, this._databaseCleared, this);
+ WI.indexedDBManager.removeEventListener(WI.IndexedDBManager.Event.IndexedDatabaseWasAdded, this._indexedDatabaseWasAdded, this);
+ WI.indexedDBManager.removeEventListener(WI.IndexedDBManager.Event.Cleared, this._indexedDatabaseCleared, this);
+ WI.applicationCacheManager.removeEventListener(WI.ApplicationCacheManager.Event.FrameManifestAdded, this._frameManifestAdded, this);
+ WI.applicationCacheManager.removeEventListener(WI.ApplicationCacheManager.Event.FrameManifestRemoved, this._frameManifestRemoved, this);
+ WI.applicationCacheManager.removeEventListener(WI.ApplicationCacheManager.Event.Cleared, this._applicationCacheCleared, this);
}
// Protected
{
super.closed();
- this.resource.removeEventListener(null, null, this);
- WI.debuggerManager.removeEventListener(null, null, this);
- WI.networkManager.removeEventListener(null, null, this);
- WI.settings.showJavaScriptTypeInformation.removeEventListener(null, null, this);
- WI.settings.enableControlFlowProfiler.removeEventListener(null, null, this);
+ this.resource.removeEventListener(WI.SourceCode.Event.ContentDidChange, this._sourceCodeContentDidChange, this);
+ WI.settings.showJavaScriptTypeInformation.removeEventListener(WI.Setting.Event.Changed, this._showJavaScriptTypeInformationSettingChanged, this);
+ WI.settings.enableControlFlowProfiler.removeEventListener(WI.Setting.Event.Changed, this._enableControlFlowProfilerSettingChanged, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.ProbeSetAdded, this._probeSetsChanged, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.ProbeSetRemoved, this._probeSetsChanged, this);
}
contentAvailable(content, base64Encoded)
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();
closed()
{
- WI.timelineManager.removeEventListener(null, null, this);
+ WI.timelineManager.removeEventListener(WI.TimelineManager.Event.CapturingStateChanged, this._handleTimelineCapturingStateChanged, this);
+ WI.timelineManager.removeEventListener(WI.TimelineManager.Event.RecordingImported, this._recordingImported, this);
super.closed();
}
this._recording.addEventListener(WI.TimelineRecording.Event.InstrumentAdded, this._instrumentAdded, this);
this._recording.addEventListener(WI.TimelineRecording.Event.InstrumentRemoved, this._instrumentRemoved, this);
this._recording.addEventListener(WI.TimelineRecording.Event.Reset, this._recordingReset, this);
- this._recording.addEventListener(WI.TimelineRecording.Event.Unloaded, this._recordingUnloaded, this);
+ this._recording.singleFireEventListener(WI.TimelineRecording.Event.Unloaded, this._recordingUnloaded, this);
WI.timelineManager.addEventListener(WI.TimelineManager.Event.CapturingStateChanged, this._handleTimelineCapturingStateChanged, this);
this._timelineContentBrowser.contentViewContainer.closeAllContentViews();
- this._recording.removeEventListener(null, null, this);
+ this._recording.removeEventListener(WI.TimelineRecording.Event.InstrumentAdded, this._instrumentAdded, this);
+ this._recording.removeEventListener(WI.TimelineRecording.Event.InstrumentRemoved, this._instrumentRemoved, this);
+ this._recording.removeEventListener(WI.TimelineRecording.Event.Reset, this._recordingReset, this);
+ if (!this._recording.readonly)
+ this._recording.removeEventListener(WI.TimelineRecording.Event.Unloaded, this._recordingUnloaded, this);
- WI.timelineManager.removeEventListener(null, null, this);
- WI.debuggerManager.removeEventListener(null, null, this);
- WI.ContentView.removeEventListener(null, null, this);
+ WI.timelineManager.removeEventListener(WI.TimelineManager.Event.CapturingStateChanged, this._handleTimelineCapturingStateChanged, this);
+
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, this._debuggerPaused, this);
+ WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Resumed, this._debuggerResumed, this);
+
+ WI.ContentView.removeEventListener(WI.ContentView.Event.SelectionPathComponentsDidChange, this._contentViewSelectionPathComponentDidChange, this);
+ WI.ContentView.removeEventListener(WI.ContentView.Event.SupplementalRepresentedObjectsDidChange, this._contentViewSupplementalRepresentedObjectsDidChange, this);
+
+ WI.TimelineView.removeEventListener(WI.TimelineView.Event.RecordWasFiltered, this._handleTimelineViewRecordFiltered, this);
+ WI.TimelineView.removeEventListener(WI.TimelineView.Event.RecordWasSelected, this._handleTimelineViewRecordSelected, this);
+ WI.TimelineView.removeEventListener(WI.TimelineView.Event.ScannerShow, this._handleTimelineViewScannerShow, this);
+ WI.TimelineView.removeEventListener(WI.TimelineView.Event.ScannerHide, this._handleTimelineViewScannerHide, this);
+ WI.TimelineView.removeEventListener(WI.TimelineView.Event.NeedsEntireSelectedRange, this._handleTimelineViewNeedsEntireSelectedRange, this);
}
canGoBack()
{
console.assert(!this._updating);
- WI.timelineManager.removeEventListener(null, null, this);
+ WI.timelineManager.removeEventListener(WI.TimelineManager.Event.CapturingStateChanged, this._handleTimelineCapturingStateChanged, this);
}
_timeRangeSelectionChanged(event)
this._stopRecordingButtonElement.textContent = WI.UIString("Stop Recording");
this._stopRecordingButtonElement.addEventListener("click", () => WI.timelineManager.stopCapturing());
this.element.appendChild(this._stopRecordingButtonElement);
+
+ WI.timelineManager.addEventListener(WI.TimelineManager.Event.CapturingStateChanged, this._handleTimelineCapturingStateChanged, this);
}
// Public
this._visible = x;
this.element.classList.toggle("hidden", !this._visible);
- if (this._visible) {
- WI.timelineManager.addEventListener(WI.TimelineManager.Event.CapturingStateChanged, this._handleTimelineCapturingStateChanged, this);
+ if (this._visible)
this._updateState();
- } else
- WI.timelineManager.removeEventListener(WI.TimelineManager.Event.CapturingStateChanged, this._handleTimelineCapturingStateChanged, this);
}
// Private
_updateState() {
+ if (!this._visible)
+ return;
+
switch (WI.timelineManager.capturingState) {
case WI.TimelineManager.CapturingState.Starting:
case WI.TimelineManager.CapturingState.Active:
clearMarkers()
{
for (let [marker, markerElement] of this._markerElementMap) {
- marker.removeEventListener(null, null, this);
+ marker.removeEventListener(WI.TimelineMarker.Event.TimeChanged, this._timelineMarkerTimeChanged, this);
markerElement.remove();
}
WI.memoryManager.disable();
WI.heapManager.disable();
- this.contentBrowser.navigationBar.removeEventListener(null, null, this);
-
- WI.timelineManager.removeEventListener(null, null, this);
- WI.notifications.removeEventListener(null, null, this);
+ if (WI.sharedApp.isWebDebuggable())
+ this.contentBrowser.navigationBar.removeEventListener(WI.NavigationBar.Event.NavigationItemSelected, this._viewModeSelected, this);
+
+ WI.timelineManager.removeEventListener(WI.TimelineManager.Event.CapturingStateChanged, this._handleTimelineCapturingStateChanged, this);
+ WI.timelineManager.removeEventListener(WI.TimelineManager.Event.RecordingCreated, this._recordingCreated, this);
+ WI.timelineManager.removeEventListener(WI.TimelineManager.Event.RecordingLoaded, this._recordingLoaded, this);
+ WI.notifications.removeEventListener(WI.Notification.VisibilityStateDidChange, this._inspectorVisibilityChanged, this);
+ WI.notifications.removeEventListener(WI.Notification.GlobalModifierKeysDidChange, this._globalModifierKeysDidChange, this);
super.closed();
}
{
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();
+ }, button);
this.status = button.element;
}
WI.TreeOutline.CustomIndentStyleClassName = "custom-indent";
WI.TreeOutline.Event = {
- ElementAdded: Symbol("element-added"),
- ElementDidChange: Symbol("element-did-change"),
- ElementRemoved: Symbol("element-removed"),
- ElementRevealed: Symbol("element-revealed"),
- ElementClicked: Symbol("element-clicked"),
- ElementDisclosureDidChanged: Symbol("element-disclosure-did-change"),
- ElementVisibilityDidChange: Symbol("element-visbility-did-change"),
- SelectionDidChange: Symbol("selection-did-change")
+ ElementAdded: "element-added",
+ ElementDidChange: "element-did-change",
+ ElementRemoved: "element-removed",
+ ElementRevealed: "element-revealed",
+ ElementClicked: "element-clicked",
+ ElementDisclosureDidChanged: "element-disclosure-did-change",
+ ElementVisibilityDidChange: "element-visbility-did-change",
+ SelectionDidChange: "selection-did-change",
};
WI.TreeOutline._knownTreeElementNextIdentifier = 1;
itemRemoved(treeOutline)
{
- treeOutline.removeEventListener(null, null, this);
+ treeOutline.removeEventListener(WI.TreeOutline.Event.SelectionDidChange, this._treeOutlineSelectionDidChange, this);
}
// Private
let collectionData = snapshot.updateDeadNodesAndGatherCollectionData(this._snapshots);
if (!collectionData || !collectionData.affectedSnapshots.length)
return;
- this.sendEvent("HeapSnapshot.CollectionEvent", collectionData);
+ this.sendEvent(HeapSnapshotWorker.Event.Collection, collectionData);
}, 0);
}
}
}
};
+HeapSnapshotWorker.Event = {
+ Collection: "heap-snapshot-collection",
+};
+
self.heapSnapshotWorker = new HeapSnapshotWorker;