diff options
Diffstat (limited to 'mobile/android/chrome/content/InputWidgetHelper.js')
-rw-r--r-- | mobile/android/chrome/content/InputWidgetHelper.js | 98 |
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; + } +}; |