tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit efe3e03986b32b766da0eaa520340e21d4d48e45
parent 46cc02b55a48253dcde31885e07baca49dda0a1a
Author: Kagami Sascha Rosylight <krosylight@proton.me>
Date:   Thu, 11 Dec 2025 17:49:58 +0000

Bug 2005495 - Stop updating the picker when the input value is changed r=emilio,webidl

Updating the picker while the user is still deciding their choice is surprising to the user.

Given neither Chrome nor Safari is doing this, it should be safe to unship this behavior.

Differential Revision: https://phabricator.services.mozilla.com/D275977

Diffstat:
Mdom/html/HTMLInputElement.cpp | 11-----------
Mdom/html/HTMLInputElement.h | 3+--
Mdom/webidl/HTMLInputElement.webidl | 3---
Mtoolkit/actors/DateTimePickerChild.sys.mjs | 6------
Mtoolkit/actors/DateTimePickerParent.sys.mjs | 7-------
Mtoolkit/content/widgets/datepicker.js | 35-----------------------------------
Mtoolkit/content/widgets/datetimebox.js | 12------------
Mtoolkit/content/widgets/timepicker.js | 28----------------------------
Mtoolkit/modules/ActorManagerParent.sys.mjs | 1-
Mtoolkit/modules/DateTimePickerPanel.sys.mjs | 10----------
Mtools/@types/generated/lib.gecko.dom.d.ts | 3+--
11 files changed, 2 insertions(+), 117 deletions(-)

diff --git a/dom/html/HTMLInputElement.cpp b/dom/html/HTMLInputElement.cpp @@ -2313,17 +2313,6 @@ void HTMLInputElement::OpenDateTimePicker(const DateTimeValue& aInitialValue) { CanBubble::eYes, Cancelable::eYes); } -void HTMLInputElement::UpdateDateTimePicker(const DateTimeValue& aValue) { - if (NS_WARN_IF(!IsDateTimeInputType(mType))) { - return; - } - - mDateTimeInputBoxValue = MakeUnique<DateTimeValue>(aValue); - nsContentUtils::DispatchChromeEvent(OwnerDoc(), static_cast<Element*>(this), - u"MozUpdateDateTimePicker"_ns, - CanBubble::eYes, Cancelable::eYes); -} - void HTMLInputElement::CloseDateTimePicker() { if (NS_WARN_IF(!IsDateTimeInputType(mType))) { return; diff --git a/dom/html/HTMLInputElement.h b/dom/html/HTMLInputElement.h @@ -778,11 +778,10 @@ class HTMLInputElement final : public TextControlElement, Element* GetDateTimeBoxElement(); /* - * The following functions are called from datetime input box XBL to control + * The following functions are called from the datetimebox element to control * and update the picker. */ void OpenDateTimePicker(const DateTimeValue& aInitialValue); - void UpdateDateTimePicker(const DateTimeValue& aValue); void CloseDateTimePicker(); /** diff --git a/dom/webidl/HTMLInputElement.webidl b/dom/webidl/HTMLInputElement.webidl @@ -271,9 +271,6 @@ partial interface HTMLInputElement { undefined openDateTimePicker(optional DateTimeValue initialValue = {}); [Func="IsChromeOrUAWidget"] - undefined updateDateTimePicker(optional DateTimeValue value = {}); - - [Func="IsChromeOrUAWidget"] undefined closeDateTimePicker(); [Func="IsChromeOrUAWidget"] diff --git a/toolkit/actors/DateTimePickerChild.sys.mjs b/toolkit/actors/DateTimePickerChild.sys.mjs @@ -176,12 +176,6 @@ export class DateTimePickerChild extends JSWindowActorChild { }); break; } - case "MozUpdateDateTimePicker": { - let value = this._inputElement.getDateTimeInputBoxValue(); - value.type = this._inputElement.type; - this.sendAsyncMessage("FormDateTime:UpdatePicker", { value }); - break; - } case "MozCloseDateTimePicker": { this.sendAsyncMessage("FormDateTime:ClosePicker", {}); this.close(); diff --git a/toolkit/actors/DateTimePickerParent.sys.mjs b/toolkit/actors/DateTimePickerParent.sys.mjs @@ -35,13 +35,6 @@ export class DateTimePickerParent extends JSWindowActorParent { this.close(); break; } - case "FormDateTime:UpdatePicker": { - if (!this._picker) { - return; - } - this._picker.setPopupValue(aMessage.data); - break; - } default: break; } diff --git a/toolkit/content/widgets/datepicker.js b/toolkit/content/widgets/datepicker.js @@ -380,47 +380,12 @@ function DatePicker(context) { */ handleMessage(event) { switch (event.data.name) { - case "PickerSetValue": { - if (!this.context.root.hidden) { - this.set(event.data.detail); - } - break; - } case "PickerInit": { this.init(event.data.detail); break; } } }, - - /** - * Set the date state and update the components with the new state. - * - * @param {object} dateState - * { - * {Number} year [optional] - * {Number} month [optional] - * {Number} date [optional] - * } - */ - set({ year, month, day }) { - if (!this.state) { - return; - } - - const { dateKeeper } = this.state; - - dateKeeper.setCalendarMonth({ - year, - month, - }); - dateKeeper.setSelection({ - year, - month, - day, - }); - this._update({ noSmoothScroll: true }); - }, }; /** diff --git a/toolkit/content/widgets/datetimebox.js b/toolkit/content/widgets/datetimebox.js @@ -488,12 +488,6 @@ this.DateTimeBoxWidget = class { } } - notifyPicker() { - if (this.mIsPickerOpen && this.isAnyFieldAvailable(true)) { - this.mInputElement.updateDateTimePicker(this.getCurrentValue()); - } - } - isDisabled() { return this.mInputElement.matches(":disabled"); } @@ -1034,8 +1028,6 @@ this.DateTimeBoxWidget = class { this.setFieldValue(this.mMillisecField, millisecond || 0); } } - - this.notifyPicker(); } setInputValueFromFields() { @@ -1048,9 +1040,6 @@ this.DateTimeBoxWidget = class { } else { this.mInputElement.updateValidityState(); } - // We still need to notify picker in case any of the field has - // changed. - this.notifyPicker(); return; } @@ -1111,7 +1100,6 @@ this.DateTimeBoxWidget = class { return; } this.log("setInputValueFromFields: " + value); - this.notifyPicker(); this.mInputElement.setUserInput(value); } diff --git a/toolkit/content/widgets/timepicker.js b/toolkit/content/widgets/timepicker.js @@ -353,12 +353,6 @@ function TimePicker(context) { */ handleMessage(event) { switch (event.data.name) { - case "PickerSetValue": { - if (!this.context.hidden) { - this.set(event.data.detail); - } - break; - } case "PickerInit": { this.init(event.data.detail); break; @@ -423,28 +417,6 @@ function TimePicker(context) { document.l10n.setAttributes(btn, l10nId); } }, - - /** - * Set the time state and update the components with the new state. - * - * @param {object} timeState - * { - * {Number} hour [optional] - * {Number} minute [optional] - * {Number} second [optional] - * {Number} millisecond [optional] - * } - */ - set(timeState) { - if (timeState.hour != undefined) { - this.state.isHourSet = true; - } - if (timeState.minute != undefined) { - this.state.isMinuteSet = true; - } - this.state.timeKeeper.setState(timeState); - this._setComponentStates(); - }, }; } diff --git a/toolkit/modules/ActorManagerParent.sys.mjs b/toolkit/modules/ActorManagerParent.sys.mjs @@ -701,7 +701,6 @@ if (AppConstants.platform != "android") { esModuleURI: "resource://gre/actors/DateTimePickerChild.sys.mjs", events: { MozOpenDateTimePicker: {}, - MozUpdateDateTimePicker: {}, MozCloseDateTimePicker: {}, }, }, diff --git a/toolkit/modules/DateTimePickerPanel.sys.mjs b/toolkit/modules/DateTimePickerPanel.sys.mjs @@ -81,16 +81,6 @@ export class DateTimePickerPanel { this.element.hidePopup(); } - setPopupValue(data) { - const detail = data.value; - // Month value from input box starts from 1 instead of 0 - detail.month = detail.month == undefined ? undefined : detail.month - 1; - this.postMessageToPicker({ - name: "PickerSetValue", - detail, - }); - } - initPicker(detail) { let locale = new Services.intl.Locale( Services.locale.webExposedLocales[0], diff --git a/tools/@types/generated/lib.gecko.dom.d.ts b/tools/@types/generated/lib.gecko.dom.d.ts @@ -11854,15 +11854,14 @@ interface HTMLInputElement extends HTMLElement, MozEditableElement, MozImageLoad reportValidity(): boolean; select(): void; setCustomValidity(error: string): void; - setDateTimePickerState(aIsOpen: boolean): void; setFocusState(aIsFocused: boolean): void; + setOpenState(aIsOpen: boolean): void; setRangeText(replacement: string): void; setRangeText(replacement: string, start: number, end: number, selectionMode?: SelectionMode): void; setSelectionRange(start: number, end: number, direction?: string): void; showPicker(): void; stepDown(n?: number): void; stepUp(n?: number): void; - updateDateTimePicker(value?: DateTimeValue): void; updateValidityState(): void; addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLInputElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;