WebKit Bugzilla
Attachment 347426 Details for
Bug 188717
: Web Inspector: provide autocompletion for event breakpoints
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-188717-20180817210305.patch (text/plain), 14.68 KB, created by
Devin Rousso
on 2018-08-17 21:03:06 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Devin Rousso
Created:
2018-08-17 21:03:06 PDT
Size:
14.68 KB
patch
obsolete
>diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog >index 48a6aae498a895d896aa5503ed2a0da9aa093022..a8c4a12f989613185f4ce2861ec669ad60730fbb 100644 >--- a/Source/JavaScriptCore/ChangeLog >+++ b/Source/JavaScriptCore/ChangeLog >@@ -1,3 +1,13 @@ >+2018-08-17 Devin Rousso <drousso@apple.com> >+ >+ Web Inspector: provide autocompletion for event breakpoints >+ https://bugs.webkit.org/show_bug.cgi?id=188717 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * inspector/protocol/DOM.json: >+ Add `enabled` command and `eventNamesParsed` event. >+ > 2018-08-17 Yusuke Suzuki <yusukesuzuki@slowstart.org> and Fujii Hironori <Hironori.Fujii@sony.com> > > [JSC] Add GPRReg::InvalidGPRReg and FPRReg::InvalidFPRReg >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 40a21a5d39fcd9359254c1122ccdad8c0c3021c4..fa912cbff2a8038668de8f898c56481d62a4ec60 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,17 @@ >+2018-08-17 Devin Rousso <drousso@apple.com> >+ >+ Web Inspector: provide autocompletion for event breakpoints >+ https://bugs.webkit.org/show_bug.cgi?id=188717 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Test: inspector/dom/eventNamesParsed.html >+ >+ * inspector/agents/InspectorDOMAgent.h: >+ * inspector/agents/InspectorDOMAgent.cpp: >+ (WebCore::InspectorDOMAgent::enable): Added. >+ Send an array of all the builtin DOM event names to the WebInspector frontend when enabled. >+ > 2018-08-16 Ryosuke Niwa <rniwa@webkit.org> > > Replace canBubble and cancelable booleans in Event by enum classes >diff --git a/Source/WebInspectorUI/ChangeLog b/Source/WebInspectorUI/ChangeLog >index 1d0a6261761057810a38ccd216ac3007a8d8ce7a..d722bd9ef81937db34395271a4c2a68241b2579d 100644 >--- a/Source/WebInspectorUI/ChangeLog >+++ b/Source/WebInspectorUI/ChangeLog >@@ -1,3 +1,30 @@ >+2018-08-17 Devin Rousso <drousso@apple.com> >+ >+ Web Inspector: provide autocompletion for event breakpoints >+ https://bugs.webkit.org/show_bug.cgi?id=188717 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add a `DOM.enable` command that is called when the `WI.DOMTreeManager` is created. This >+ command causes the backend to fire `DOM.eventNamesParsed`, which sends an array of all the >+ builtin DOM event names to the `WI.DOMTreeManager`, which can then be used for autocompletion. >+ >+ * UserInterface/Protocol/DOMObserver.js: >+ (WI.DOMObserver.prototype.eventNamesParsed): Added. >+ >+ * UserInterface/Controllers/DOMTreeManager.js: >+ (WI.DOMTreeManager): >+ (WI.DOMTreeManager.prototype.get eventNames): Added. >+ (WI.DOMTreeManager.prototype.eventNamesParsed): Added. >+ >+ * UserInterface/Views/EventBreakpointPopover.js: >+ (WI.EventBreakpointPopover): >+ (WI.EventBreakpointPopover.prototype.show): >+ (WI.EventBreakpointPopover.prototype.dismiss): Added. >+ (WI.EventBreakpointPopover.prototype.completionSuggestionsClickedCompletion): Added. >+ (WI.EventBreakpointPopover.prototype._presentOverTargetElement): >+ (WI.EventBreakpointPopover.prototype._showSuggestionsView): Added. >+ > 2018-08-16 Devin Rousso <drousso@apple.com> > > Web Inspector: support breakpoints for arbitrary event names >diff --git a/Source/JavaScriptCore/inspector/protocol/DOM.json b/Source/JavaScriptCore/inspector/protocol/DOM.json >index bdd988d81325e5cc45b9554157f568498c3ae60e..028e5491036bf6dde3bf42b116b5b2e7e69d9771 100644 >--- a/Source/JavaScriptCore/inspector/protocol/DOM.json >+++ b/Source/JavaScriptCore/inspector/protocol/DOM.json >@@ -165,6 +165,9 @@ > } > ], > "commands": [ >+ { >+ "name": "enable" >+ }, > { > "name": "getDocument", > "description": "Returns the root DOM node to the caller.", >@@ -624,6 +627,13 @@ > { "name": "pseudoElementId", "$ref": "NodeId", "description": "The removed pseudo element id." } > ] > }, >+ { >+ "name": "eventNamesParsed", >+ "description": "The list of builtin event names has been parsed by the backend.", >+ "parameters": [ >+ { "name": "eventNames", "type": "array", "items": { "type": "string" } } >+ ] >+ }, > { > "name": "didAddEventListener", > "description": "Called when an event listener is added to a node.", >diff --git a/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp b/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp >index 9869b63871aa14d097a49ebf7e06c955715d39f1..1c53433f6722df2b9c72adfbd215607f59cb79b2 100644 >--- a/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp >+++ b/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp >@@ -56,6 +56,7 @@ > #include "Element.h" > #include "Event.h" > #include "EventListener.h" >+#include "EventNames.h" > #include "Frame.h" > #include "FrameTree.h" > #include "HTMLElement.h" >@@ -528,6 +529,17 @@ void InspectorDOMAgent::requestChildNodes(ErrorString& errorString, int nodeId, > pushChildNodesToFrontend(nodeId, sanitizedDepth); > } > >+void InspectorDOMAgent::enable(ErrorString&) >+{ >+ auto eventNames = JSON::ArrayOf<String>::create(); >+ >+#define DOM_EVENT_NAMES_ADD(name) eventNames->addItem(#name); >+ DOM_EVENT_NAMES_FOR_EACH(DOM_EVENT_NAMES_ADD) >+#undef DOM_EVENT_NAMES_ADD >+ >+ m_frontendDispatcher->eventNamesParsed(WTFMove(eventNames)); >+} >+ > void InspectorDOMAgent::querySelector(ErrorString& errorString, int nodeId, const String& selectors, int* elementId) > { > *elementId = 0; >diff --git a/Source/WebCore/inspector/agents/InspectorDOMAgent.h b/Source/WebCore/inspector/agents/InspectorDOMAgent.h >index 89bd9d1832b59199c261b81c5c35f1a8228ba0b9..956273f13c102bf425288aac5e51e8583e1d4082 100644 >--- a/Source/WebCore/inspector/agents/InspectorDOMAgent.h >+++ b/Source/WebCore/inspector/agents/InspectorDOMAgent.h >@@ -110,6 +110,7 @@ public: > void reset(); > > // Methods called from the frontend for DOM nodes inspection. >+ void enable(ErrorString&) final; > void querySelector(ErrorString&, int nodeId, const String& selectors, int* elementId) override; > void querySelectorAll(ErrorString&, int nodeId, const String& selectors, RefPtr<JSON::ArrayOf<int>>& result) override; > void getDocument(ErrorString&, RefPtr<Inspector::Protocol::DOM::Node>& root) override; >diff --git a/Source/WebInspectorUI/UserInterface/Controllers/DOMTreeManager.js b/Source/WebInspectorUI/UserInterface/Controllers/DOMTreeManager.js >index dc56f939409ba61983f1572ccdaf168dff0d7306..361d71c87d7903c84e834137ffa901eb00c21436 100644 >--- a/Source/WebInspectorUI/UserInterface/Controllers/DOMTreeManager.js >+++ b/Source/WebInspectorUI/UserInterface/Controllers/DOMTreeManager.js >@@ -36,6 +36,8 @@ WI.DOMTreeManager = class DOMTreeManager extends WI.Object > { > super(); > >+ this._eventNames = new Set(); >+ > this._idToDOMNode = {}; > this._document = null; > this._attributeLoadNodeIds = {}; >@@ -44,10 +46,15 @@ WI.DOMTreeManager = class DOMTreeManager extends WI.Object > this._inspectedNode = null; > > WI.Frame.addEventListener(WI.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this); >+ >+ if (DOMAgent.enable) >+ DOMAgent.enable(); > } > > // Public > >+ get eventNames() { return this._eventNames; } >+ > requestDocument(callback) > { > if (this._document) { >@@ -91,6 +98,13 @@ WI.DOMTreeManager = class DOMTreeManager extends WI.Object > this._dispatchWhenDocumentAvailable(DOMAgent.pushNodeByPathToFrontend.bind(DOMAgent, path), callback); > } > >+ eventNamesParsed(eventNames) >+ { >+ // Called from WI.DOMObserver. >+ >+ this._eventNames = new Set(eventNames); >+ } >+ > didAddEventListener(nodeId) > { > // Called from WI.DOMObserver. >diff --git a/Source/WebInspectorUI/UserInterface/Protocol/DOMObserver.js b/Source/WebInspectorUI/UserInterface/Protocol/DOMObserver.js >index 06c786d5debe8b553c0c5744db53f06aa545a26a..2ae3727249a98fe97736b3014e4814869fe1fd51 100644 >--- a/Source/WebInspectorUI/UserInterface/Protocol/DOMObserver.js >+++ b/Source/WebInspectorUI/UserInterface/Protocol/DOMObserver.js >@@ -102,6 +102,11 @@ WI.DOMObserver = class DOMObserver > WI.domTreeManager._pseudoElementRemoved(parentNodeId, pseudoElementId); > } > >+ eventNamesParsed(eventNames) >+ { >+ WI.domTreeManager.eventNamesParsed(eventNames); >+ } >+ > didAddEventListener(nodeId) > { > WI.domTreeManager.didAddEventListener(nodeId); >diff --git a/Source/WebInspectorUI/UserInterface/Views/EventBreakpointPopover.js b/Source/WebInspectorUI/UserInterface/Views/EventBreakpointPopover.js >index 5f75b513d3d6b1f4c0dea9b29699dbdbe189e069..12132270ea0798ade246224cd5b16ab8d897f47f 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/EventBreakpointPopover.js >+++ b/Source/WebInspectorUI/UserInterface/Views/EventBreakpointPopover.js >@@ -32,7 +32,9 @@ WI.EventBreakpointPopover = class EventBreakpointPopover extends WI.Popover > this._result = WI.InputPopover.Result.None; > this._value = null; > >- this._codeMirror = null; >+ this._currentCompletions = []; >+ this._suggestionsView = new WI.CompletionSuggestionsView(this, {preventBlur: true}); >+ > this._targetElement = null; > this._preferredEdges = null; > >@@ -60,13 +62,38 @@ WI.EventBreakpointPopover = class EventBreakpointPopover extends WI.Popover > this._inputElement.placeholder = "click"; > this._inputElement.spellcheck = false; > this._inputElement.addEventListener("keydown", (event) => { >- if (!isEnterKey(event)) >- return; >- >- this._result = WI.InputPopover.Result.Committed; >- this._value = event.target.value.trim(); >- >- this.dismiss(); >+ if (isEnterKey(event) || event.key === "Tab") { >+ this._result = WI.InputPopover.Result.Committed; >+ >+ if (this._suggestionsView.visible && this._suggestionsView.selectedIndex < this._currentCompletions.length) >+ this._value = this._currentCompletions[this._suggestionsView.selectedIndex]; >+ else >+ this._value = this._inputElement.value; >+ >+ this.dismiss(); >+ } else if ((event.key === "ArrowUp" || event.key === "ArrowDown") && this._suggestionsView.visible) { >+ event.stop(); >+ >+ if (event.key === "ArrowDown") >+ this._suggestionsView.selectNext(); >+ else >+ this._suggestionsView.selectPrevious(); >+ } >+ }); >+ this._inputElement.addEventListener("input", (event) => { >+ let matchRegex = new RegExp("^" + this._inputElement.value, "i"); >+ >+ this._currentCompletions = []; >+ for (let eventName of WI.domTreeManager.eventNames) { >+ if (matchRegex.test(eventName)) >+ this._currentCompletions.push(eventName); >+ } >+ >+ if (this._currentCompletions.length) { >+ this._suggestionsView.update(this._currentCompletions); >+ this._showSuggestionsView(); >+ } else >+ this._suggestionsView.hide(); > }); > > this.content = contentElement; >@@ -74,6 +101,23 @@ WI.EventBreakpointPopover = class EventBreakpointPopover extends WI.Popover > this._presentOverTargetElement(); > } > >+ dismiss() >+ { >+ super.dismiss(); >+ >+ this._suggestionsView.hide(); >+ } >+ >+ // CompletionSuggestionsView delegate >+ >+ completionSuggestionsClickedCompletion(suggestionsView, selectedText) >+ { >+ this._result = WI.InputPopover.Result.Committed; >+ this._value = selectedText; >+ >+ this.dismiss(); >+ } >+ > // Private > > _presentOverTargetElement() >@@ -84,6 +128,14 @@ WI.EventBreakpointPopover = class EventBreakpointPopover extends WI.Popover > let targetFrame = WI.Rect.rectFromClientRect(this._targetElement.getBoundingClientRect()); > this.present(targetFrame, this._preferredEdges); > >- this._inputElement.select(); >+ this._inputElement.focus(); >+ >+ if (this._inputElement.value) >+ this._showSuggestionsView(); > } >+ >+ _showSuggestionsView() >+ { >+ this._suggestionsView.show(WI.Rect.rectFromClientRect(this._inputElement.getBoundingClientRect())); >+ } > }; >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 106b4fba6f7b10464a51b0365490509e86040805..cf039be4e1fd6bd3f65011ae92197c8adf806819 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,13 @@ >+2018-08-17 Devin Rousso <drousso@apple.com> >+ >+ Web Inspector: provide autocompletion for event breakpoints >+ https://bugs.webkit.org/show_bug.cgi?id=188717 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * inspector/dom/eventNamesParsed-expected.txt: Added. >+ * inspector/dom/eventNamesParsed.html: Added. >+ > 2018-08-17 Devin Rousso <drousso@apple.com> > > Marked inspector/dom-debugger/event-breakpoint-with-navigation.html as flaky. >diff --git a/LayoutTests/inspector/dom/eventNamesParsed-expected.txt b/LayoutTests/inspector/dom/eventNamesParsed-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..2cb8771a50c1a42b7929a80abf42b1ae0f7a2181 >--- /dev/null >+++ b/LayoutTests/inspector/dom/eventNamesParsed-expected.txt >@@ -0,0 +1,4 @@ >+PASS: Should have recieved at least two event names. >+PASS: Should have recieved the "click" event name. >+PASS: Should have recieved the "load" event name. >+ >diff --git a/LayoutTests/inspector/dom/eventNamesParsed.html b/LayoutTests/inspector/dom/eventNamesParsed.html >new file mode 100644 >index 0000000000000000000000000000000000000000..3fd9e694602c935cedf4e3bb8ed36b8793ce1e3d >--- /dev/null >+++ b/LayoutTests/inspector/dom/eventNamesParsed.html >@@ -0,0 +1,28 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<script src="../../http/tests/inspector/resources/protocol-test.js"></script> >+<script> >+function test() >+{ >+ InspectorProtocol.awaitEvent({event: "DOM.eventNamesParsed"}) >+ .then((messageObject) => { >+ if ("error" in messageObject) >+ ProtocolTest.log(messageObject.error.message); >+ else { >+ let eventNames = messageObject.params.eventNames; >+ ProtocolTest.expectGreaterThan(eventNames.length, 2, "Should have recieved at least two event names."); >+ ProtocolTest.expectThat(eventNames.includes("click"), "Should have recieved the \"click\" event name."); >+ ProtocolTest.expectThat(eventNames.includes("load"), "Should have recieved the \"load\" event name."); >+ } >+ >+ ProtocolTest.completeTest(); >+ }); >+ >+ InspectorProtocol.sendCommand("DOM.enable"); >+} >+</script> >+</head> >+<body onload="runTest()"> >+</body> >+</html>
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 188717
:
347426
|
347427
|
347430
|
348174