- Revision
- 279181
- Author
- akeer...@apple.com
- Date
- 2021-06-23 13:02:35 -0700 (Wed, 23 Jun 2021)
Log Message
[iOS] Adopt new date picker presentation SPI
https://bugs.webkit.org/show_bug.cgi?id=227221
<rdar://problem/77930086>
Reviewed by Wenson Hsieh.
Source/WebKit:
In native applications, tapping on a compact UIDatePicker presents an
inline picker using _UIDatePickerOverlayPresentation. To avoid
maintaining our own presentation logic, and to better match the native
presentation, use _UIDatePickerOverlayPresentation when tapping on a
date/time input in WebKit.
Covered by existing tests.
* Platform/spi/ios/UIKitSPI.h:
Declare the SPI rather than importing the header directly, as the
_UIDatePickerOverlayAnchor enum is not available in all SDKs with
the header.
* UIProcess/ios/forms/WKDateTimeInputControl.mm:
(-[WKDateTimePickerViewController initWithDatePicker:]):
(-[WKDateTimePickerViewController setDelegate:]):
(-[WKDateTimePicker initWithView:datePickerMode:]):
Create the UIDatePicker here so it can be shared by the old context menu
presentation and the new overlay presentation.
(-[WKDateTimePicker handleDatePickerPresentationDismissal]):
(-[WKDateTimePicker removeDatePickerPresentation]):
`accessoryDone` eventually removes the presentation. If the date picker
is already being dismissed, do not dismiss it without an animation.
For programmatic dismissal (using blur()) this method is called prior to
`accessoryDone`, in which case we force dismissal without animation.
(-[WKDateTimePicker dateTimePickerViewControllerDidPressResetButton:]):
(-[WKDateTimePicker dateTimePickerViewControllerDidPressDoneButton:]):
(-[WKDateTimePicker showDateTimePicker]):
(-[WKDateTimePicker datePickerChanged:]):
(-[WKDateTimePicker reset:]):
(-[WKDateTimePicker done:]):
(-[WKDateTimePicker dealloc]):
(-[WKDateTimePicker _timeZoneOffsetFromGMT:]):
(-[WKDateTimePicker dateFormatterForPicker]):
(-[WKDateTimePicker _dateChangedSetAsNumber]):
(-[WKDateTimePicker _dateChangedSetAsString]):
(-[WKDateTimePicker setDateTimePickerToInitialValue]):
(-[WKDateTimePicker controlBeginEditing]):
(-[WKDateTimePicker controlEndEditing]):
(-[WKDateTimePicker calendarType]):
(-[WKDateTimePicker hour]):
(-[WKDateTimePicker minute]):
(-[WKDateTimePicker setHour:minute:]):
Source/WTF:
* wtf/PlatformHave.h:
Add HAVE(UIDATEPICKER_OVERLAY_PRESENTATION) and HAVE(UITOOLBAR_STANDARD_APPEARANCE).
LayoutTests:
* fast/forms/ios/constant-scroll-area-when-moving-focus-between-fields.html:
Re-order the call to wait for the keyboard to dismiss since the
presentation SPI doesn't tell us exactly when the presentation animation
is complete. The other alternative was to add a manual delay, however,
re-ordering the calls is safe and preserves the original test behavior.
Modified Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (279180 => 279181)
--- trunk/LayoutTests/ChangeLog 2021-06-23 19:40:45 UTC (rev 279180)
+++ trunk/LayoutTests/ChangeLog 2021-06-23 20:02:35 UTC (rev 279181)
@@ -1,3 +1,18 @@
+2021-06-23 Aditya Keerthi <akeer...@apple.com>
+
+ [iOS] Adopt new date picker presentation SPI
+ https://bugs.webkit.org/show_bug.cgi?id=227221
+ <rdar://problem/77930086>
+
+ Reviewed by Wenson Hsieh.
+
+ * fast/forms/ios/constant-scroll-area-when-moving-focus-between-fields.html:
+
+ Re-order the call to wait for the keyboard to dismiss since the
+ presentation SPI doesn't tell us exactly when the presentation animation
+ is complete. The other alternative was to add a manual delay, however,
+ re-ordering the calls is safe and preserves the original test behavior.
+
2021-06-23 Arcady Goldmints-Orlov <agoldmi...@igalia.com>
[GLIB] Unreviewed test gardening, skip a WebGL2 test
Modified: trunk/LayoutTests/fast/forms/ios/constant-scroll-area-when-moving-focus-between-fields.html (279180 => 279181)
--- trunk/LayoutTests/fast/forms/ios/constant-scroll-area-when-moving-focus-between-fields.html 2021-06-23 19:40:45 UTC (rev 279180)
+++ trunk/LayoutTests/fast/forms/ios/constant-scroll-area-when-moving-focus-between-fields.html 2021-06-23 20:02:35 UTC (rev 279181)
@@ -22,8 +22,8 @@
await UIHelper.activateElementAndWaitForInputSession(text);
await UIHelper.activateElementAndWaitForInputSession(date);
+ await UIHelper.waitForKeyboardToHide();
document.activeElement.blur();
- await UIHelper.waitForKeyboardToHide();
await UIHelper.dragFromPointToPoint(160, 150, 160, 50, 0.1);
await UIHelper.ensureStablePresentationUpdate();
Modified: trunk/Source/WTF/ChangeLog (279180 => 279181)
--- trunk/Source/WTF/ChangeLog 2021-06-23 19:40:45 UTC (rev 279180)
+++ trunk/Source/WTF/ChangeLog 2021-06-23 20:02:35 UTC (rev 279181)
@@ -1,3 +1,15 @@
+2021-06-23 Aditya Keerthi <akeer...@apple.com>
+
+ [iOS] Adopt new date picker presentation SPI
+ https://bugs.webkit.org/show_bug.cgi?id=227221
+ <rdar://problem/77930086>
+
+ Reviewed by Wenson Hsieh.
+
+ * wtf/PlatformHave.h:
+
+ Add HAVE(UIDATEPICKER_OVERLAY_PRESENTATION) and HAVE(UITOOLBAR_STANDARD_APPEARANCE).
+
2021-06-21 Darin Adler <da...@apple.com>
Improve more of the CSS list style implementations
Modified: trunk/Source/WTF/wtf/PlatformHave.h (279180 => 279181)
--- trunk/Source/WTF/wtf/PlatformHave.h 2021-06-23 19:40:45 UTC (rev 279180)
+++ trunk/Source/WTF/wtf/PlatformHave.h 2021-06-23 20:02:35 UTC (rev 279181)
@@ -1057,3 +1057,12 @@
#define HAVE_QUICKLOOK_ITEM_PREVIEW_OPTIONS 1
#define HAVE_QUICKLOOK_PREVIEW_ACTIVITY 1
#endif
+
+// FIXME: Replace the __has_include check with a version check once internal bots are updated (webkit.org/b/227298).
+#if PLATFORM(IOS_FAMILY) && defined __has_include && __has_include(<UIKit/_UIDatePickerOverlayPresentation.h>)
+#define HAVE_UIDATEPICKER_OVERLAY_PRESENTATION 1
+#endif
+
+#if PLATFORM(IOS) || PLATFORM(MACCATALYST)
+#define HAVE_UITOOLBAR_STANDARD_APPEARANCE 1
+#endif
Modified: trunk/Source/WebKit/ChangeLog (279180 => 279181)
--- trunk/Source/WebKit/ChangeLog 2021-06-23 19:40:45 UTC (rev 279180)
+++ trunk/Source/WebKit/ChangeLog 2021-06-23 20:02:35 UTC (rev 279181)
@@ -1,3 +1,61 @@
+2021-06-23 Aditya Keerthi <akeer...@apple.com>
+
+ [iOS] Adopt new date picker presentation SPI
+ https://bugs.webkit.org/show_bug.cgi?id=227221
+ <rdar://problem/77930086>
+
+ Reviewed by Wenson Hsieh.
+
+ In native applications, tapping on a compact UIDatePicker presents an
+ inline picker using _UIDatePickerOverlayPresentation. To avoid
+ maintaining our own presentation logic, and to better match the native
+ presentation, use _UIDatePickerOverlayPresentation when tapping on a
+ date/time input in WebKit.
+
+ Covered by existing tests.
+
+ * Platform/spi/ios/UIKitSPI.h:
+
+ Declare the SPI rather than importing the header directly, as the
+ _UIDatePickerOverlayAnchor enum is not available in all SDKs with
+ the header.
+
+ * UIProcess/ios/forms/WKDateTimeInputControl.mm:
+ (-[WKDateTimePickerViewController initWithDatePicker:]):
+ (-[WKDateTimePickerViewController setDelegate:]):
+ (-[WKDateTimePicker initWithView:datePickerMode:]):
+
+ Create the UIDatePicker here so it can be shared by the old context menu
+ presentation and the new overlay presentation.
+
+ (-[WKDateTimePicker handleDatePickerPresentationDismissal]):
+ (-[WKDateTimePicker removeDatePickerPresentation]):
+
+ `accessoryDone` eventually removes the presentation. If the date picker
+ is already being dismissed, do not dismiss it without an animation.
+
+ For programmatic dismissal (using blur()) this method is called prior to
+ `accessoryDone`, in which case we force dismissal without animation.
+
+ (-[WKDateTimePicker dateTimePickerViewControllerDidPressResetButton:]):
+ (-[WKDateTimePicker dateTimePickerViewControllerDidPressDoneButton:]):
+ (-[WKDateTimePicker showDateTimePicker]):
+ (-[WKDateTimePicker datePickerChanged:]):
+ (-[WKDateTimePicker reset:]):
+ (-[WKDateTimePicker done:]):
+ (-[WKDateTimePicker dealloc]):
+ (-[WKDateTimePicker _timeZoneOffsetFromGMT:]):
+ (-[WKDateTimePicker dateFormatterForPicker]):
+ (-[WKDateTimePicker _dateChangedSetAsNumber]):
+ (-[WKDateTimePicker _dateChangedSetAsString]):
+ (-[WKDateTimePicker setDateTimePickerToInitialValue]):
+ (-[WKDateTimePicker controlBeginEditing]):
+ (-[WKDateTimePicker controlEndEditing]):
+ (-[WKDateTimePicker calendarType]):
+ (-[WKDateTimePicker hour]):
+ (-[WKDateTimePicker minute]):
+ (-[WKDateTimePicker setHour:minute:]):
+
2021-06-23 Commit Queue <commit-qu...@webkit.org>
Unreviewed, reverting r279104.
Modified: trunk/Source/WebKit/Platform/spi/ios/UIKitSPI.h (279180 => 279181)
--- trunk/Source/WebKit/Platform/spi/ios/UIKitSPI.h 2021-06-23 19:40:45 UTC (rev 279180)
+++ trunk/Source/WebKit/Platform/spi/ios/UIKitSPI.h 2021-06-23 20:02:35 UTC (rev 279181)
@@ -1451,6 +1451,30 @@
@end
#endif
+#if HAVE(UIDATEPICKER_OVERLAY_PRESENTATION)
+
+// FIXME: Import the header directly once bots are updated to a build containing rdar://78779655.
+
+typedef NS_ENUM(NSInteger, _UIDatePickerOverlayAnchor) {
+ _UIDatePickerOverlayAnchorSourceRect = 2
+};
+
+@interface _UIDatePickerOverlayPresentation : NSObject
+
+- (instancetype)initWithSourceView:(UIView *)sourceView;
+- (void)presentDatePicker:(UIDatePicker *)datePicker onDismiss:(void(^)(BOOL retargeted))dismissHandler;
+- (void)dismissPresentationAnimated:(BOOL)animated;
+
+@property (nonatomic, weak, readonly) UIView *sourceView;
+@property (nonatomic, assign) CGRect sourceRect;
+@property (nonatomic, assign) _UIDatePickerOverlayAnchor overlayAnchor;
+@property (nonatomic, strong) UIView *accessoryView;
+@property (nonatomic, assign) BOOL accessoryViewIgnoresDefaultInsets;
+
+@end
+
+#endif
+
WTF_EXTERN_C_BEGIN
BOOL UIKeyboardEnabledInputModesAllowOneToManyShortcuts(void);
Modified: trunk/Source/WebKit/UIProcess/ios/forms/WKDateTimeInputControl.mm (279180 => 279181)
--- trunk/Source/WebKit/UIProcess/ios/forms/WKDateTimeInputControl.mm 2021-06-23 19:40:45 UTC (rev 279180)
+++ trunk/Source/WebKit/UIProcess/ios/forms/WKDateTimeInputControl.mm 2021-06-23 20:02:35 UTC (rev 279181)
@@ -28,6 +28,7 @@
#if PLATFORM(IOS_FAMILY) && !PLATFORM(WATCHOS)
+#import "UIKitSPI.h"
#import "UserInterfaceIdiom.h"
#import "WKContentView.h"
#import "WKContentViewInteraction.h"
@@ -37,19 +38,18 @@
#import <WebCore/LocalizedStrings.h>
#import <algorithm>
#import <wtf/RetainPtr.h>
+#import <wtf/SetForScope.h>
@class WKDateTimePickerViewController;
@protocol WKDateTimePickerViewControllerDelegate <NSObject>
-- (void)dateTimePickerViewControllerDidChangeDate:(WKDateTimePickerViewController *)dateTimePickerViewController;
- (void)dateTimePickerViewControllerDidPressResetButton:(WKDateTimePickerViewController *)dateTimePickerViewController;
- (void)dateTimePickerViewControllerDidPressDoneButton:(WKDateTimePickerViewController *)dateTimePickerViewController;
-
-- (BOOL)shouldForceGregorianCalendar;
@end
@interface WKDateTimePickerViewController : UIViewController
-- (instancetype)initWithDelegate:(id<WKDateTimePickerViewControllerDelegate>)delegate;
+- (instancetype)initWithDatePicker:(UIDatePicker *)datePicker;
+- (void)setDelegate:(id <WKDateTimePickerViewControllerDelegate>)delegate;
@end
@implementation WKDateTimePickerViewController {
@@ -68,23 +68,22 @@
static const CGFloat kDateTimePickerTimeControlWidth = 218;
static const CGFloat kDateTimePickerTimeControlHeight = 172;
-- (instancetype)initWithDelegate:(id <WKDateTimePickerViewControllerDelegate>)delegate
+- (instancetype)initWithDatePicker:(UIDatePicker *)datePicker
{
if (!(self = [super init]))
return nil;
- _delegate = delegate;
-
- _datePicker = adoptNS([[UIDatePicker alloc] init]);
- [_datePicker addTarget:self action:@selector(datePickerChanged:) forControlEvents:UIControlEventValueChanged];
+ _datePicker = datePicker;
[_datePicker setTranslatesAutoresizingMaskIntoConstraints:NO];
- if ([_delegate shouldForceGregorianCalendar])
- [_datePicker setCalendar:[NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]];
-
return self;
}
+- (void)setDelegate:(id <WKDateTimePickerViewControllerDelegate>)delegate
+{
+ _delegate = delegate;
+}
+
- (void)viewDidLoad
{
[super viewDidLoad];
@@ -168,11 +167,6 @@
]];
}
-- (void)datePickerChanged:(id)sender
-{
- [_delegate dateTimePickerViewControllerDidChangeDate:self];
-}
-
- (void)resetButtonPressed:(id)sender
{
[_delegate dateTimePickerViewControllerDidPressResetButton:self];
@@ -225,50 +219,13 @@
return _contentSize;
}
-- (NSDate *)date
-{
- return [_datePicker date];
-}
-
-- (void)setDate:(NSDate *)date
-{
- [_datePicker setDate:date];
-}
-
-- (void)setDatePickerMode:(UIDatePickerMode)mode
-{
- [_datePicker setDatePickerMode:mode];
-
-#if HAVE(UIDATEPICKER_STYLE)
- if (mode == UIDatePickerModeTime || mode == (UIDatePickerMode)UIDatePickerModeYearAndMonth)
- [_datePicker setPreferredDatePickerStyle:UIDatePickerStyleWheels];
- else
- [_datePicker setPreferredDatePickerStyle:UIDatePickerStyleInline];
-#endif
-}
-
-- (NSTimeZone *)timeZone
-{
- return [_datePicker timeZone];
-}
-
-- (void)setTimeZone:(NSTimeZone *)timeZone
-{
- return [_datePicker setTimeZone:timeZone];
-}
-
-- (NSCalendar *)calendar
-{
- return [_datePicker calendar];
-}
-
@end
@interface WKDateTimePicker : NSObject<WKFormControl
-#if USE(UICONTEXTMENU)
+#if !HAVE(UIDATEPICKER_OVERLAY_PRESENTATION) && USE(UICONTEXTMENU)
, UIContextMenuInteractionDelegate
+, WKDateTimePickerViewControllerDelegate
#endif
-, WKDateTimePickerViewControllerDelegate
> {
NSString *_formatString;
RetainPtr<NSString> _initialValue;
@@ -276,10 +233,16 @@
BOOL _shouldRemoveTimeZoneInformation;
WKContentView *_view;
CGPoint _interactionPoint;
-#if USE(UICONTEXTMENU)
+ RetainPtr<UIDatePicker> _datePicker;
+#if HAVE(UIDATEPICKER_OVERLAY_PRESENTATION)
+ BOOL _isDismissingDatePicker;
+
+ RetainPtr<_UIDatePickerOverlayPresentation> _datePickerPresentation;
+ RetainPtr<UIToolbar> _accessoryView;
+#elif USE(UICONTEXTMENU)
RetainPtr<UIContextMenuInteraction> _dateTimeContextMenuInteraction;
+ RetainPtr<WKDateTimePickerViewController> _dateTimePickerViewController;
#endif
- RetainPtr<WKDateTimePickerViewController> _dateTimePickerViewController;
}
- (instancetype)initWithView:(WKContentView *)view datePickerMode:(UIDatePickerMode)mode;
@@ -326,14 +289,71 @@
break;
}
- _dateTimePickerViewController = adoptNS([[WKDateTimePickerViewController alloc] initWithDelegate:self]);
- [_dateTimePickerViewController setDatePickerMode:mode];
+ _datePicker = adoptNS([[UIDatePicker alloc] init]);
+ [_datePicker addTarget:self action:@selector(datePickerChanged:) forControlEvents:UIControlEventValueChanged];
+ if ([self shouldForceGregorianCalendar])
+ [_datePicker setCalendar:[NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]];
+
+ [_datePicker setDatePickerMode:mode];
+
+#if HAVE(UIDATEPICKER_STYLE)
+ if (mode == UIDatePickerModeTime || mode == (UIDatePickerMode)UIDatePickerModeYearAndMonth)
+ [_datePicker setPreferredDatePickerStyle:UIDatePickerStyleWheels];
+ else
+ [_datePicker setPreferredDatePickerStyle:UIDatePickerStyleInline];
+#endif
+
+#if HAVE(UIDATEPICKER_OVERLAY_PRESENTATION)
+ _isDismissingDatePicker = NO;
+
+ _accessoryView = adoptNS([[UIToolbar alloc] init]);
+ [[_accessoryView heightAnchor] constraintEqualToConstant:kDateTimePickerToolbarHeight].active = YES;
+
+#if HAVE(UITOOLBAR_STANDARD_APPEARANCE)
+ auto toolbarAppearance = adoptNS([[UIToolbarAppearance alloc] init]);
+ [toolbarAppearance setBackgroundEffect:nil];
+ [_accessoryView setStandardAppearance:toolbarAppearance.get()];
+#endif
+
+ auto resetButton = adoptNS([[UIBarButtonItem alloc] initWithTitle:WEB_UI_STRING_KEY("Reset", "Reset Button Date/Time Context Menu", "Reset button in date input context menu") style:UIBarButtonItemStylePlain target:self action:@selector(reset:)]);
+ auto doneButton = adoptNS([[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)]);
+
+ [_accessoryView setItems:@[ resetButton.get(), UIBarButtonItem.flexibleSpaceItem, doneButton.get() ]];
+#elif USE(UICONTEXTMENU)
+ _dateTimePickerViewController = adoptNS([[WKDateTimePickerViewController alloc] initWithDatePicker:_datePicker.get()]);
+ [_dateTimePickerViewController setDelegate:self];
+#endif
+
return self;
}
-#if USE(UICONTEXTMENU)
+#if HAVE(UIDATEPICKER_OVERLAY_PRESENTATION)
+- (void)handleDatePickerPresentationDismissal
+{
+ if (_isDismissingDatePicker)
+ return;
+
+ SetForScope<BOOL> isDismissingDatePicker { _isDismissingDatePicker, YES };
+ [_view accessoryDone];
+}
+
+- (void)removeDatePickerPresentation
+{
+ if (_datePickerPresentation) {
+ if (!_isDismissingDatePicker) {
+ SetForScope<BOOL> isDismissingDatePicker { _isDismissingDatePicker, YES };
+ [_datePickerPresentation dismissPresentationAnimated:NO];
+ }
+
+ _datePickerPresentation = nil;
+ [_view.webView _didDismissContextMenu];
+ }
+}
+
+#elif USE(UICONTEXTMENU)
+
- (UIEdgeInsets)_preferredEdgeInsetsForDateTimePicker
{
CGSize pickerSize = [_dateTimePickerViewController preferredContentSize];
@@ -462,30 +482,57 @@
}
}
+- (void)dateTimePickerViewControllerDidPressResetButton:(WKDateTimePickerViewController *)dateTimePickerViewController
+{
+ [self reset:nil];
+}
+
+- (void)dateTimePickerViewControllerDidPressDoneButton:(WKDateTimePickerViewController *)dateTimePickerViewController
+{
+ [self done:nil];
+}
+
+#endif
+
- (void)showDateTimePicker
{
-#if HAVE(UICONTEXTMENU_LOCATION)
+#if HAVE(UIDATEPICKER_OVERLAY_PRESENTATION)
+ _datePickerPresentation = adoptNS([[_UIDatePickerOverlayPresentation alloc] initWithSourceView:_view]);
+ [_datePickerPresentation setSourceRect:_view.focusedElementInformation.interactionRect];
+ [_datePickerPresentation setAccessoryView:_accessoryView.get()];
+ [_datePickerPresentation setAccessoryViewIgnoresDefaultInsets:YES];
+
+ if ([_datePickerPresentation respondsToSelector:@selector(setOverlayAnchor:)])
+ [_datePickerPresentation setOverlayAnchor:_UIDatePickerOverlayAnchorSourceRect];
+
+ [_datePickerPresentation presentDatePicker:_datePicker.get() onDismiss:[weakSelf = WeakObjCPtr<WKDateTimePicker>(self)](BOOL) {
+ if (auto strongSelf = weakSelf.get())
+ [strongSelf handleDatePickerPresentationDismissal];
+ }];
+
+ [_view.webView _didShowContextMenu];
+#elif USE(UICONTEXTMENU) && HAVE(UICONTEXTMENU_LOCATION)
[self ensureContextMenuInteraction];
[_dateTimeContextMenuInteraction _presentMenuAtLocation:_interactionPoint];
#endif
}
-#endif
-
-- (void)dateTimePickerViewControllerDidChangeDate:(WKDateTimePickerViewController *)dateTimePickerViewController
+- (void)datePickerChanged:(id)sender
{
[self _dateChanged];
}
-- (void)dateTimePickerViewControllerDidPressResetButton:(WKDateTimePickerViewController *)dateTimePickerViewController
+- (void)reset:(id)sender
{
[self setDateTimePickerToInitialValue];
[_view page]->setFocusedElementValue(String());
}
-- (void)dateTimePickerViewControllerDidPressDoneButton:(WKDateTimePickerViewController *)dateTimePickerViewController
+- (void)done:(id)sender
{
-#if USE(UICONTEXTMENU)
+#if HAVE(UIDATEPICKER_OVERLAY_PRESENTATION)
+ [_datePickerPresentation dismissPresentationAnimated:YES];
+#elif USE(UICONTEXTMENU)
[_dateTimeContextMenuInteraction dismissMenu];
#endif
}
@@ -500,7 +547,9 @@
- (void)dealloc
{
-#if USE(UICONTEXTMENU)
+#if HAVE(UIDATEPICKER_OVERLAY_PRESENTATION)
+ [self removeDatePickerPresentation];
+#elif USE(UICONTEXTMENU)
[self removeContextMenuInteraction];
#endif
[super dealloc];
@@ -511,7 +560,7 @@
if (!_shouldRemoveTimeZoneInformation)
return 0;
- return [[_dateTimePickerViewController timeZone] secondsFromGMTForDate:date];
+ return [[_datePicker timeZone] secondsFromGMTForDate:date];
}
- (NSString *)_sanitizeInputValueForFormatter:(NSString *)value
@@ -528,7 +577,7 @@
{
RetainPtr<NSLocale> englishLocale = adoptNS([[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]);
RetainPtr<NSDateFormatter> dateFormatter = adoptNS([[NSDateFormatter alloc] init]);
- [dateFormatter setTimeZone:[_dateTimePickerViewController timeZone]];
+ [dateFormatter setTimeZone:[_datePicker timeZone]];
[dateFormatter setDateFormat:_formatString];
[dateFormatter setLocale:englishLocale.get()];
return dateFormatter;
@@ -536,7 +585,7 @@
- (void)_dateChangedSetAsNumber
{
- NSDate *date = [_dateTimePickerViewController date];
+ NSDate *date = [_datePicker date];
[_view updateFocusedElementValueAsNumber:(date.timeIntervalSince1970 + [self _timeZoneOffsetFromGMT:date]) * kMillisecondsPerSecond];
}
@@ -544,7 +593,7 @@
{
// Force English locale because that is what HTML5 value parsing expects.
RetainPtr<NSDateFormatter> dateFormatter = [self dateFormatterForPicker];
- [_view updateFocusedElementValue:[dateFormatter stringFromDate:[_dateTimePickerViewController date]]];
+ [_view updateFocusedElementValue:[dateFormatter stringFromDate:[_datePicker date]]];
}
- (void)_dateChanged
@@ -562,19 +611,19 @@
- (void)setDateTimePickerToInitialValue
{
if ([_initialValue isEqual: @""]) {
- [_dateTimePickerViewController setDate:[NSDate date]];
+ [_datePicker setDate:[NSDate date]];
[self _dateChanged];
} else if (_formatString) {
// Convert the string value to a date object for the fields where we have a format string.
RetainPtr<NSDateFormatter> dateFormatter = [self dateFormatterForPicker];
NSDate *parsedDate = [dateFormatter dateFromString:[self _sanitizeInputValueForFormatter:_initialValue.get()]];
- [_dateTimePickerViewController setDate:parsedDate ? parsedDate : [NSDate date]];
+ [_datePicker setDate:parsedDate ? parsedDate : [NSDate date]];
} else {
// Convert the number value to a date object for the fields affected by timezones.
NSTimeInterval secondsSince1970 = _initialValueAsNumber / kMillisecondsPerSecond;
NSInteger timeZoneOffset = [self _timeZoneOffsetFromGMT:[NSDate dateWithTimeIntervalSince1970:secondsSince1970]];
NSTimeInterval adjustedSecondsSince1970 = secondsSince1970 - timeZoneOffset;
- [_dateTimePickerViewController setDate:[NSDate dateWithTimeIntervalSince1970:adjustedSecondsSince1970]];
+ [_datePicker setDate:[NSDate dateWithTimeIntervalSince1970:adjustedSecondsSince1970]];
}
}
@@ -590,7 +639,7 @@
[_view startRelinquishingFirstResponderToFocusedElement];
// Set the time zone in case it changed.
- [_dateTimePickerViewController setTimeZone:NSTimeZone.localTimeZone];
+ [_datePicker setTimeZone:NSTimeZone.localTimeZone];
// Currently no value for the <input>. Start the picker with the current time.
// Also, update the actual <input> value.
@@ -598,9 +647,7 @@
_initialValueAsNumber = _view.focusedElementInformation.valueAsNumber;
[self setDateTimePickerToInitialValue];
-#if USE(UICONTEXTMENU)
[self showDateTimePicker];
-#endif
}
- (void)controlEndEditing
@@ -607,7 +654,9 @@
{
[_view stopRelinquishingFirstResponderToFocusedElement];
-#if USE(UICONTEXTMENU)
+#if HAVE(UIDATEPICKER_OVERLAY_PRESENTATION)
+ [self removeDatePickerPresentation];
+#elif USE(UICONTEXTMENU)
[self removeContextMenuInteraction];
#endif
}
@@ -614,13 +663,13 @@
- (NSString *)calendarType
{
- return [_dateTimePickerViewController calendar].calendarIdentifier;
+ return [_datePicker calendar].calendarIdentifier;
}
- (double)hour
{
NSCalendar *calendar = [NSCalendar currentCalendar];
- NSDateComponents *components = [calendar components:NSCalendarUnitHour fromDate:[_dateTimePickerViewController date]];
+ NSDateComponents *components = [calendar components:NSCalendarUnitHour fromDate:[_datePicker date]];
return components.hour;
}
@@ -628,7 +677,7 @@
- (double)minute
{
NSCalendar *calendar = [NSCalendar currentCalendar];
- NSDateComponents *components = [calendar components:NSCalendarUnitMinute fromDate:[_dateTimePickerViewController date]];
+ NSDateComponents *components = [calendar components:NSCalendarUnitMinute fromDate:[_datePicker date]];
return components.minute;
}
@@ -636,7 +685,7 @@
- (void)setHour:(NSInteger)hour minute:(NSInteger)minute
{
NSString *timeString = [NSString stringWithFormat:@"%.2ld:%.2ld", (long)hour, (long)minute];
- [_dateTimePickerViewController setDate:[[self dateFormatterForPicker] dateFromString:timeString]];
+ [_datePicker setDate:[[self dateFormatterForPicker] dateFromString:timeString]];
[self _dateChanged];
}