Title: [279181] trunk
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];
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to