Changeset 266063 in webkit


Ignore:
Timestamp:
Aug 24, 2020 9:25:10 AM (4 years ago)
Author:
Aditya Keerthi
Message:

[macOS] Show picker for date and datetime-local input types
https://bugs.webkit.org/show_bug.cgi?id=214946

Reviewed by Darin Adler and Wenson Hsieh.

Source/WebCore:

Date and datetime-local input types require a calendar picker to be presented when activated.
Consequently, BaseChooserOnlyDateAndTimeInputType::handleDOMActivateEvent was modified to
create a DateTimeChooser and display a calendar upon activation. This object is destroyed
when the element is blurred, hiding the calendar.

There is currently no picker UI for month, week, and time input types. As a result,
handleDOMActivateEvent is a no-op on those input types.

Wrote an encoder and decoder for DateTimeChooserParameters, so that the picker can be
created with the correct values.

Tests: fast/forms/date/date-show-hide-picker.html

fast/forms/datetimelocal/datetimelocal-show-hide-picker.html

  • WebCore.xcodeproj/project.pbxproj:
  • html/BaseChooserOnlyDateAndTimeInputType.cpp:

(WebCore::BaseChooserOnlyDateAndTimeInputType::handleDOMActivateEvent):
(WebCore::BaseChooserOnlyDateAndTimeInputType::elementDidBlur):
(WebCore::BaseChooserOnlyDateAndTimeInputType::isPresentingAttachedView const):
(WebCore::BaseChooserOnlyDateAndTimeInputType::didChooseValue):

  • html/BaseChooserOnlyDateAndTimeInputType.h:
  • html/HTMLInputElement.cpp:
  • html/MonthInputType.cpp:

(WebCore::MonthInputType::handleDOMActivateEvent):

  • html/MonthInputType.h:
  • html/TimeInputType.cpp:

(WebCore::TimeInputType::handleDOMActivateEvent):

  • html/TimeInputType.h:
  • html/WeekInputType.cpp:

(WebCore::WeekInputType::handleDOMActivateEvent):

  • html/WeekInputType.h:
  • loader/EmptyClients.cpp:

(WebCore::EmptyChromeClient::createDateTimeChooser):

  • loader/EmptyClients.h:
  • page/Chrome.cpp:

(WebCore::Chrome::createDateTimeChooser):

  • page/Chrome.h:
  • page/ChromeClient.h:
  • platform/DateTimeChooser.h:
  • platform/DateTimeChooserClient.h:
  • platform/DateTimeChooserParameters.h: Added.

(WebCore::DateTimeChooserParameters::encode const):
(WebCore::DateTimeChooserParameters::decode):

Source/WebKit:

Created WKDateTimePicker as a wrapper around NSDatePicker. The picker is
displayed in its own NSWindow, ensuring the view is always above the page.
WebPageProxy and WKDateTimePicker communicate through WebDateTimePickerMac,
in order for the picker to be initialized with the correct initial, minimum,
and maximum date, and so that the chosen date can be sent back to the
WebProcess.

Added IPC messages to enable communication between the UIProcess and the
WebProcess necessary for showing and hiding the picker.

  • Sources.txt:
  • SourcesCocoa.txt:
  • UIProcess/PageClient.h:
  • UIProcess/WebDateTimePicker.cpp: Added.

(WebKit::WebDateTimePicker::WebDateTimePicker):
(WebKit::WebDateTimePicker::~WebDateTimePicker):
(WebKit::WebDateTimePicker::endPicker):

  • UIProcess/WebDateTimePicker.h: Added.
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::showDateTimePicker):
(WebKit::WebPageProxy::endDateTimePicker):
(WebKit::WebPageProxy::didChooseDate):
(WebKit::WebPageProxy::didEndDateTimePicker):
(WebKit::WebPageProxy::closeOverlayedViews):

  • UIProcess/WebPageProxy.h:
  • UIProcess/WebPageProxy.messages.in:
  • UIProcess/ios/PageClientImplIOS.h:
  • UIProcess/ios/PageClientImplIOS.mm:

(WebKit::PageClientImpl::createDateTimePicker):

  • UIProcess/mac/PageClientImplMac.h:
  • UIProcess/mac/PageClientImplMac.mm:

(WebKit::PageClientImpl::createDateTimePicker):

  • UIProcess/mac/WebDateTimePickerMac.h: Added.
  • UIProcess/mac/WebDateTimePickerMac.mm: Added.

(WebKit::WebDateTimePickerMac::create):
(WebKit::WebDateTimePickerMac::~WebDateTimePickerMac):
(WebKit::WebDateTimePickerMac::WebDateTimePickerMac):
(WebKit::WebDateTimePickerMac::endPicker):
(WebKit::WebDateTimePickerMac::showDateTimePicker):
(WebKit::WebDateTimePickerMac::didChooseDate):
(-[WKDateTimePickerWindow initWithContentRect:styleMask:backing:defer:]):
(-[WKDateTimePickerWindow canBecomeKeyWindow]):
(-[WKDateTimePickerWindow hasKeyAppearance]):
(-[WKDateTimePickerWindow shadowOptions]):
(-[WKDateTimePicker initWithParams:inView:]):
(-[WKDateTimePicker showPicker:]):
(-[WKDateTimePicker invalidate]):
(-[WKDateTimePicker didChooseDate:]):
(-[WKDateTimePicker dateFormatStringForType:]):

  • WebKit.xcodeproj/project.pbxproj:
  • WebProcess/WebCoreSupport/WebChromeClient.cpp:

(WebKit::WebChromeClient::createDateTimeChooser):

  • WebProcess/WebCoreSupport/WebChromeClient.h:
  • WebProcess/WebCoreSupport/WebDateTimeChooser.cpp: Added.

(WebKit::WebDateTimeChooser::WebDateTimeChooser):
(WebKit::WebDateTimeChooser::didChooseDate):
(WebKit::WebDateTimeChooser::didEndChooser):
(WebKit::WebDateTimeChooser::endChooser):
(WebKit::WebDateTimeChooser::showChooser):

  • WebProcess/WebCoreSupport/WebDateTimeChooser.h: Added.
  • WebProcess/WebPage/WebPage.cpp:

(WebKit::WebPage::setActiveDateTimeChooser):
(WebKit::WebPage::didChooseDate):
(WebKit::WebPage::didEndDateTimePicker):

  • WebProcess/WebPage/WebPage.h:
  • WebProcess/WebPage/WebPage.messages.in:

Source/WebKitLegacy/mac:

  • WebCoreSupport/WebChromeClient.h:
  • WebCoreSupport/WebChromeClient.mm:

(WebChromeClient::createDateTimeChooser):

Tools:

Added isShowingDateTimePicker testing hook in order to enable testing of the visibility of
the picker.

  • TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl:
  • TestRunnerShared/UIScriptContext/UIScriptController.h:

(WTR::UIScriptController::isShowingDateTimePicker const):

  • WebKitTestRunner/mac/UIScriptControllerMac.h:
  • WebKitTestRunner/mac/UIScriptControllerMac.mm:

(WTR::UIScriptControllerMac::isShowingDateTimePicker const):

LayoutTests:

Added tests to verify that the picker is correctly shown and hidden for date and
datetime-local input types.

  • fast/forms/date/date-show-hide-picker-expected.txt: Added.
  • fast/forms/date/date-show-hide-picker.html: Added.
  • fast/forms/datetimelocal/datetimelocal-show-hide-picker-expected.txt: Added.
  • fast/forms/datetimelocal/datetimelocal-show-hide-picker.html: Added.
  • platform/ios/TestExpectations:
  • resources/ui-helper.js:

(window.UIHelper.isShowingDateTimePicker):

Location:
trunk
Files:
11 added
46 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r266060 r266063  
     12020-08-24  Aditya Keerthi  <akeerthi@apple.com>
     2
     3        [macOS] Show picker for date and datetime-local input types
     4        https://bugs.webkit.org/show_bug.cgi?id=214946
     5
     6        Reviewed by Darin Adler and Wenson Hsieh.
     7
     8        Added tests to verify that the picker is correctly shown and hidden for date and
     9        datetime-local input types.
     10
     11        * fast/forms/date/date-show-hide-picker-expected.txt: Added.
     12        * fast/forms/date/date-show-hide-picker.html: Added.
     13        * fast/forms/datetimelocal/datetimelocal-show-hide-picker-expected.txt: Added.
     14        * fast/forms/datetimelocal/datetimelocal-show-hide-picker.html: Added.
     15        * platform/ios/TestExpectations:
     16        * resources/ui-helper.js:
     17        (window.UIHelper.isShowingDateTimePicker):
     18
    1192020-08-24  Hector Lopez  <hector_i_lopez@apple.com>
    220
  • trunk/LayoutTests/platform/ios/TestExpectations

    r265680 r266063  
    34733473fast/text/selection-is-prevent-defaulted.html [ Failure ]
    34743474
     3475# FIXME: These tests require UIScriptControllerIOS additions to know when a date/time picker is presented
     3476fast/forms/date/date-show-hide-picker.html [ Skip ]
     3477fast/forms/datetimelocal/datetimelocal-show-hide-picker.html [ Skip ]
     3478
    34753479# <rdar://problem/59636115> REGRESSION: [ iOS & macOS ] two imported/w3c/web-platform-tests/WebCryptoAPI are failing
    34763480imported/w3c/web-platform-tests/WebCryptoAPI/import_export/rsa_importKey.https.worker.html [ Failure ]
  • trunk/LayoutTests/resources/ui-helper.js

    r266051 r266063  
    844844            testRunner.runUIScript(`(() => {
    845845                uiController.uiScriptComplete(uiController.isShowingDataListSuggestions);
     846            })()`, result => resolve(result === "true"));
     847        });
     848    }
     849
     850    static isShowingDateTimePicker()
     851    {
     852        return new Promise(resolve => {
     853            testRunner.runUIScript(`(() => {
     854                uiController.uiScriptComplete(uiController.isShowingDateTimePicker);
    846855            })()`, result => resolve(result === "true"));
    847856        });
  • trunk/Source/WebCore/ChangeLog

    r266062 r266063  
     12020-08-24  Aditya Keerthi  <akeerthi@apple.com>
     2
     3        [macOS] Show picker for date and datetime-local input types
     4        https://bugs.webkit.org/show_bug.cgi?id=214946
     5
     6        Reviewed by Darin Adler and Wenson Hsieh.
     7
     8        Date and datetime-local input types require a calendar picker to be presented when activated.
     9        Consequently, BaseChooserOnlyDateAndTimeInputType::handleDOMActivateEvent was modified to
     10        create a DateTimeChooser and display a calendar upon activation. This object is destroyed
     11        when the element is blurred, hiding the calendar.
     12
     13        There is currently no picker UI for month, week, and time input types. As a result,
     14        handleDOMActivateEvent is a no-op on those input types.
     15
     16        Wrote an encoder and decoder for DateTimeChooserParameters, so that the picker can be
     17        created with the correct values.
     18
     19        Tests: fast/forms/date/date-show-hide-picker.html
     20               fast/forms/datetimelocal/datetimelocal-show-hide-picker.html
     21
     22        * WebCore.xcodeproj/project.pbxproj:
     23        * html/BaseChooserOnlyDateAndTimeInputType.cpp:
     24        (WebCore::BaseChooserOnlyDateAndTimeInputType::handleDOMActivateEvent):
     25        (WebCore::BaseChooserOnlyDateAndTimeInputType::elementDidBlur):
     26        (WebCore::BaseChooserOnlyDateAndTimeInputType::isPresentingAttachedView const):
     27        (WebCore::BaseChooserOnlyDateAndTimeInputType::didChooseValue):
     28        * html/BaseChooserOnlyDateAndTimeInputType.h:
     29        * html/HTMLInputElement.cpp:
     30        * html/MonthInputType.cpp:
     31        (WebCore::MonthInputType::handleDOMActivateEvent):
     32        * html/MonthInputType.h:
     33        * html/TimeInputType.cpp:
     34        (WebCore::TimeInputType::handleDOMActivateEvent):
     35        * html/TimeInputType.h:
     36        * html/WeekInputType.cpp:
     37        (WebCore::WeekInputType::handleDOMActivateEvent):
     38        * html/WeekInputType.h:
     39        * loader/EmptyClients.cpp:
     40        (WebCore::EmptyChromeClient::createDateTimeChooser):
     41        * loader/EmptyClients.h:
     42        * page/Chrome.cpp:
     43        (WebCore::Chrome::createDateTimeChooser):
     44        * page/Chrome.h:
     45        * page/ChromeClient.h:
     46        * platform/DateTimeChooser.h:
     47        * platform/DateTimeChooserClient.h:
     48        * platform/DateTimeChooserParameters.h: Added.
     49        (WebCore::DateTimeChooserParameters::encode const):
     50        (WebCore::DateTimeChooserParameters::decode):
     51
    1522020-08-24  Zalan Bujtas  <zalan@apple.com>
    253
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r266040 r266063  
    10011001                37C738ED1EDBD5BC003F2B0B /* SVGUnknownElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 37C738EC1EDBD5B7003F2B0B /* SVGUnknownElement.h */; };
    10021002                37C738EF1EDBD71B003F2B0B /* MathMLUnknownElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 37C738EE1EDBD718003F2B0B /* MathMLUnknownElement.h */; };
    1003                 37C738F31EDBDE8A003F2B0B /* DateTimeChooser.h in Headers */ = {isa = PBXBuildFile; fileRef = 37C738F11EDBDE87003F2B0B /* DateTimeChooser.h */; };
    1004                 37C738F41EDBDE8D003F2B0B /* DateTimeChooserClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 37C738F21EDBDE87003F2B0B /* DateTimeChooserClient.h */; };
     1003                37C738F31EDBDE8A003F2B0B /* DateTimeChooser.h in Headers */ = {isa = PBXBuildFile; fileRef = 37C738F11EDBDE87003F2B0B /* DateTimeChooser.h */; settings = {ATTRIBUTES = (Private, ); }; };
     1004                37C738F41EDBDE8D003F2B0B /* DateTimeChooserClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 37C738F21EDBDE87003F2B0B /* DateTimeChooserClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
    10051005                37D456FD1A9A50D8003330A1 /* LocalizableStrings.pm in Copy Scripts */ = {isa = PBXBuildFile; fileRef = 37D456FB1A9A50B6003330A1 /* LocalizableStrings.pm */; };
    10061006                37E3524D12450C6600BAF5D9 /* InputType.h in Headers */ = {isa = PBXBuildFile; fileRef = 37E3524C12450C6600BAF5D9 /* InputType.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    50815081                E59DD4B821098287003C8B47 /* ListButtonArrow.png in Resources */ = {isa = PBXBuildFile; fileRef = E59DD4B721098285003C8B47 /* ListButtonArrow.png */; };
    50825082                E5BA7D63151437CA00FE1E3F /* LengthFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = E5BA7D62151437CA00FE1E3F /* LengthFunctions.h */; settings = {ATTRIBUTES = (Private, ); }; };
     5083                E5C59A9A24D0E1AA003B86E1 /* DateTimeChooserParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = E5C59A9924D0E1AA003B86E1 /* DateTimeChooserParameters.h */; settings = {ATTRIBUTES = (Private, ); }; };
    50835084                E71467B324ABAEF200FB2F50 /* AudioNodeOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = E71467B124ABAEF100FB2F50 /* AudioNodeOptions.h */; };
    50845085                E71467B624ABAF1D00FB2F50 /* PannerOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = E71467B524ABAF1D00FB2F50 /* PannerOptions.h */; };
     
    1592515926                E59DD4B721098285003C8B47 /* ListButtonArrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ListButtonArrow.png; sourceTree = "<group>"; };
    1592615927                E5BA7D62151437CA00FE1E3F /* LengthFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LengthFunctions.h; sourceTree = "<group>"; };
     15928                E5C59A9924D0E1AA003B86E1 /* DateTimeChooserParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DateTimeChooserParameters.h; sourceTree = "<group>"; };
    1592715929                E71467B124ABAEF100FB2F50 /* AudioNodeOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioNodeOptions.h; sourceTree = "<group>"; };
    1592815930                E71467B424ABAF0B00FB2F50 /* AudioNodeOptions.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = AudioNodeOptions.idl; sourceTree = "<group>"; };
     
    2669126693                                37C738F11EDBDE87003F2B0B /* DateTimeChooser.h */,
    2669226694                                37C738F21EDBDE87003F2B0B /* DateTimeChooserClient.h */,
     26695                                E5C59A9924D0E1AA003B86E1 /* DateTimeChooserParameters.h */,
    2669326696                                45FEA5CD156DDE8C00654101 /* Decimal.cpp */,
    2669426697                                45FEA5CE156DDE8C00654101 /* Decimal.h */,
     
    3075030753                                37C738F31EDBDE8A003F2B0B /* DateTimeChooser.h in Headers */,
    3075130754                                37C738F41EDBDE8D003F2B0B /* DateTimeChooserClient.h in Headers */,
     30755                                E5C59A9A24D0E1AA003B86E1 /* DateTimeChooserParameters.h in Headers */,
    3075230756                                453EB637159C570400001BB7 /* DateTimeFormat.h in Headers */,
    3075330757                                F55B3DBA1251F12D003EF269 /* DateTimeLocalInputType.h in Headers */,
  • trunk/Source/WebCore/html/BaseChooserOnlyDateAndTimeInputType.cpp

    r261013 r266063  
    3030#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
    3131
     32#include "Chrome.h"
     33#include "DateTimeChooserParameters.h"
    3234#include "HTMLDivElement.h"
    3335#include "HTMLInputElement.h"
     
    5860    if (!element()->setupDateTimeChooserParameters(parameters))
    5961        return;
     62
     63    if (auto chrome = this->chrome()) {
     64        m_dateTimeChooser = chrome->createDateTimeChooser(*this);
     65        if (m_dateTimeChooser)
     66            m_dateTimeChooser->showChooser(parameters);
     67    }
     68}
     69
     70void BaseChooserOnlyDateAndTimeInputType::elementDidBlur()
     71{
     72    closeDateTimeChooser();
     73}
     74
     75bool BaseChooserOnlyDateAndTimeInputType::isPresentingAttachedView() const
     76{
     77    return !!m_dateTimeChooser;
    6078}
    6179
     
    97115}
    98116
    99 void BaseChooserOnlyDateAndTimeInputType::didChooseValue(const String& value)
     117void BaseChooserOnlyDateAndTimeInputType::didChooseValue(StringView value)
    100118{
    101119    ASSERT(element());
    102     element()->setValue(value, DispatchInputAndChangeEvent);
     120    element()->setValue(value.toString(), DispatchInputAndChangeEvent);
    103121}
    104122
  • trunk/Source/WebCore/html/BaseChooserOnlyDateAndTimeInputType.h

    r259687 r266063  
    5050    void setValue(const String&, bool valueChanged, TextFieldEventBehavior) override;
    5151    void handleDOMActivateEvent(Event&) override;
     52    void elementDidBlur() final;
    5253    ShouldCallBaseEventHandler handleKeydownEvent(KeyboardEvent&) override;
    5354    void handleKeypressEvent(KeyboardEvent&) override;
     
    5556    bool accessKeyAction(bool sendMouseEvents) override;
    5657    bool isMouseFocusable() const override;
     58    bool isPresentingAttachedView() const final;
    5759    void attributeChanged(const QualifiedName&) override;
    5860
    5961    // DateTimeChooserClient functions:
    60     void didChooseValue(const String&) final;
     62    void didChooseValue(StringView) final;
    6163    void didEndChooser() final;
    6264
    63     RefPtr<DateTimeChooser> m_dateTimeChooser;
     65    std::unique_ptr<DateTimeChooser> m_dateTimeChooser;
    6466};
    6567
  • trunk/Source/WebCore/html/HTMLInputElement.cpp

    r264600 r266063  
    3838#include "ChromeClient.h"
    3939#include "DateTimeChooser.h"
     40#include "DateTimeChooserParameters.h"
    4041#include "Document.h"
    4142#include "Editor.h"
  • trunk/Source/WebCore/html/MonthInputType.cpp

    r264600 r266063  
    130130}
    131131
     132void MonthInputType::handleDOMActivateEvent(Event&)
     133{
     134}
     135
    132136} // namespace WebCore
    133137
  • trunk/Source/WebCore/html/MonthInputType.h

    r263900 r266063  
    5252    Optional<DateComponents> setMillisecondToDateComponents(double) const override;
    5353    bool isMonthField() const override;
     54    void handleDOMActivateEvent(Event&) override;
    5455};
    5556
  • trunk/Source/WebCore/html/TimeInputType.cpp

    r264600 r266063  
    105105}
    106106
     107void TimeInputType::handleDOMActivateEvent(Event&)
     108{
     109}
     110
    107111} // namespace WebCore
    108112
  • trunk/Source/WebCore/html/TimeInputType.h

    r263900 r266063  
    4949    Optional<DateComponents> setMillisecondToDateComponents(double) const override;
    5050    bool isTimeField() const override;
     51    void handleDOMActivateEvent(Event&) override;
    5152};
    5253
  • trunk/Source/WebCore/html/WeekInputType.cpp

    r264600 r266063  
    8383}
    8484
     85void WeekInputType::handleDOMActivateEvent(Event&)
     86{
     87}
     88
    8589} // namespace WebCore
    8690
  • trunk/Source/WebCore/html/WeekInputType.h

    r263900 r266063  
    4848    Optional<DateComponents> setMillisecondToDateComponents(double) const override;
    4949    bool isWeekField() const override;
     50    void handleDOMActivateEvent(Event&) override;
    5051};
    5152
  • trunk/Source/WebCore/loader/EmptyClients.cpp

    r265335 r266063  
    492492#endif
    493493
     494#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     495
     496std::unique_ptr<DateTimeChooser> EmptyChromeClient::createDateTimeChooser(DateTimeChooserClient&)
     497{
     498    return nullptr;
     499}
     500
     501#endif
     502
    494503void EmptyChromeClient::runOpenPanel(Frame&, FileChooser&)
    495504{
  • trunk/Source/WebCore/loader/EmptyClients.h

    r261457 r266063  
    137137#endif
    138138
     139#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     140    std::unique_ptr<DateTimeChooser> createDateTimeChooser(DateTimeChooserClient&) final;
     141#endif
     142
    139143    void runOpenPanel(Frame&, FileChooser&) final;
    140144    void showShareSheet(ShareDataWithParsedURL&, CompletionHandler<void(bool)>&&) final;
  • trunk/Source/WebCore/page/Chrome.cpp

    r261948 r266063  
    6262#endif
    6363
     64#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     65#include "DateTimeChooser.h"
     66#endif
     67
    6468#if PLATFORM(MAC) && ENABLE(GRAPHICS_CONTEXT_GL)
    6569#include "GraphicsContextGLOpenGLManager.h"
     
    443447#endif
    444448
     449#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     450
     451std::unique_ptr<DateTimeChooser> Chrome::createDateTimeChooser(DateTimeChooserClient& client)
     452{
     453#if PLATFORM(IOS_FAMILY)
     454    UNUSED_PARAM(client);
     455    return nullptr;
     456#else
     457    notifyPopupOpeningObservers();
     458    return m_client.createDateTimeChooser(client);
     459#endif
     460}
     461
     462#endif
     463
    445464void Chrome::runOpenPanel(Frame& frame, FileChooser& fileChooser)
    446465{
  • trunk/Source/WebCore/page/Chrome.h

    r261948 r266063  
    158158#endif
    159159
     160#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     161    std::unique_ptr<DateTimeChooser> createDateTimeChooser(DateTimeChooserClient&);
     162#endif
     163
    160164    void runOpenPanel(Frame&, FileChooser&);
    161165    void showShareSheet(ShareDataWithParsedURL&, CompletionHandler<void(bool)>&&);
  • trunk/Source/WebCore/page/ChromeClient.h

    r265562 r266063  
    290290#endif
    291291
     292#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     293    virtual std::unique_ptr<DateTimeChooser> createDateTimeChooser(DateTimeChooserClient&) = 0;
     294#endif
     295
    292296    virtual void runOpenPanel(Frame&, FileChooser&) = 0;
    293297    virtual void showShareSheet(ShareDataWithParsedURL&, WTF::CompletionHandler<void(bool)>&& callback) { callback(false); }
  • trunk/Source/WebCore/platform/DateTimeChooser.h

    r246490 r266063  
    2929 */
    3030
    31 #ifndef DateTimeChooser_h
    32 #define DateTimeChooser_h
     31#pragma once
    3332
    3433#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
    35 #include "IntRect.h"
    36 #include <wtf/RefCounted.h>
    37 #include <wtf/text/WTFString.h>
     34#include <wtf/WeakPtr.h>
    3835
    3936namespace WebCore {
    4037
    41 struct DateTimeChooserParameters {
    42     AtomString type;
    43     IntRect anchorRectInRootView;
    44     // Locale name for which the chooser should be localized. This
    45     // might be an invalid name because it comes from HTML lang
    46     // attributes.
    47     AtomString locale;
    48     String currentValue;
    49     Vector<String> suggestionValues;
    50     Vector<String> localizedSuggestionValues;
    51     Vector<String> suggestionLabels;
    52     double minimum;
    53     double maximum;
    54     double step;
    55     double stepBase;
    56     bool required;
    57     bool isAnchorElementRTL;
    58 };
     38struct DateTimeChooserParameters;
    5939
    60 // For pickers like color pickers and date pickers.
    61 class DateTimeChooser : public RefCounted<DateTimeChooser> {
     40class DateTimeChooser : public CanMakeWeakPtr<DateTimeChooser> {
     41    WTF_MAKE_FAST_ALLOCATED;
    6242public:
    6343    virtual ~DateTimeChooser() = default;
    6444
    6545    virtual void endChooser() = 0;
     46    virtual void showChooser(const DateTimeChooserParameters&) = 0;
    6647};
    6748
    6849} // namespace WebCore
    6950#endif
    70 #endif // DateTimeChooser_h
  • trunk/Source/WebCore/platform/DateTimeChooserClient.h

    r223728 r266063  
    2929 */
    3030
    31 #ifndef DateTimeChooserClient_h
    32 #define DateTimeChooserClient_h
     31#pragma once
    3332
    3433#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     34
    3535namespace WebCore {
    3636
     
    4040
    4141    // Called when user picked a value.
    42     virtual void didChooseValue(const String&) = 0;
     42    virtual void didChooseValue(StringView) = 0;
    4343    // Called when chooser has ended.
    4444    virtual void didEndChooser() = 0;
     
    4646
    4747} // namespace WebCore
    48 #endif
    49 #endif // DateTimeChooserClient_h
     48
     49#endif // ENABLE(DATE_AND_TIME_INPUT_TYPES)
  • trunk/Source/WebKit/ChangeLog

    r266061 r266063  
     12020-08-24  Aditya Keerthi  <akeerthi@apple.com>
     2
     3        [macOS] Show picker for date and datetime-local input types
     4        https://bugs.webkit.org/show_bug.cgi?id=214946
     5
     6        Reviewed by Darin Adler and Wenson Hsieh.
     7
     8        Created WKDateTimePicker as a wrapper around NSDatePicker. The picker is
     9        displayed in its own NSWindow, ensuring the view is always above the page.
     10        WebPageProxy and WKDateTimePicker communicate through WebDateTimePickerMac,
     11        in order for the picker to be initialized with the correct initial, minimum,
     12        and maximum date, and so that the chosen date can be sent back to the
     13        WebProcess.
     14
     15        Added IPC messages to enable communication between the UIProcess and the
     16        WebProcess necessary for showing and hiding the picker.
     17
     18        * Sources.txt:
     19        * SourcesCocoa.txt:
     20        * UIProcess/PageClient.h:
     21        * UIProcess/WebDateTimePicker.cpp: Added.
     22        (WebKit::WebDateTimePicker::WebDateTimePicker):
     23        (WebKit::WebDateTimePicker::~WebDateTimePicker):
     24        (WebKit::WebDateTimePicker::endPicker):
     25        * UIProcess/WebDateTimePicker.h: Added.
     26        * UIProcess/WebPageProxy.cpp:
     27        (WebKit::WebPageProxy::showDateTimePicker):
     28        (WebKit::WebPageProxy::endDateTimePicker):
     29        (WebKit::WebPageProxy::didChooseDate):
     30        (WebKit::WebPageProxy::didEndDateTimePicker):
     31        (WebKit::WebPageProxy::closeOverlayedViews):
     32        * UIProcess/WebPageProxy.h:
     33        * UIProcess/WebPageProxy.messages.in:
     34        * UIProcess/ios/PageClientImplIOS.h:
     35        * UIProcess/ios/PageClientImplIOS.mm:
     36        (WebKit::PageClientImpl::createDateTimePicker):
     37        * UIProcess/mac/PageClientImplMac.h:
     38        * UIProcess/mac/PageClientImplMac.mm:
     39        (WebKit::PageClientImpl::createDateTimePicker):
     40        * UIProcess/mac/WebDateTimePickerMac.h: Added.
     41        * UIProcess/mac/WebDateTimePickerMac.mm: Added.
     42        (WebKit::WebDateTimePickerMac::create):
     43        (WebKit::WebDateTimePickerMac::~WebDateTimePickerMac):
     44        (WebKit::WebDateTimePickerMac::WebDateTimePickerMac):
     45        (WebKit::WebDateTimePickerMac::endPicker):
     46        (WebKit::WebDateTimePickerMac::showDateTimePicker):
     47        (WebKit::WebDateTimePickerMac::didChooseDate):
     48        (-[WKDateTimePickerWindow initWithContentRect:styleMask:backing:defer:]):
     49        (-[WKDateTimePickerWindow canBecomeKeyWindow]):
     50        (-[WKDateTimePickerWindow hasKeyAppearance]):
     51        (-[WKDateTimePickerWindow shadowOptions]):
     52        (-[WKDateTimePicker initWithParams:inView:]):
     53        (-[WKDateTimePicker showPicker:]):
     54        (-[WKDateTimePicker invalidate]):
     55        (-[WKDateTimePicker didChooseDate:]):
     56        (-[WKDateTimePicker dateFormatStringForType:]):
     57        * WebKit.xcodeproj/project.pbxproj:
     58        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
     59        (WebKit::WebChromeClient::createDateTimeChooser):
     60        * WebProcess/WebCoreSupport/WebChromeClient.h:
     61        * WebProcess/WebCoreSupport/WebDateTimeChooser.cpp: Added.
     62        (WebKit::WebDateTimeChooser::WebDateTimeChooser):
     63        (WebKit::WebDateTimeChooser::didChooseDate):
     64        (WebKit::WebDateTimeChooser::didEndChooser):
     65        (WebKit::WebDateTimeChooser::endChooser):
     66        (WebKit::WebDateTimeChooser::showChooser):
     67        * WebProcess/WebCoreSupport/WebDateTimeChooser.h: Added.
     68        * WebProcess/WebPage/WebPage.cpp:
     69        (WebKit::WebPage::setActiveDateTimeChooser):
     70        (WebKit::WebPage::didChooseDate):
     71        (WebKit::WebPage::didEndDateTimePicker):
     72        * WebProcess/WebPage/WebPage.h:
     73        * WebProcess/WebPage/WebPage.messages.in:
     74
    1752020-08-24  Adrian Perez de Castro  <aperez@igalia.com>
    276
  • trunk/Source/WebKit/Sources.txt

    r266003 r266063  
    308308UIProcess/WebCookieManagerProxyClient.cpp
    309309UIProcess/WebDataListSuggestionsDropdown.cpp
     310UIProcess/WebDateTimePicker.cpp
    310311UIProcess/WebEditCommandProxy.cpp
    311312UIProcess/WebFormClient.cpp
     
    633634WebProcess/WebCoreSupport/WebContextMenuClient.cpp
    634635WebProcess/WebCoreSupport/WebDataListSuggestionPicker.cpp
     636WebProcess/WebCoreSupport/WebDateTimeChooser.cpp
    635637WebProcess/WebCoreSupport/WebDiagnosticLoggingClient.cpp
    636638WebProcess/WebCoreSupport/WebDragClient.cpp
  • trunk/Source/WebKit/SourcesCocoa.txt

    r265422 r266063  
    496496UIProcess/mac/WebCookieManagerProxyMac.mm
    497497UIProcess/mac/WebDataListSuggestionsDropdownMac.mm
     498UIProcess/mac/WebDateTimePickerMac.mm
    498499UIProcess/mac/WebPageProxyMac.mm
    499500UIProcess/mac/WebPopupMenuProxyMac.mm
  • trunk/Source/WebKit/UIProcess/PageClient.h

    r265882 r266063  
    3131#include "WebColorPicker.h"
    3232#include "WebDataListSuggestionsDropdown.h"
     33#include "WebDateTimePicker.h"
    3334#include "WebPopupMenuProxy.h"
    3435#include <WebCore/ActivityState.h>
     
    159160#endif
    160161
     162#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     163class WebDateTimePicker;
     164#endif
     165
    161166#if ENABLE(FULLSCREEN_API)
    162167class WebFullScreenManagerProxyClient;
     
    337342#if ENABLE(DATALIST_ELEMENT)
    338343    virtual RefPtr<WebDataListSuggestionsDropdown> createDataListSuggestionsDropdown(WebPageProxy&) = 0;
     344#endif
     345
     346#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     347    virtual RefPtr<WebDateTimePicker> createDateTimePicker(WebPageProxy&) = 0;
    339348#endif
    340349
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r266003 r266063  
    295295#endif
    296296
     297#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     298#include "WebDateTimePicker.h"
     299#endif
     300
    297301// This controls what strategy we use for mouse wheel coalescing.
    298302#define MERGE_WHEEL_EVENTS 1
     
    61726176
    61736177    send(Messages::WebPage::DidSelectDataListOption(selectedOption));
     6178}
     6179
     6180#endif
     6181
     6182#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     6183
     6184void WebPageProxy::showDateTimePicker(WebCore::DateTimeChooserParameters&& params)
     6185{
     6186    if (!m_dateTimePicker)
     6187        m_dateTimePicker = pageClient().createDateTimePicker(*this);
     6188
     6189    m_dateTimePicker->showDateTimePicker(WTFMove(params));
     6190}
     6191
     6192void WebPageProxy::endDateTimePicker()
     6193{
     6194    if (!m_dateTimePicker)
     6195        return;
     6196
     6197    m_dateTimePicker->endPicker();
     6198}
     6199
     6200void WebPageProxy::didChooseDate(StringView date)
     6201{
     6202    if (!hasRunningProcess())
     6203        return;
     6204
     6205    send(Messages::WebPage::DidChooseDate(date.toString()));
     6206}
     6207
     6208void WebPageProxy::didEndDateTimePicker()
     6209{
     6210    m_dateTimePicker = nullptr;
     6211    if (!hasRunningProcess())
     6212        return;
     6213
     6214    send(Messages::WebPage::DidEndDateTimePicker());
    61746215}
    61756216
     
    93629403    endColorPicker();
    93639404#endif
     9405
     9406#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     9407    endDateTimePicker();
     9408#endif
    93649409}
    93659410
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r266003 r266063  
    251251struct ContentRuleListResults;
    252252struct DataListSuggestionInformation;
     253struct DateTimeChooserParameters;
    253254struct DictionaryPopupInfo;
    254255struct DragItem;
     
    417418using DrawToPDFCallback = GenericCallback<const IPC::DataReference&>;
    418419typedef GenericCallback<bool, bool, String, double, double, uint64_t> NowPlayingInfoCallback;
     420#endif
     421
     422#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     423class WebDateTimePicker;
    419424#endif
    420425
     
    16481653#endif
    16491654
     1655#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     1656    void didChooseDate(StringView);
     1657    void didEndDateTimePicker();
     1658#endif
     1659
    16501660    void updateCurrentModifierState();
    16511661
     
    20022012#endif
    20032013
     2014#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     2015    void showDateTimePicker(WebCore::DateTimeChooserParameters&&);
     2016    void endDateTimePicker();
     2017#endif
     2018
    20042019    void closeOverlayedViews();
    20052020
     
    26022617    RefPtr<WebDataListSuggestionsDropdown> m_dataListSuggestionsDropdown;
    26032618#endif
     2619#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     2620    RefPtr<WebDateTimePicker> m_dateTimePicker;
     2621#endif
    26042622#if PLATFORM(COCOA)
    26052623    RefPtr<WebCore::ValidationBubble> m_validationBubble;
  • trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in

    r266003 r266063  
    9999#endif
    100100
     101#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     102    ShowDateTimePicker(struct WebCore::DateTimeChooserParameters params);
     103    EndDateTimePicker();
     104#endif
     105
    101106    # Policy messages
    102107    DecidePolicyForResponse(WebCore::FrameIdentifier frameID, struct WebKit::FrameInfoData frameInfo, WebCore::PolicyCheckIdentifier policyCheckIdentifier, uint64_t navigationID, WebCore::ResourceResponse response, WebCore::ResourceRequest request, bool canShowMIMEType, String downloadAttribute, uint64_t listenerID, WebKit::UserData userData)
  • trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.h

    r265882 r266063  
    125125#endif
    126126
     127#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     128    RefPtr<WebDateTimePicker> createDateTimePicker(WebPageProxy&) final;
     129#endif
     130
    127131    void setTextIndicator(Ref<WebCore::TextIndicator>, WebCore::TextIndicatorWindowLifetime) override;
    128132    void clearTextIndicator(WebCore::TextIndicatorWindowDismissalAnimation) override;
  • trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm

    r265882 r266063  
    850850#endif
    851851
     852#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     853RefPtr<WebDateTimePicker> PageClientImpl::createDateTimePicker(WebPageProxy&)
     854{
     855    return nullptr;
     856}
     857#endif
     858
    852859#if ENABLE(DRAG_SUPPORT)
    853860void PageClientImpl::didPerformDragOperation(bool handled)
  • trunk/Source/WebKit/UIProcess/mac/PageClientImplMac.h

    r263825 r266063  
    144144#endif
    145145
     146#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     147    RefPtr<WebDateTimePicker> createDateTimePicker(WebPageProxy&) override;
     148#endif
     149
    146150    Ref<WebCore::ValidationBubble> createValidationBubble(const String& message, const WebCore::ValidationBubble::Settings&) final;
    147151
  • trunk/Source/WebKit/UIProcess/mac/PageClientImplMac.mm

    r265091 r266063  
    5353#import "WebContextMenuProxyMac.h"
    5454#import "WebDataListSuggestionsDropdownMac.h"
     55#import "WebDateTimePickerMac.h"
    5556#import "WebEditCommandProxy.h"
    5657#import "WebPageProxy.h"
     
    477478#endif
    478479
     480#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     481RefPtr<WebDateTimePicker> PageClientImpl::createDateTimePicker(WebPageProxy& page)
     482{
     483    return WebDateTimePickerMac::create(page, m_view);
     484}
     485#endif
     486
    479487Ref<ValidationBubble> PageClientImpl::createValidationBubble(const String& message, const ValidationBubble::Settings& settings)
    480488{
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r266003 r266063  
    18361836                E52CF55220A35C3A00DADA27 /* WebDataListSuggestionPicker.h in Headers */ = {isa = PBXBuildFile; fileRef = E52CF55020A35C3A00DADA27 /* WebDataListSuggestionPicker.h */; };
    18371837                E548EBD121015F0E00BE3C32 /* WKFormColorPicker.h in Headers */ = {isa = PBXBuildFile; fileRef = E548EBCF21015F0E00BE3C32 /* WKFormColorPicker.h */; };
     1838                E55CD1F524CF747D0042DB9C /* WebDateTimeChooser.h in Headers */ = {isa = PBXBuildFile; fileRef = E55CD1F324CF747D0042DB9C /* WebDateTimeChooser.h */; };
     1839                E55CD20024D08D8F0042DB9C /* WebDateTimePicker.h in Headers */ = {isa = PBXBuildFile; fileRef = E55CD1FC24D0880B0042DB9C /* WebDateTimePicker.h */; };
     1840                E55CD20324D09F1F0042DB9C /* WebDateTimePickerMac.h in Headers */ = {isa = PBXBuildFile; fileRef = E55CD20124D09F1F0042DB9C /* WebDateTimePickerMac.h */; };
    18381841                E568B91F20A3AB2F00E3C856 /* WebDataListSuggestionsDropdown.h in Headers */ = {isa = PBXBuildFile; fileRef = E568B91E20A3AB2F00E3C856 /* WebDataListSuggestionsDropdown.h */; };
    18391842                E568B92220A3AC6A00E3C856 /* WebDataListSuggestionsDropdownMac.h in Headers */ = {isa = PBXBuildFile; fileRef = E568B92020A3AC6A00E3C856 /* WebDataListSuggestionsDropdownMac.h */; };
     
    53665369                E548EBD021015F0E00BE3C32 /* WKFormColorPicker.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = WKFormColorPicker.mm; path = ios/forms/WKFormColorPicker.mm; sourceTree = "<group>"; };
    53675370                E54A14CE20FCFB7B007E13D8 /* WebDataListSuggestionsDropdown.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WebDataListSuggestionsDropdown.cpp; sourceTree = "<group>"; };
     5371                E55CD1F324CF747D0042DB9C /* WebDateTimeChooser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebDateTimeChooser.h; sourceTree = "<group>"; };
     5372                E55CD1F424CF747D0042DB9C /* WebDateTimeChooser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WebDateTimeChooser.cpp; sourceTree = "<group>"; };
     5373                E55CD1FC24D0880B0042DB9C /* WebDateTimePicker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebDateTimePicker.h; sourceTree = "<group>"; };
     5374                E55CD1FD24D0880B0042DB9C /* WebDateTimePicker.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WebDateTimePicker.cpp; sourceTree = "<group>"; };
     5375                E55CD20124D09F1F0042DB9C /* WebDateTimePickerMac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebDateTimePickerMac.h; sourceTree = "<group>"; };
     5376                E55CD20224D09F1F0042DB9C /* WebDateTimePickerMac.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = WebDateTimePickerMac.mm; sourceTree = "<group>"; };
    53685377                E568B91E20A3AB2F00E3C856 /* WebDataListSuggestionsDropdown.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebDataListSuggestionsDropdown.h; sourceTree = "<group>"; };
    53695378                E568B92020A3AC6A00E3C856 /* WebDataListSuggestionsDropdownMac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebDataListSuggestionsDropdownMac.h; sourceTree = "<group>"; };
     
    88378846                                E52CF55120A35C3A00DADA27 /* WebDataListSuggestionPicker.cpp */,
    88388847                                E52CF55020A35C3A00DADA27 /* WebDataListSuggestionPicker.h */,
     8848                                E55CD1F424CF747D0042DB9C /* WebDateTimeChooser.cpp */,
     8849                                E55CD1F324CF747D0042DB9C /* WebDateTimeChooser.h */,
    88398850                                CD19A2691A13E820008D650E /* WebDiagnosticLoggingClient.cpp */,
    88408851                                CD19A26A1A13E821008D650E /* WebDiagnosticLoggingClient.h */,
     
    90539064                                E54A14CE20FCFB7B007E13D8 /* WebDataListSuggestionsDropdown.cpp */,
    90549065                                E568B91E20A3AB2F00E3C856 /* WebDataListSuggestionsDropdown.h */,
     9066                                E55CD1FD24D0880B0042DB9C /* WebDateTimePicker.cpp */,
     9067                                E55CD1FC24D0880B0042DB9C /* WebDateTimePicker.h */,
    90559068                                BCA0EF9E12332642007D3CFB /* WebEditCommandProxy.cpp */,
    90569069                                BCA0EF9D12332642007D3CFB /* WebEditCommandProxy.h */,
     
    98479860                                E568B92020A3AC6A00E3C856 /* WebDataListSuggestionsDropdownMac.h */,
    98489861                                E568B92120A3AC6A00E3C856 /* WebDataListSuggestionsDropdownMac.mm */,
     9862                                E55CD20124D09F1F0042DB9C /* WebDateTimePickerMac.h */,
     9863                                E55CD20224D09F1F0042DB9C /* WebDateTimePickerMac.mm */,
    98499864                                BC857E8512B71EBB00EDEB2E /* WebPageProxyMac.mm */,
    98509865                                BC5750951268F3C6006F0F12 /* WebPopupMenuProxyMac.h */,
     
    1128211297                                E5BEF6822130C48000F31111 /* WebDataListSuggestionsDropdownIOS.h in Headers */,
    1128311298                                E568B92220A3AC6A00E3C856 /* WebDataListSuggestionsDropdownMac.h in Headers */,
     11299                                E55CD1F524CF747D0042DB9C /* WebDateTimeChooser.h in Headers */,
     11300                                E55CD20024D08D8F0042DB9C /* WebDateTimePicker.h in Headers */,
     11301                                E55CD20324D09F1F0042DB9C /* WebDateTimePickerMac.h in Headers */,
    1128411302                                46B0524722668D8500265B97 /* WebDeviceOrientationAndMotionAccessController.h in Headers */,
    1128511303                                E39628DD23960CC600658ECD /* WebDeviceOrientationUpdateProvider.h in Headers */,
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp

    r265562 r266063  
    4545#include "WebCoreArgumentCoders.h"
    4646#include "WebDataListSuggestionPicker.h"
     47#include "WebDateTimeChooser.h"
    4748#include "WebFrame.h"
    4849#include "WebFrameLoaderClient.h"
     
    776777#endif
    777778
     779#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     780
     781std::unique_ptr<DateTimeChooser> WebChromeClient::createDateTimeChooser(DateTimeChooserClient& client)
     782{
     783    return makeUnique<WebDateTimeChooser>(m_page, client);
     784}
     785
     786#endif
     787
    778788void WebChromeClient::runOpenPanel(Frame& frame, FileChooser& fileChooser)
    779789{
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h

    r265562 r266063  
    153153#endif
    154154
     155#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     156    std::unique_ptr<WebCore::DateTimeChooser> createDateTimeChooser(WebCore::DateTimeChooserClient&) final;
     157#endif
     158
    155159#if ENABLE(IOS_TOUCH_EVENTS)
    156160    void didPreventDefaultForEvent() final;
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp

    r266003 r266063  
    8181#include "WebDataListSuggestionPicker.h"
    8282#include "WebDatabaseProvider.h"
     83#include "WebDateTimeChooser.h"
    8384#include "WebDiagnosticLoggingClient.h"
    8485#include "WebDocumentLoader.h"
     
    42094210#endif
    42104211
     4212#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     4213
     4214void WebPage::setActiveDateTimeChooser(WebDateTimeChooser& dateTimeChooser)
     4215{
     4216    m_activeDateTimeChooser = makeWeakPtr(&dateTimeChooser);
     4217}
     4218
     4219void WebPage::didChooseDate(const String& date)
     4220{
     4221    if (m_activeDateTimeChooser)
     4222        m_activeDateTimeChooser->didChooseDate(date);
     4223}
     4224
     4225void WebPage::didEndDateTimePicker()
     4226{
     4227    if (auto chooser = std::exchange(m_activeDateTimeChooser, nullptr))
     4228        chooser->didEndChooser();
     4229}
     4230
     4231#endif
     4232
    42114233void WebPage::setActiveOpenPanelResultListener(Ref<WebOpenPanelResultListener>&& openPanelResultListener)
    42124234{
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.h

    r266003 r266063  
    250250class WebContextMenuItemData;
    251251class WebDataListSuggestionPicker;
     252class WebDateTimeChooser;
    252253class WebDocumentLoader;
    253254class WebEvent;
     
    437438    void didSelectDataListOption(const String&);
    438439    void didCloseSuggestions();
     440#endif
     441
     442#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     443    void setActiveDateTimeChooser(WebDateTimeChooser&);
     444    void didChooseDate(const String&);
     445    void didEndDateTimePicker();
    439446#endif
    440447
     
    19111918#endif
    19121919
     1920#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     1921    WeakPtr<WebDateTimeChooser> m_activeDateTimeChooser;
     1922#endif
     1923
    19131924    RefPtr<WebOpenPanelResultListener> m_activeOpenPanelResultListener;
    19141925    RefPtr<NotificationPermissionRequestManager> m_notificationPermissionRequestManager;
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in

    r265916 r266063  
    160160#endif
    161161
     162#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     163    DidChooseDate(String date);
     164    DidEndDateTimePicker();
     165#endif
     166
    162167#if ENABLE(CONTEXT_MENUS)
    163168    ContextMenuHidden()
  • trunk/Source/WebKitLegacy/mac/ChangeLog

    r266028 r266063  
     12020-08-24  Aditya Keerthi  <akeerthi@apple.com>
     2
     3        [macOS] Show picker for date and datetime-local input types
     4        https://bugs.webkit.org/show_bug.cgi?id=214946
     5
     6        Reviewed by Darin Adler and Wenson Hsieh.
     7
     8        * WebCoreSupport/WebChromeClient.h:
     9        * WebCoreSupport/WebChromeClient.mm:
     10        (WebChromeClient::createDateTimeChooser):
     11
    1122020-08-19  Darin Adler  <darin@apple.com>
    213
  • trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebChromeClient.h

    r263498 r266063  
    148148#endif
    149149
     150#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     151    std::unique_ptr<WebCore::DateTimeChooser> createDateTimeChooser(WebCore::DateTimeChooserClient&) final;
     152#endif
     153
    150154#if ENABLE(POINTER_LOCK)
    151155    bool requestPointerLock() final;
  • trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebChromeClient.mm

    r264006 r266063  
    733733#endif
    734734
     735#if ENABLE(DATE_AND_TIME_INPUT_TYPES)
     736std::unique_ptr<DateTimeChooser> WebChromeClient::createDateTimeChooser(DateTimeChooserClient&)
     737{
     738    ASSERT_NOT_REACHED();
     739    return nullptr;
     740}
     741#endif
     742
    735743#if ENABLE(POINTER_LOCK)
    736744bool WebChromeClient::requestPointerLock()
  • trunk/Tools/ChangeLog

    r266055 r266063  
     12020-08-24  Aditya Keerthi  <akeerthi@apple.com>
     2
     3        [macOS] Show picker for date and datetime-local input types
     4        https://bugs.webkit.org/show_bug.cgi?id=214946
     5
     6        Reviewed by Darin Adler and Wenson Hsieh.
     7
     8        Added isShowingDateTimePicker testing hook in order to enable testing of the visibility of
     9        the picker.
     10
     11        * TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl:
     12        * TestRunnerShared/UIScriptContext/UIScriptController.h:
     13        (WTR::UIScriptController::isShowingDateTimePicker const):
     14        * WebKitTestRunner/mac/UIScriptControllerMac.h:
     15        * WebKitTestRunner/mac/UIScriptControllerMac.mm:
     16        (WTR::UIScriptControllerMac::isShowingDateTimePicker const):
     17
    1182020-08-24  Carlos Garcia Campos  <cgarcia@igalia.com>
    219
  • trunk/Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl

    r265396 r266063  
    224224    readonly attribute double timePickerValueMinute;
    225225
     226    readonly attribute boolean isShowingDateTimePicker;
     227
    226228    // <datalist>
    227229    readonly attribute boolean isShowingDataListSuggestions;
  • trunk/Tools/TestRunnerShared/UIScriptContext/UIScriptController.h

    r265396 r266063  
    217217    virtual double timePickerValueHour() const { notImplemented(); return -1; }
    218218    virtual double timePickerValueMinute() const { notImplemented(); return -1; }
     219    virtual bool isShowingDateTimePicker() const { notImplemented(); return false; }
    219220    virtual bool isShowingDataListSuggestions() const { notImplemented(); return false; }
    220221    virtual JSObjectRef calendarType() const { notImplemented(); return nullptr; }
  • trunk/Tools/WebKitTestRunner/mac/UIScriptControllerMac.h

    r265396 r266063  
    4343    double zoomScale() const override;
    4444    void simulateAccessibilitySettingsChangeNotification(JSValueRef) override;
     45    bool isShowingDateTimePicker() const override;
    4546    bool isShowingDataListSuggestions() const override;
    4647    void activateDataListSuggestion(unsigned index, JSValueRef callback) override;
  • trunk/Tools/WebKitTestRunner/mac/UIScriptControllerMac.mm

    r265396 r266063  
    9898}
    9999
     100bool UIScriptControllerMac::isShowingDateTimePicker() const
     101{
     102    for (NSWindow *childWindow in webView().window.childWindows) {
     103        if ([childWindow isKindOfClass:NSClassFromString(@"WKDateTimePickerWindow")])
     104            return true;
     105    }
     106    return false;
     107}
     108
    100109bool UIScriptControllerMac::isShowingDataListSuggestions() const
    101110{
Note: See TracChangeset for help on using the changeset viewer.