Vscode: Make it possible to use drag and drop in a webview

Created on 6 Jul 2016  路  40Comments  路  Source: microsoft/vscode

  • VSCode Version: 1.3.0-insider
  • OS Version: windows7

Steps to Reproduce:

  1. Download My extension: https://github.com/f111fei/test-files/raw/master/webview-test-0.0.1.vsix
  2. Run command Hello Webview to open my webview.

Problem:

  1. Drag Button into TextArea. Dragfeedback overlay will prevent my dragging action.
  2. Typing some text in the textarea. Use Ctrl+A to select all, Nothing happen.

Reason

  1. see https://github.com/Microsoft/vscode/blob/master/src/vs/workbench/electron-browser/window.ts#L91, the default drag handler is prevented.
  2. see https://github.com/Microsoft/vscode/blob/master/src/vs/platform/keybinding/browser/keybindingServiceImpl.ts#L380, selectAll handler is prevented.

1

feature-request help wanted webview

Most helpful comment

It would be fantastic to enable drag and drop into webviews. This screenshot shows how my extension's toolbox palette is able to render in the sidebar thanks to #46585. However, that doesn't do much good unless the user can drag items from the palette onto the canvas webview displayed in the editor.

Is this enhancement so foundational a change that it's unlikely to be considered?

workflow

All 40 comments

Taking out the preventDefault() from the dragover allows to drop any file/url into the window to open it and replace all of VS Code, so I am not easy to make a change there...

@jrieken for the second issue.

Problem is that Cmd+A is not guarded by when and which is done here

@jrieken @bpasero As I am working on a Windows machine, I can definitely remove that.

IIRC there was something inherently broken on the Mac (cmd+a not working in dev tools or something weird like that) that made @bpasero and I do that change and not have a when for cmd+a.

Moreover, regardless of our changing the rule for cmd+a, I think the problem on the mac is that:

  • cmd+a appears in the menu
  • the menu natively captures the keydown
  • the menu sends to the wrong renderer process the command invocation

But maybe things have changed since we last looked at this.

@bpasero @jrieken I have pushed the fix you suggested, but I don't have a mac to try it out. Please try to do Ctrl+A in a native input such as the find widget or the git commit input box and check if it still works. If it does not work, then please revert 151d236

@alexandrudima I can confirm that Cmd+A selects all in input fields and still in the editor. It does not select all in the though.

There is another bug where Undo/Redo do no work in native input fields and I guess that is related. Can we apply your fix for these commands too?

@alexandrudima I see an issue when selecting an item in the explorer and pressing Cmd+A it selects all of the editor tho it doesn't have focus. Is that the intent?

jul-15-2016 09-57-52

@jrieken That is what I'm trying to explain here unsuccessfully. It is not the keybindings service that executes editor.action.selectAll, but on the mac cmd+a is captured by the menu (because it appears as an accelerator in the menus) and then the menu sends a vscode:runAction ipc message to the focused renderer process and executes editor.action.selectAll.

In fact, that is the case with all accelerators that appear in the menu on the mac. This is not the case under windows.

The select all code falls back as a last chance to select last active editor:

https://github.com/Microsoft/vscode/blob/master/src/vs/editor/common/config/config.ts#L397

It also does the manual select all on input fields:

    // Ignore this action when user is focussed on an element that allows for entering text
    let activeElement = <HTMLElement>document.activeElement;
    if (activeElement && ['input', 'textarea'].indexOf(activeElement.tagName.toLowerCase()) >= 0) {
        (<any>activeElement).select();
        return;
    }

The select all behaviour in the explorer has been like that before already because we do not have multi select in the explorer. The fact that focus does not move has been reported already as far as I remember and is not very nice.

yeah - we should either focus the editor after selecting all or ignore the command if the editor isn't focused

I would just focus the editor, many people actually find it useful that Ctrl+A always goes to the editor, so I would not disable that.

untitled

I like it.

@alexandrudima what do you think? seems as easy as adding editor.focus() before https://github.com/Microsoft/vscode/blob/master/src/vs/editor/common/config/config.ts#L401

@bpasero :+1: Please do the change, we wrote that code together at your machine a long time ago :)

@jrieken It is not clear to me if my change fixed this issue.

@f111fei Did the changes resolve your issue?

@jrieken selectAll is ok now. But Problem1(drag in webview) is still unresolved.

Thanks for the feedback. Assigning to @bpasero for the dnd part

@f111fei I tried your suggested change from https://github.com/f111fei/vscode/commit/36a8dcda5548ab61dbd3f15de993b2e2688f27fb and it causes an issue as you can see from the GIF below.

Please feel free to provide another PR with a solution, I am not sure though it is that easy. Your change is preventing all DND operations from happening in the webview and this means you cannot drop a tab or file anymore onto the editor area to open it. Worse, it opens the actual file as source into the webview.

editors

it opens the actual file as source into the webview.

@bpasero We maybe can add some code in webview.html ?

// Prevent some events
window.addEventListener('dragover', (e) => {
    e.preventDefault();
});

window.addEventListener('drop', (e) => {
    e.preventDefault();
});

I would appreciate a PR in this area that solves it because this is not really on the radar for August (given other priorities) and I think it is "nice to have" and stretches the ability what you can do with webviews (which I find questionable).

Also, I find it bad UX if it blocks a user from dropping a tab into the editor area because to a user it might totally not obvious that something inside the webview accepts the drop and we will get many bugs for that.

yeah, this issue is contradictory. it impossible to meet all requirements simultaneously.

The Ctrl+A issue is back on the table and if you find a solution via PR that does not break the world, we would be happy to review :)

@bpasero, can we also have the function to use mouse right click in webview, and I also want native support ctrl+F to find

@Huachao yes, but please follow our issue guidelines and create separate issues for separate issues.

@bpasero I already include this request in my original issue, however you closed it...

@Huachao trying to teach you how to write good issues :)

@bpasero , sorry for the inconvenience, I thought the title and the description is easy to read, while in fact it's poor. Anyway, is this feature request in your recent schedule?

@Huachao currently not, but if someone is willing to help, we accept pull requests.

@bpasero thanks 馃槂

@mjbvz any progress about this?

Reopening this to track just the drag and drop part. Select all was added by #54851

It would be fantastic to enable drag and drop into webviews. This screenshot shows how my extension's toolbox palette is able to render in the sidebar thanks to #46585. However, that doesn't do much good unless the user can drag items from the palette onto the canvas webview displayed in the editor.

Is this enhancement so foundational a change that it's unlikely to be considered?

workflow

I have a similar problem as Donald is having above. This looks like a fundamental problem with this framework. Are there any design patterns or workaround to drag and drop functionality in webview? What was the rationale to not support this kind of feature?

Was this page helpful?
0 / 5 - 0 ratings