summaryrefslogtreecommitdiffstats
path: root/mobile/android/chrome/content/InputWidgetHelper.js
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/chrome/content/InputWidgetHelper.js')
-rw-r--r--mobile/android/chrome/content/InputWidgetHelper.js98
1 files changed, 98 insertions, 0 deletions
diff --git a/mobile/android/chrome/content/InputWidgetHelper.js b/mobile/android/chrome/content/InputWidgetHelper.js
new file mode 100644
index 000000000..9c753bd7b
--- /dev/null
+++ b/mobile/android/chrome/content/InputWidgetHelper.js
@@ -0,0 +1,98 @@
+/* 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";
+
+var InputWidgetHelper = {
+ _uiBusy: false,
+
+ handleEvent: function(aEvent) {
+ this.handleClick(aEvent.target);
+ },
+
+ handleClick: function(aTarget) {
+ // if we're busy looking at a InputWidget we want to eat any clicks that
+ // come to us, but not to process them
+ if (this._uiBusy || !this.hasInputWidget(aTarget) || this._isDisabledElement(aTarget))
+ return;
+
+ this._uiBusy = true;
+ this.show(aTarget);
+ this._uiBusy = false;
+ },
+
+ show: function(aElement) {
+ let type = aElement.getAttribute('type');
+ let p = new Prompt({
+ window: aElement.ownerDocument.defaultView,
+ title: Strings.browser.GetStringFromName("inputWidgetHelper." + aElement.getAttribute('type')),
+ buttons: [
+ Strings.browser.GetStringFromName("inputWidgetHelper.set"),
+ Strings.browser.GetStringFromName("inputWidgetHelper.clear"),
+ Strings.browser.GetStringFromName("inputWidgetHelper.cancel")
+ ],
+ }).addDatePicker({
+ value: aElement.value,
+ type: type,
+ min: aElement.min,
+ max: aElement.max,
+ }).show((function(data) {
+ let changed = false;
+ if (data.button == -1) {
+ // This type is not supported with this android version.
+ return;
+ }
+ if (data.button == 1) {
+ // The user cleared the value.
+ if (aElement.value != "") {
+ aElement.value = "";
+ changed = true;
+ }
+ } else if (data.button == 0) {
+ // Commit the new value.
+ if (aElement.value != data[type]) {
+ aElement.value = data[type + "0"];
+ changed = true;
+ }
+ }
+ // Else the user canceled the input.
+
+ if (changed)
+ this.fireOnChange(aElement);
+ }).bind(this));
+ },
+
+ hasInputWidget: function(aElement) {
+ if (!aElement instanceof HTMLInputElement)
+ return false;
+
+ let type = aElement.getAttribute('type');
+ if (type == "date" || type == "datetime" || type == "datetime-local" ||
+ type == "week" || type == "month" || type == "time") {
+ return true;
+ }
+
+ return false;
+ },
+
+ fireOnChange: function(aElement) {
+ let evt = aElement.ownerDocument.createEvent("Events");
+ evt.initEvent("change", true, true, aElement.defaultView, 0,
+ false, false,
+ false, false, null);
+ setTimeout(function() {
+ aElement.dispatchEvent(evt);
+ }, 0);
+ },
+
+ _isDisabledElement : function(aElement) {
+ let currentElement = aElement;
+ while (currentElement) {
+ if (currentElement.disabled)
+ return true;
+
+ currentElement = currentElement.parentElement;
+ }
+ return false;
+ }
+};