Source code
Revision control
Copy as Markdown
Other Tools
/* -*- 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
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,
});
}