Bug 170705 - Web Inspector: No context menu available via ENABLE_INSPECTOR_SERVER
Summary: Web Inspector: No context menu available via ENABLE_INSPECTOR_SERVER
Alias: None
Product: WebKit
Classification: Unclassified
Component: Web Inspector (show other bugs)
Version: WebKit Nightly Build
Hardware: All All
: P2 Normal
Assignee: Nobody
Depends on:
Reported: 2017-04-10 16:07 PDT by Ross Kirsling
Modified: 2017-04-13 21:47 PDT (History)
5 users (show)

See Also:

Missing context menu (80.80 KB, image/png)
2017-04-10 16:07 PDT, Ross Kirsling
no flags Details
Proposed context menu (94.68 KB, image/png)
2017-04-10 16:09 PDT, Ross Kirsling
no flags Details
Patch (22.57 KB, patch)
2017-04-10 16:30 PDT, Ross Kirsling
no flags Details | Formatted Diff | Diff
Patch (22.53 KB, patch)
2017-04-13 18:58 PDT, Ross Kirsling
no flags Details | Formatted Diff | Diff
Archive of layout-test-results from ews121 for ios-simulator-wk2 (11.99 MB, application/zip)
2017-04-13 20:43 PDT, Build Bot
no flags Details
Patch (23.51 KB, patch)
2017-04-13 20:51 PDT, Ross Kirsling
no flags Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Ross Kirsling 2017-04-10 16:07:11 PDT
Created attachment 306751 [details]
Missing context menu

It appears that ever since the old Web Inspector front-end was removed in r157278, there has been no context menu available when remote inspecting with ENABLE_INSPECTOR_SERVER.

InspectorFrontendHost is unavailable in this case, but the current stub uses a no-op for showContextMenu, where four years ago it used a SoftContextMenu component.

Given that ENABLE_INSPECTOR_SERVER exists, we should reintroduce a non-native context menu to be used in this scenario.

(NOTE: ENABLE_INSPECTOR_SERVER is currently only set for GTK+, but this behavior can be verified by simply overwriting window.InspectorFrontendHost.showContextMenu.)
Comment 1 Ross Kirsling 2017-04-10 16:09:42 PDT
Created attachment 306752 [details]
Proposed context menu
Comment 2 Ross Kirsling 2017-04-10 16:30:25 PDT
Created attachment 306755 [details]
Comment 3 Ross Kirsling 2017-04-10 16:37:24 PDT
This patch reintroduces the old SoftContextMenu class and applies various fixes:
- Remove legacy globals and prototype extensions.
- Align JS/CSS style with current front-end code.
- Update UI and fix UX to replicate the macOS native context menu.

To verify without ENABLE_INSPECTOR_SERVER, simply "opt-in" to the non-native context menu by commenting out the conditional at SoftContextMenu.js:377.

The appearance and behavior should match the native context menu (exceptions being the lack of a native-backed Inspect Element option and the fact that the menu itself can be right-clicked upon).
Comment 4 Joseph Pecoraro 2017-04-13 11:33:36 PDT
Comment on attachment 306755 [details]

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

r=me with comments.

After playing with it I found a few usability issues:

  1. You should not be able to right click the SoftContextMenu and get another native menu!
    => You can detect clicks and preventDefault if its a right click (but still allow the original quick selection path)
  2. Keyboard events do not work
    => I have comments below that get this working.

Maybe you can address (1) in a follow-up.

It looks very very close to native!

> Source/WebInspectorUI/UserInterface/Base/InspectorFrontendHostStub.js:-168
> -        showContextMenu: function(event, menuObject)
> -        {
> -        },
> -

You should keep this:

    showContextMenu: function(event, menuObject)
        new WebInspector.SoftContextMenu(items).show(event);

We want the Stub to match InspectorFrontendHost.idl, if someone saw something missing they might add back a stub and break the conditional you added later.

> Source/WebInspectorUI/UserInterface/Views/SoftContextMenu.js:35
> +
> +    show(event)

Style: Put a divider comment after the constructor and before here:

    // Public

See: https://trac.webkit.org/wiki/WebInspectorCodingStyleGuide

> Source/WebInspectorUI/UserInterface/Views/SoftContextMenu.js:39
> +        // Create context menu.

Nit: We can drop this comment, the code is clear.

> Source/WebInspectorUI/UserInterface/Views/SoftContextMenu.js:46
> +        for (let i = 0; i < this._items.length; ++i)
> +            this._contextMenuElement.appendChild(this._createMenuItem(this._items[i]));

Style: Use for..of:

    for (let item of this._items)

> Source/WebInspectorUI/UserInterface/Views/SoftContextMenu.js:60
> +        this._repositionMenuOnScreen(isSubMenu);

In order to make keyboard events work I had to add a few lines here:

        this._contextMenuElement.tabIndex = -1;

> Source/WebInspectorUI/UserInterface/Views/SoftContextMenu.js:62
> +

Style: Put a divider comment here:

    // Private

> Source/WebInspectorUI/UserInterface/Views/SoftContextMenu.js:86
> +        if (item.type === "separator")

Ideally we would have an enum WebInspector.ContentMenu.MenuItemType.Separator, .SubMenu, etc. But since that didn't exist already what you have here is fine.

> Source/WebInspectorUI/UserInterface/Views/SoftContextMenu.js:96
> +        const checkMarkElement = document.createElement("span");
> +        // Unicode "CHECK MARK"
> +        checkMarkElement.textContent = item.checked ? "\u2713" : "";

Style: We would handle this now with const variables to avoid the comments:

    const checkmark = "\u2713";
    const blackRightPointingTriangle = "\u25b6";

    const checkMarkElement = document.createElement("span");
    checkMarkElement.textContent = item.checked ? checkmark : "";

> Source/WebInspectorUI/UserInterface/Views/SoftContextMenu.js:116
> +        } else {
> +            menuItemElement._actionId = item.id;
> +        }
> +

Style: Drop braces for a single statement block.

> Source/WebInspectorUI/UserInterface/Views/SoftContextMenu.js:306
> +                this._highlightedMenuItemElement._subMenuTimer =
> +                    setTimeout(this._showSubMenu.bind(this, this._highlightedMenuItemElement), 150);

Style: Do not wrap this line.

> Source/WebInspectorUI/UserInterface/Views/SoftContextMenu.js:313
> +        let menuItemElement = this._highlightedMenuItemElement ?
> +            this._highlightedMenuItemElement.previousSibling : this._contextMenuElement.lastChild;

Style: Do not wrap this line.

> Source/WebInspectorUI/UserInterface/Views/SoftContextMenu.js:325
> +        let menuItemElement = this._highlightedMenuItemElement ?
> +            this._highlightedMenuItemElement.nextSibling : this._contextMenuElement.firstChild;

Style: Do not wrap this line.

> Source/WebInspectorUI/UserInterface/Views/SoftContextMenu.js:377
> +if (!InspectorFrontendHost.showContextMenu) {

Just keep this in the InspectorFrontendHostStub, see the earlier comment.
Comment 5 Ross Kirsling 2017-04-13 18:58:28 PDT
Created attachment 307072 [details]
Comment 6 Ross Kirsling 2017-04-13 19:09:15 PDT
Feedback addressed, including squelching of native Inspect Element.
Comment 7 Joseph Pecoraro 2017-04-13 20:19:54 PDT
Comment on attachment 307072 [details]

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

Excellent! r=me

> Source/WebInspectorUI/UserInterface/Views/SoftContextMenu.css:3
> + * Copyright (C) 2017 Sony Interactive Entertainment Inc.

Can you add this line to $inspectorLicense in Source/WebInspectorUI/Scripts/copy-user-interface-resources.pl

That is the copyright included appended to minified builds. I normally roll it every now and then but since I remembered now we should add this proactively!

> Source/WebInspectorUI/UserInterface/Views/SoftContextMenu.js:195
> +        // Squelch native Inspect Element.

I don't think "Squelch" is clear terminology.
Comment 8 Build Bot 2017-04-13 20:43:24 PDT
Comment on attachment 307072 [details]

Attachment 307072 [details] did not pass ios-sim-ews (ios-simulator-wk2):
Output: http://webkit-queues.webkit.org/results/3531908

New failing tests:
Comment 9 Build Bot 2017-04-13 20:43:26 PDT
Created attachment 307083 [details]
Archive of layout-test-results from ews121 for ios-simulator-wk2

The attached test failures were seen while running run-webkit-tests on the ios-sim-ews.
Bot: ews121  Port: ios-simulator-wk2  Platform: Mac OS X 10.11.6
Comment 10 Ross Kirsling 2017-04-13 20:51:14 PDT
Created attachment 307085 [details]
Comment 11 Ross Kirsling 2017-04-13 20:57:24 PDT
Feedback addressed.

That test breakage shouldn't be my fault? Looks like this change just landed:
Comment 12 Joseph Pecoraro 2017-04-13 20:57:38 PDT
Comment on attachment 307085 [details]

r=me, would you like me to cq+ this?
Comment 13 Ross Kirsling 2017-04-13 21:00:43 PDT
That would be great! :)
Comment 14 WebKit Commit Bot 2017-04-13 21:47:22 PDT
Comment on attachment 307085 [details]

Clearing flags on attachment: 307085

Committed r215357: <http://trac.webkit.org/changeset/215357>
Comment 15 WebKit Commit Bot 2017-04-13 21:47:23 PDT
All reviewed patches have been landed.  Closing bug.