Bug 168763 - Web Inspector: Add XHR breakpoints UI
Summary: Web Inspector: Add XHR breakpoints UI
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: Web Inspector (show other bugs)
Version: WebKit Nightly Build
Hardware: All All
: P2 Normal
Assignee: Matt Baker
URL:
Keywords: InRadar
Depends on: 168101
Blocks: 169428
  Show dependency treegraph
 
Reported: 2017-02-22 20:43 PST by Matt Baker
Modified: 2017-03-09 21:49 PST (History)
2 users (show)

See Also:


Attachments
[Image] New UI (253.63 KB, image/png)
2017-03-09 11:12 PST, Matt Baker
no flags Details
Patch (64.38 KB, patch)
2017-03-09 12:40 PST, Matt Baker
no flags Details | Formatted Diff | Diff
Patch (64.00 KB, patch)
2017-03-09 12:42 PST, Matt Baker
no flags Details | Formatted Diff | Diff
[Image] Final UI (97.13 KB, image/png)
2017-03-09 13:03 PST, Matt Baker
no flags Details
Patch (65.63 KB, patch)
2017-03-09 13:05 PST, Matt Baker
joepeck: review+
joepeck: commit-queue-
Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Matt Baker 2017-02-22 20:43:20 PST
InspectorDOMDebuggerAgent has support for XHR breakpoints already; this issue covers UI and layout tests.

This builds out the DOMDebugger domain frontend classes added in https://bugs.webkit.org/show_bug.cgi?id=168101.
Comment 1 Matt Baker 2017-03-09 11:12:54 PST
Created attachment 303938 [details]
[Image] New UI
Comment 2 Radar WebKit Bug Importer 2017-03-09 11:29:03 PST
<rdar://problem/30952439>
Comment 3 Radar WebKit Bug Importer 2017-03-09 11:29:05 PST
<rdar://problem/30952433>
Comment 4 Matt Baker 2017-03-09 12:40:53 PST
Created attachment 303954 [details]
Patch
Comment 5 Matt Baker 2017-03-09 12:42:32 PST
Created attachment 303955 [details]
Patch
Comment 6 Matt Baker 2017-03-09 12:45:53 PST
Comment on attachment 303955 [details]
Patch

cq- for now. Fixing XHR breakpoint tree element UI.
Comment 7 Matt Baker 2017-03-09 13:03:57 PST
Created attachment 303964 [details]
[Image] Final UI

Polished the breakpoint title/subtitle
Comment 8 Matt Baker 2017-03-09 13:05:06 PST
Created attachment 303967 [details]
Patch
Comment 9 Joseph Pecoraro 2017-03-09 16:26:14 PST
Comment on attachment 303967 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=303967&action=review

(Review not done yet)

Kinda difficult to review this when the backend is completely invisible in this patch. These comments apply to those files:

  - InspectorDOMDebuggerAgent needs to clear m_xhrBreakpoints in disable().
  - Other methods return if breakpoints are not enabled, seems willSendXHR will need to.
  - Protocol methods are named setXHRBreakpoint / removeXHRBreakpoint. If we want this to apply to Fetch later it seems we would want to rename this.
  - Protocol methods should mention that if URL is empty it applies to ALL XHRs. That is entirely non-obvious.

I know we want to support Fetch. I hope we can move to better naming to treat XHR / Fetch the same without having duplicate sections. Just about everywhere this patch includes "XHR" would probably want to change if we were to make this generic to XHR + Fetch. For example, Settings, Class Names, File Names, Protocol Names, etc.

XHRs and Fetch both work in Workers, so these should work with Workers just like regular breakpoints.

> Source/WebInspectorUI/UserInterface/Controllers/DOMDebuggerManager.js:111
> +        let breakpoints = this._xhrBreakpointURLMap.get(mainFrame.url)
> +        if (!breakpoints)
> +            return [];

I'm not sure I understand why we would limit XHR breakpoints based on the main page's URL. This feels wrong. What about navigations? What if the page is put inside of an iframe? Regular breakpoints handle these cases.

> Source/WebInspectorUI/UserInterface/Controllers/DOMDebuggerManager.js:194
> +        let url = breakpoint.documentURL;
> +        let breakpoints = this._xhrBreakpointURLMap.get(url);

Yeah, we should revisit this, I don't like the idea of storing breakpoints per-document URL. If I have a framework used by all my pages, I'd want it to apply no matter what page I'm on.

> Source/WebInspectorUI/UserInterface/Views/InputPopover.js:96
> +    Committed: Symbol("result-cancelled"),

Fix the name.
Comment 10 Matt Baker 2017-03-09 16:37:20 PST
Comment on attachment 303967 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=303967&action=review

>> Source/WebInspectorUI/UserInterface/Controllers/DOMDebuggerManager.js:111
>> +            return [];
> 
> I'm not sure I understand why we would limit XHR breakpoints based on the main page's URL. This feels wrong. What about navigations? What if the page is put inside of an iframe? Regular breakpoints handle these cases.

Since the behavior is dictated by the frontend, I will investigate and address in a follow-up.
Comment 11 Matt Baker 2017-03-09 16:39:51 PST
(In reply to comment #9)
> Comment on attachment 303967 [details]
> Patch
> 
> View in context:
> https://bugs.webkit.org/attachment.cgi?id=303967&action=review
> 
> (Review not done yet)
> 
> Kinda difficult to review this when the backend is completely invisible in
> this patch. These comments apply to those files:
> 
>   - InspectorDOMDebuggerAgent needs to clear m_xhrBreakpoints in disable().
>   - Other methods return if breakpoints are not enabled, seems willSendXHR
> will need to.
Fixed.

>   - Protocol methods are named setXHRBreakpoint / removeXHRBreakpoint. If we
> want this to apply to Fetch later it seems we would want to rename this.
I would rename the protocol methods now, but the signature may change if we add a parameter to control whether the breakpoint applies to XHR/fetch/or both.

>   - Protocol methods should mention that if URL is empty it applies to ALL
> XHRs. That is entirely non-obvious.
Fixed.
Comment 12 Joseph Pecoraro 2017-03-09 16:41:01 PST
Comment on attachment 303967 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=303967&action=review

r=me

> Source/WebInspectorUI/UserInterface/Controllers/DOMDebuggerManager.js:347
> +        DOMDebuggerAgent.removeXHRBreakpoint(breakpoint.url, (error) => {

Please file a follow-up to get this working with Workers. XHR / Fetch work in Workers, so we will want these breakpoints to work there as well.

> Source/WebInspectorUI/UserInterface/Models/XHRBreakpoint.js:32
> +        this._documentURL = documentURL;

Yeah, I really don't understand this constraint.

> Source/WebInspectorUI/UserInterface/Views/ContentView.js:130
> +        if (representedObject instanceof WebInspector.XHRBreakpoint)
> +            return WebInspector.ContentView.createFromRepresentedObject(WebInspector.frameResourceManager.mainFrame.domTree, extraArguments);

So when you click on an XHR breakpoint it takes you to the DOM?! I don't think any view makes sense. Image if we have a breakpoint later on for "setTimeout" that wouldn't be able to take you anywhere.

> Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js:193
> +            let addXHRBreakpointButton = new WebInspector.ButtonNavigationItem("add-xhr-breakpoint", WebInspector.UIString("Add XHR breakpoint"), "Images/Plus13.svg", 13, 13);

Everything else uses capital 'B' Breakpoints. This one probably should too.

This looks a bit large in the screenshot but we can improve the appearance later.

> Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js:369
> +        else if (cookie[WebInspector.DebuggerSidebarPanel.SelectedAllRequestsCookieKey]) {

Style: No braces.

> Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js:1128
> +        let popover = new WebInspector.InputPopover(WebInspector.UIString("Break when URL contains:"), this);

A screenshot of this popover would have been useful.

> Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js:1145
> +        let documentURL = WebInspector.frameResourceManager.mainFrame.url;
> +        WebInspector.domDebuggerManager.addXHRBreakpoint(new WebInspector.XHRBreakpoint(documentURL, url));

The backend uses a HashSet of URLs. That means if duplicates exist on the frontend we will have problems:

    1. Frontend adds URL breakpoint for "data"
      => Backend adds it
    2. Frontend adds second URL breakpoint for "data"
      => Backend does nothing (already in set)
    3. Frontend removes 1 of these
      => Backend removes it
    4. Frontend shows a Breakpoint but it isn't really working.

Seems we should prevent duplicates somewhere, perhaps in the frontend.

> Source/WebInspectorUI/UserInterface/Views/XHRBreakpointTreeElement.js:37
> +            title = WebInspector.UIString("URL contains:");

This is a rather wide string for every item, especially if users will likely contain a lot of text. I think just "URL: " would work. We can iterate on this.
Comment 13 Joseph Pecoraro 2017-03-09 16:42:37 PST
Comment on attachment 303967 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=303967&action=review

> Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js:1140
> +        let url = popover.value;
> +        console.assert(url);

Is this assert valid? Can't the user put an empty value in the popover? We should just return and not create one with this special value (which means All Breakpoints).
Comment 14 Matt Baker 2017-03-09 21:49:38 PST
Committed r213691: https://trac.webkit.org/changeset/213691.