mirror of
https://github.com/react/react-native-devtools-frontend.git
synced 2026-10-10 05:35:05 +08:00
Move and rename files. NOAUTOREVERT=true NOPRESUBMIT=true NOTREECHECKS=true Bug: 768828 TBR=darin@chromium.org NOTRY=true Change-Id: I66d3b155808bc5bdbf237b80208e1e552bcf7f28 Reviewed-on: https://chromium-review.googlesource.com/1001153 Reviewed-by: Blink Reformat <blink-reformat@chromium.org> Commit-Queue: Blink Reformat <blink-reformat@chromium.org> Cr-Original-Commit-Position: refs/heads/master@{#549061} Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src Cr-Mirrored-Commit: 0aee4434a4dba42a42abaea9bfbc0cd196a63bc1
102 lines
2.7 KiB
JavaScript
102 lines
2.7 KiB
JavaScript
// Copyright (c) 2015 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
/**
|
|
* @unrestricted
|
|
*/
|
|
UI.DropTarget = class {
|
|
/**
|
|
* @param {!Element} element
|
|
* @param {!Array<{kind: string, type: !RegExp}>} transferTypes
|
|
* @param {string} messageText
|
|
* @param {function(!DataTransfer)} handleDrop
|
|
*/
|
|
constructor(element, transferTypes, messageText, handleDrop) {
|
|
element.addEventListener('dragenter', this._onDragEnter.bind(this), true);
|
|
element.addEventListener('dragover', this._onDragOver.bind(this), true);
|
|
this._element = element;
|
|
this._transferTypes = transferTypes;
|
|
this._messageText = messageText;
|
|
this._handleDrop = handleDrop;
|
|
this._enabled = true;
|
|
}
|
|
|
|
/**
|
|
* @param {boolean} enabled
|
|
*/
|
|
setEnabled(enabled) {
|
|
this._enabled = enabled;
|
|
}
|
|
|
|
/**
|
|
* @param {!Event} event
|
|
*/
|
|
_onDragEnter(event) {
|
|
if (this._enabled && this._hasMatchingType(event))
|
|
event.consume(true);
|
|
}
|
|
|
|
/**
|
|
* @param {!Event} event
|
|
* @return {boolean}
|
|
*/
|
|
_hasMatchingType(event) {
|
|
for (const transferType of this._transferTypes) {
|
|
const found = Array.from(event.dataTransfer.items).find(item => {
|
|
return transferType.kind === item.kind && !!transferType.type.exec(item.type);
|
|
});
|
|
if (found)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @param {!Event} event
|
|
*/
|
|
_onDragOver(event) {
|
|
if (!this._enabled || !this._hasMatchingType(event))
|
|
return;
|
|
event.dataTransfer.dropEffect = 'copy';
|
|
event.consume(true);
|
|
if (this._dragMaskElement)
|
|
return;
|
|
this._dragMaskElement = this._element.createChild('div', '');
|
|
const shadowRoot = UI.createShadowRootWithCoreStyles(this._dragMaskElement, 'ui/dropTarget.css');
|
|
shadowRoot.createChild('div', 'drop-target-message').textContent = this._messageText;
|
|
this._dragMaskElement.addEventListener('drop', this._onDrop.bind(this), true);
|
|
this._dragMaskElement.addEventListener('dragleave', this._onDragLeave.bind(this), true);
|
|
}
|
|
|
|
/**
|
|
* @param {!Event} event
|
|
*/
|
|
_onDrop(event) {
|
|
event.consume(true);
|
|
this._removeMask();
|
|
if (this._enabled)
|
|
this._handleDrop(event.dataTransfer);
|
|
}
|
|
|
|
/**
|
|
* @param {!Event} event
|
|
*/
|
|
_onDragLeave(event) {
|
|
event.consume(true);
|
|
this._removeMask();
|
|
}
|
|
|
|
_removeMask() {
|
|
this._dragMaskElement.remove();
|
|
delete this._dragMaskElement;
|
|
}
|
|
};
|
|
|
|
UI.DropTarget.Type = {
|
|
URI: {kind: 'string', type: /text\/uri-list/},
|
|
Folder: {kind: 'file', type: /$^/},
|
|
File: {kind: 'file', type: /.*/},
|
|
WebFile: {kind: 'file', type: /[\w]+/},
|
|
ImageFile: {kind: 'file', type: /image\/.*/},
|
|
};
|