gecko-dev/toolkit/actors/DateTimePickerParent.jsm

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

155 строки
4.2 KiB
JavaScript
Исходник Обычный вид История

/* 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/. */
"use strict";
const DEBUG = false;
function debug(aStr) {
if (DEBUG) {
dump("-*- DateTimePickerParent: " + aStr + "\n");
}
}
var EXPORTED_SYMBOLS = ["DateTimePickerParent"];
Bug 1514594: Part 3 - Change ChromeUtils.import API. *** Bug 1514594: Part 3a - Change ChromeUtils.import to return an exports object; not pollute global. r=mccr8 This changes the behavior of ChromeUtils.import() to return an exports object, rather than a module global, in all cases except when `null` is passed as a second argument, and changes the default behavior not to pollute the global scope with the module's exports. Thus, the following code written for the old model: ChromeUtils.import("resource://gre/modules/Services.jsm"); is approximately the same as the following, in the new model: var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm"); Since the two behaviors are mutually incompatible, this patch will land with a scripted rewrite to update all existing callers to use the new model rather than the old. *** Bug 1514594: Part 3b - Mass rewrite all JS code to use the new ChromeUtils.import API. rs=Gijs This was done using the followng script: https://bitbucket.org/kmaglione/m-c-rewrites/src/tip/processors/cu-import-exports.jsm *** Bug 1514594: Part 3c - Update ESLint plugin for ChromeUtils.import API changes. r=Standard8 Differential Revision: https://phabricator.services.mozilla.com/D16747 *** Bug 1514594: Part 3d - Remove/fix hundreds of duplicate imports from sync tests. r=Gijs Differential Revision: https://phabricator.services.mozilla.com/D16748 *** Bug 1514594: Part 3e - Remove no-op ChromeUtils.import() calls. r=Gijs Differential Revision: https://phabricator.services.mozilla.com/D16749 *** Bug 1514594: Part 3f.1 - Cleanup various test corner cases after mass rewrite. r=Gijs *** Bug 1514594: Part 3f.2 - Cleanup various non-test corner cases after mass rewrite. r=Gijs Differential Revision: https://phabricator.services.mozilla.com/D16750 --HG-- extra : rebase_source : 359574ee3064c90f33bf36c2ebe3159a24cc8895 extra : histedit_source : b93c8f42808b1599f9122d7842d2c0b3e656a594%2C64a3a4e3359dc889e2ab2b49461bab9e27fc10a7
2019-01-17 21:18:31 +03:00
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
ChromeUtils.defineModuleGetter(
this,
"DateTimePickerPanel",
"resource://gre/modules/DateTimePickerPanel.jsm"
);
/*
* DateTimePickerParent receives message from content side (input box) and
* is reposible for opening, closing and updating the picker. Similarly,
* DateTimePickerParent listens for picker's events and notifies the content
* side (input box) about them.
*/
class DateTimePickerParent extends JSWindowActorParent {
receiveMessage(aMessage) {
debug("receiveMessage: " + aMessage.name);
switch (aMessage.name) {
case "FormDateTime:OpenPicker": {
let topBrowsingContext = this.manager.browsingContext.top;
let browser = topBrowsingContext.embedderElement;
this.showPicker(browser, aMessage.data);
break;
}
case "FormDateTime:ClosePicker": {
if (!this._picker) {
return;
}
this._picker.closePicker();
this.close();
break;
}
case "FormDateTime:UpdatePicker": {
if (!this._picker) {
return;
}
this._picker.setPopupValue(aMessage.data);
break;
}
default:
break;
}
}
handleEvent(aEvent) {
debug("handleEvent: " + aEvent.type);
switch (aEvent.type) {
case "DateTimePickerValueChanged": {
this.sendAsyncMessage("FormDateTime:PickerValueChanged", aEvent.detail);
break;
}
case "popuphidden": {
this.sendAsyncMessage("FormDateTime:PickerClosed", {});
this._picker.closePicker();
this.close();
break;
}
default:
break;
}
}
// Get picker from browser and show it anchored to the input box.
showPicker(aBrowser, aData) {
let rect = aData.rect;
let type = aData.type;
let detail = aData.detail;
this._anchor = aBrowser.popupAnchor;
if (!this._anchor) {
throw new Error(
"No popup anchor for this browser, cannot show date picker"
);
}
this._anchor.style.left = rect.left + "px";
this._anchor.style.top = rect.top + "px";
this._anchor.style.width = rect.width + "px";
this._anchor.style.height = rect.height + "px";
this._anchor.hidden = false;
debug("Opening picker with details: " + JSON.stringify(detail));
let window = aBrowser.ownerGlobal;
let tabbrowser = window.gBrowser;
if (
Services.focus.activeWindow != window ||
(tabbrowser && tabbrowser.selectedBrowser != aBrowser)
) {
// We were sent a message from a window or tab that went into the
// background, so we'll ignore it for now.
return;
}
let panel;
if (tabbrowser) {
panel = tabbrowser._getAndMaybeCreateDateTimePickerPanel();
} else {
panel = aBrowser.dateTimePicker;
}
if (!panel) {
debug("aBrowser.dateTimePicker not found, exiting now.");
return;
}
this._picker = new DateTimePickerPanel(panel);
// The arrow panel needs an anchor to work. The popupAnchor (this._anchor)
// is a transparent div that the arrow can point to.
this._picker.openPicker(type, this._anchor, detail);
this.addPickerListeners();
}
// Picker is closed, do some cleanup.
close() {
this.removePickerListeners();
this._picker = null;
this._anchor.hidden = true;
}
// Listen to picker's event.
addPickerListeners() {
if (!this._picker) {
return;
}
this._picker.element.addEventListener("popuphidden", this);
this._picker.element.addEventListener("DateTimePickerValueChanged", this);
}
// Stop listening to picker's event.
removePickerListeners() {
if (!this._picker) {
return;
}
this._picker.element.removeEventListener("popuphidden", this);
this._picker.element.removeEventListener(
"DateTimePickerValueChanged",
this
);
}
}