121 lines
3.6 KiB
JavaScript
121 lines
3.6 KiB
JavaScript
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
import { DragChildContextBase } from "./DragChildContextBase.sys.mjs";
|
|
|
|
export class DragSourceChildContext extends DragChildContextBase {
|
|
// "editing-host" element (if any) at start of the drag
|
|
editingHost = null;
|
|
|
|
constructor(aDragWindow, aParams) {
|
|
super("dragSource", aDragWindow, aParams);
|
|
|
|
// Store current "editing-host" element so we can determine if the dragend
|
|
// went to the right place.
|
|
if (!this.dragElement.matches(":read-write")) {
|
|
return;
|
|
}
|
|
let lastEditableElement = this.dragElement;
|
|
for (
|
|
let inclusiveAncestor = this.getInclusiveFlattenedTreeParentElement(
|
|
this.dragElement
|
|
);
|
|
inclusiveAncestor;
|
|
inclusiveAncestor = this.getInclusiveFlattenedTreeParentElement(
|
|
inclusiveAncestor.flattenedTreeParentNode
|
|
)
|
|
) {
|
|
if (inclusiveAncestor.matches(":read-write")) {
|
|
lastEditableElement = inclusiveAncestor;
|
|
if (lastEditableElement == this.dragElement.ownerDocument.body) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
this.editingHost = lastEditableElement;
|
|
}
|
|
|
|
async checkMouseDown() {
|
|
if (!this.expectNoDragEvents) {
|
|
this.ok(!!this.events.mousedown[0], "mousedown existed");
|
|
if (this.events.mousedown[0]) {
|
|
this.ok(
|
|
this.nodeIsFlattenedTreeDescendantOf(
|
|
this.events.mousedown[0].composedTarget,
|
|
this.dragElement
|
|
),
|
|
"event target of mousedown is srcElement or a descendant"
|
|
);
|
|
}
|
|
}
|
|
await this.checkExpected();
|
|
}
|
|
|
|
async checkDragStart() {
|
|
// Check that content still has drag session since it could have been
|
|
// canceled (by the caller's dragstart).
|
|
if (this.expectNoDragEvents || this.expectCancelDragStart) {
|
|
this.info(`Drag was pre-existing: ${this.alreadyHadSession}`);
|
|
this.ok(
|
|
!this.dragService.getCurrentSession(this.dragWindow) ||
|
|
this.alreadyHadSession,
|
|
`no drag session in src process unless one was pre-existing`
|
|
);
|
|
} else {
|
|
this.ok(
|
|
!!this.dragService.getCurrentSession(this.dragWindow),
|
|
`drag session was started in src process`
|
|
);
|
|
this.ok(!!this.events.dragstart[0], "dragstart existed");
|
|
if (this.events.dragstart[0]) {
|
|
this.ok(
|
|
this.nodeIsFlattenedTreeDescendantOf(
|
|
this.events.dragstart[0].composedTarget,
|
|
this.dragElement
|
|
),
|
|
"event target of dragstart is srcElement or a descendant"
|
|
);
|
|
}
|
|
await this.checkExpected();
|
|
}
|
|
}
|
|
|
|
async checkDragEnd() {
|
|
if (!this.expectNoDragEvents) {
|
|
this.ok(!!this.events.dragend[0], "dragend existed");
|
|
if (this.events.dragend[0]) {
|
|
this.ok(
|
|
this.nodeIsFlattenedTreeDescendantOf(
|
|
this.events.dragend[0].composedTarget,
|
|
this.dragElement
|
|
),
|
|
"event target of dragend is srcElement or a descendant"
|
|
);
|
|
if (this.editingHost) {
|
|
this.ok(
|
|
this.events.dragend[0].composedTarget == this.editingHost,
|
|
`event target of dragend was editingHost`
|
|
);
|
|
}
|
|
}
|
|
}
|
|
await this.checkExpected();
|
|
}
|
|
}
|
|
|
|
export function createDragSourceChildContext(
|
|
aDragWindow,
|
|
aParams,
|
|
aOk,
|
|
aIs,
|
|
aInfo
|
|
) {
|
|
aDragWindow.dragSource = new DragSourceChildContext(aDragWindow, {
|
|
...aParams,
|
|
ok: aOk,
|
|
is: aIs,
|
|
info: aInfo,
|
|
});
|
|
}
|