Changeset 92592 in webkit


Ignore:
Timestamp:
Aug 8, 2011 5:44:33 AM (13 years ago)
Author:
keishi@webkit.org
Message:

Implement <input type=color> UI behavior WebCore part
https://bugs.webkit.org/show_bug.cgi?id=62619

Reviewed by Kent Tamura.

  • WebCore.exp.in: Added ZN7WebCore12ColorChooser7chooserEv and

ZNK7WebCore12ColorChooser13colorSelectedERKNS_5ColorE

  • WebCore.xcodeproj/project.pbxproj: Added ColorChooser.{h,cpp}
  • html/ColorInputType.cpp:

(WebCore::ColorInputType::~ColorInputType): Added. Close color chooser. ex. when type attribute changes.
(WebCore::ColorInputType::valueAsColor): Added.
(WebCore::ColorInputType::setValueAsColor): Added.
(WebCore::ColorInputType::valueChanged): Update selected color in color chooser too.
(WebCore::ColorInputType::handleClickEvent): Opens color chooser.
(WebCore::ColorInputType::handleDOMActivateEvent): Called when element.click(). Open color chooser only
when it was initiated by a user interaction.
(WebCore::ColorInputType::detach): Close color chooser. Called when input element or its ancestors have "display:none"
or is removed from DOM.
(WebCore::ColorInputType::colorSelected): Callback from color chooser.
(WebCore::ColorInputType::isColorInputType): Returns true.
(WebCore::ColorInputType::closeColorChooserIfCurrentClient): Close color chooser if this input type is the current client of ColorChooser.

  • html/ColorInputType.h:
  • html/FileInputType.cpp:
  • html/FileInputType.h:
  • html/HTMLInputElement.cpp:

(WebCore::HTMLInputElement::detach): Calls InputType::detach

  • html/InputType.cpp:

(WebCore::InputType::chrome): Added. Used in FileInputType and ColorInputType.
(WebCore::InputType::detach): ColorInputType overrides this.

  • html/InputType.h:
  • loader/EmptyClients.h:

(WebCore::EmptyChromeClient::openColorChooser):
(WebCore::EmptyChromeClient::closeColorChooser):
(WebCore::EmptyChromeClient::setSelectedColorInColorChooser):

  • loader/FrameLoader.cpp:

(WebCore::FrameLoader::transitionToCommitted): Close color chooser when navigating away from the page. We do this here
because ColorInputType::detach() is called seconds after the page transition so it is too slow.

  • page/Chrome.cpp:

(WebCore::Chrome::openColorChooser): Added.
(WebCore::Chrome::closeColorChooser): Added.
(WebCore::Chrome::setSelectedColorInColorChooser): Added.

  • page/Chrome.h:
  • page/ChromeClient.h:
  • platform/ColorChooser.cpp: Added.

(WebCore::ColorChooserClient::~ColorChooserClient): Disconnects itself from the ColorChooser.
(WebCore::ColorChooser::chooser): Get shared instance of ColorChooser.
(WebCore::ColorChooser::connectClient): Connects a ColorChooserClient that receives the colorSelected callbacks.
(WebCore::ColorChooser::disconnectClient): Disconnects the connectClient.
(WebCore::ColorChooser::colorSelected): Called from color chooser listener.

  • platform/ColorChooser.h: Added.

(WebCore::ColorChooserClient::isColorInputType): Added.
(WebCore::ColorChooser::client): Added. Returns the current connected client.
(WebCore::ColorChooser::ColorChooser): Added.

Location:
trunk/Source/WebCore
Files:
2 added
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r92589 r92592  
     12011-08-08  Keishi Hattori  <keishi@webkit.org>
     2
     3        Implement <input type=color> UI behavior WebCore part
     4        https://bugs.webkit.org/show_bug.cgi?id=62619
     5
     6        Reviewed by Kent Tamura.
     7
     8        * WebCore.exp.in: Added __ZN7WebCore12ColorChooser7chooserEv and
     9        __ZNK7WebCore12ColorChooser13colorSelectedERKNS_5ColorE
     10        * WebCore.xcodeproj/project.pbxproj: Added ColorChooser.{h,cpp}
     11        * html/ColorInputType.cpp:
     12        (WebCore::ColorInputType::~ColorInputType): Added. Close color chooser. ex. when type attribute changes.
     13        (WebCore::ColorInputType::valueAsColor): Added.
     14        (WebCore::ColorInputType::setValueAsColor): Added.
     15        (WebCore::ColorInputType::valueChanged): Update selected color in color chooser too.
     16        (WebCore::ColorInputType::handleClickEvent): Opens color chooser.
     17        (WebCore::ColorInputType::handleDOMActivateEvent): Called when element.click(). Open color chooser only
     18        when it was initiated by a user interaction.
     19        (WebCore::ColorInputType::detach): Close color chooser. Called when input element or its ancestors have "display:none"
     20        or is removed from DOM.
     21        (WebCore::ColorInputType::colorSelected): Callback from color chooser.
     22        (WebCore::ColorInputType::isColorInputType): Returns true.
     23        (WebCore::ColorInputType::closeColorChooserIfCurrentClient): Close color chooser if this input type is the current client of ColorChooser.
     24        * html/ColorInputType.h:
     25        * html/FileInputType.cpp:
     26        * html/FileInputType.h:
     27        * html/HTMLInputElement.cpp:
     28        (WebCore::HTMLInputElement::detach): Calls InputType::detach
     29        * html/InputType.cpp:
     30        (WebCore::InputType::chrome): Added. Used in FileInputType and ColorInputType.
     31        (WebCore::InputType::detach): ColorInputType overrides this.
     32        * html/InputType.h:
     33        * loader/EmptyClients.h:
     34        (WebCore::EmptyChromeClient::openColorChooser):
     35        (WebCore::EmptyChromeClient::closeColorChooser):
     36        (WebCore::EmptyChromeClient::setSelectedColorInColorChooser):
     37        * loader/FrameLoader.cpp:
     38        (WebCore::FrameLoader::transitionToCommitted): Close color chooser when navigating away from the page. We do this here
     39        because ColorInputType::detach() is called seconds after the page transition so it is too slow.
     40        * page/Chrome.cpp:
     41        (WebCore::Chrome::openColorChooser): Added.
     42        (WebCore::Chrome::closeColorChooser): Added.
     43        (WebCore::Chrome::setSelectedColorInColorChooser): Added.
     44        * page/Chrome.h:
     45        * page/ChromeClient.h:
     46        * platform/ColorChooser.cpp: Added.
     47        (WebCore::ColorChooserClient::~ColorChooserClient): Disconnects itself from the ColorChooser.
     48        (WebCore::ColorChooser::chooser): Get shared instance of ColorChooser.
     49        (WebCore::ColorChooser::connectClient): Connects a ColorChooserClient that receives the colorSelected callbacks.
     50        (WebCore::ColorChooser::disconnectClient): Disconnects the connectClient.
     51        (WebCore::ColorChooser::colorSelected): Called from color chooser listener.
     52        * platform/ColorChooser.h: Added.
     53        (WebCore::ColorChooserClient::isColorInputType): Added.
     54        (WebCore::ColorChooser::client): Added. Returns the current connected client.
     55        (WebCore::ColorChooser::ColorChooser): Added.
     56
    1572011-08-08  Shinya Kawanaka  <shinyak@google.com>
    258
  • trunk/Source/WebCore/WebCore.exp.in

    r92587 r92592  
    19401940__ZN7WebCore14ResourceHandle12releaseProxyEv
    19411941#endif
     1942
     1943#if ENABLE(INPUT_COLOR)
     1944__ZN7WebCore12ColorChooser7chooserEv
     1945__ZNK7WebCore12ColorChooser13colorSelectedERKNS_5ColorE
     1946#endif
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r92582 r92592  
    53325332                C105DA620F3AA68F001DD44F /* TextEncodingDetectorICU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C105DA610F3AA68F001DD44F /* TextEncodingDetectorICU.cpp */; };
    53335333                C105DA640F3AA6B8001DD44F /* TextEncodingDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = C105DA630F3AA6B8001DD44F /* TextEncodingDetector.h */; };
     5334                C330A22213EC196B0000B45B /* ColorChooser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C330A22013EC196B0000B45B /* ColorChooser.cpp */; };
     5335                C330A22313EC196B0000B45B /* ColorChooser.h in Headers */ = {isa = PBXBuildFile; fileRef = C330A22113EC196B0000B45B /* ColorChooser.h */; settings = {ATTRIBUTES = (Private, ); }; };
    53345336                C50B561612119D23008B46E0 /* GroupSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C50B561412119D23008B46E0 /* GroupSettings.cpp */; };
    53355337                C50B561712119D23008B46E0 /* GroupSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = C50B561512119D23008B46E0 /* GroupSettings.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    1203812040                C105DA610F3AA68F001DD44F /* TextEncodingDetectorICU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextEncodingDetectorICU.cpp; sourceTree = "<group>"; };
    1203912041                C105DA630F3AA6B8001DD44F /* TextEncodingDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextEncodingDetector.h; sourceTree = "<group>"; };
     12042                C330A22013EC196B0000B45B /* ColorChooser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ColorChooser.cpp; sourceTree = "<group>"; };
     12043                C330A22113EC196B0000B45B /* ColorChooser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ColorChooser.h; sourceTree = "<group>"; };
    1204012044                C50B561412119D23008B46E0 /* GroupSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GroupSettings.cpp; sourceTree = "<group>"; };
    1204112045                C50B561512119D23008B46E0 /* GroupSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupSettings.h; sourceTree = "<group>"; };
     
    1902619030                                89D08D9E12228451001241DF /* AsyncFileSystemCallbacks.h */,
    1902719031                                51E1ECB10C91C55600DC255B /* AutodrainedPool.h */,
     19032                                C330A22013EC196B0000B45B /* ColorChooser.cpp */,
     19033                                C330A22113EC196B0000B45B /* ColorChooser.h */,
    1902819034                                BCC8CFCA0986CD2400140BF2 /* ColorData.gperf */,
    1902919035                                41D015C90F4B5C71004A662F /* ContentType.cpp */,
     
    2052220528                                93C442000F813AE100C1A634 /* CollectionType.h in Headers */,
    2052320529                                B27535670B053814002CE64F /* Color.h in Headers */,
     20530                                C330A22313EC196B0000B45B /* ColorChooser.h in Headers */,
    2052420531                                B22279630D00BF220071B782 /* ColorDistance.h in Headers */,
    2052520532                                F55B3DB41251F12D003EF269 /* ColorInputType.h in Headers */,
     
    2381723824                                B27535660B053814002CE64F /* Color.cpp in Sources */,
    2381823825                                0FCF33240F2B9715004B6795 /* ColorCG.cpp in Sources */,
     23826                                C330A22213EC196B0000B45B /* ColorChooser.cpp in Sources */,
    2381923827                                1ABA76C911D20E47004C201C /* ColorData.cpp in Sources */,
    2382023828                                B22279620D00BF220071B782 /* ColorDistance.cpp in Sources */,
  • trunk/Source/WebCore/html/ColorInputType.cpp

    r92533 r92592  
    3232#include "ColorInputType.h"
    3333
     34#include "Chrome.h"
    3435#include "Color.h"
    3536#include "HTMLDivElement.h"
    3637#include "HTMLInputElement.h"
     38#include "MouseEvent.h"
     39#include "ScriptController.h"
    3740#include "ShadowRoot.h"
    3841#include <wtf/PassOwnPtr.h>
     
    6265}
    6366
     67ColorInputType::~ColorInputType()
     68{
     69    closeColorChooserIfCurrentClient();
     70}   
     71
    6472bool ColorInputType::isColorControl() const
    6573{
     
    9199
    92100    return proposedValue.lower();
     101}
     102
     103Color ColorInputType::valueAsColor() const
     104{
     105    return Color(element()->value());
     106}
     107
     108void ColorInputType::setValueAsColor(const Color& color) const
     109{
     110    element()->setValue(color.serialized(), true);
    93111}
    94112
     
    112130{
    113131    updateColorSwatch();
     132    if (ColorChooser::chooser()->client() == this) {
     133        if (Chrome* chrome = this->chrome())
     134            chrome->setSelectedColorInColorChooser(valueAsColor());
     135    }
     136}
     137
     138void ColorInputType::handleClickEvent(MouseEvent* event)
     139{
     140    if (event->isSimulated())
     141        return;
     142
     143    if (element()->disabled() || element()->readOnly())
     144        return;
     145
     146    if (Chrome* chrome = this->chrome()) {
     147        ColorChooser::chooser()->connectClient(this);
     148        chrome->openColorChooser(ColorChooser::chooser(), valueAsColor());
     149    }
     150    event->setDefaultHandled();
     151}
     152
     153void ColorInputType::handleDOMActivateEvent(Event* event)
     154{
     155    if (element()->disabled() || element()->readOnly() || !element()->renderer())
     156        return;
     157
     158    if (!ScriptController::processingUserGesture())
     159        return;
     160
     161    if (Chrome* chrome = this->chrome()) {
     162        ColorChooser::chooser()->connectClient(this);
     163        chrome->openColorChooser(ColorChooser::chooser(), valueAsColor());
     164    }
     165    event->setDefaultHandled();
     166}
     167
     168void ColorInputType::detach()
     169{
     170    closeColorChooserIfCurrentClient();
     171}
     172
     173void ColorInputType::colorSelected(const Color& color)
     174{
     175    if (element()->disabled() || element()->readOnly())
     176        return;
     177    setValueAsColor(color);
     178}
     179
     180bool ColorInputType::isColorInputType() const
     181{
     182    return true;
    114183}
    115184
     
    130199}
    131200
     201void ColorInputType::closeColorChooserIfCurrentClient() const
     202{
     203    if (ColorChooser::chooser()->client() != this)
     204        return;
     205    if (Chrome* chrome = this->chrome())
     206        chrome->closeColorChooser();
     207}
     208
    132209} // namespace WebCore
    133210
  • trunk/Source/WebCore/html/ColorInputType.h

    r92533 r92592  
    3232#define ColorInputType_h
    3333
    34 #include "BaseButtonInputType.h"
     34#include "ColorChooser.h"
     35#include "InputType.h"
    3536
    3637#if ENABLE(INPUT_COLOR)
     
    3839namespace WebCore {
    3940
    40 class ColorInputType : public InputType {
     41class ColorInputType : public InputType, public ColorChooserClient {
    4142public:
    4243    static PassOwnPtr<InputType> create(HTMLInputElement*);
     44    virtual ~ColorInputType();
     45
     46    void closeColorChooserIfCurrentClient() const;
    4347
    4448private:
     
    4953    virtual String fallbackValue();
    5054    virtual String sanitizeValue(const String&);
     55    virtual Color valueAsColor() const;
     56    virtual void setValueAsColor(const Color&) const;
    5157    virtual void createShadowSubtree();
    5258    virtual void valueChanged();
     59    virtual void handleClickEvent(MouseEvent*);
     60    virtual void handleDOMActivateEvent(Event*);
     61    virtual void detach();
     62
     63    // ColorChooserClient implementation.
     64    virtual void colorSelected(const Color&);
     65    virtual bool isColorInputType() const;
    5366
    5467    void updateColorSwatch();
  • trunk/Source/WebCore/html/FileInputType.cpp

    r92533 r92592  
    3434#include "Icon.h"
    3535#include "LocalizedStrings.h"
    36 #include "Page.h"
    3736#include "RenderFileUploadControl.h"
    3837#include "ScriptController.h"
     
    334333}
    335334
    336 Chrome* FileInputType::chrome() const
    337 {
    338     if (Page* page = element()->document()->page())
    339         return page->chrome();
    340     return 0;
    341 }
    342 
    343335void FileInputType::receiveDroppedFiles(const Vector<String>& paths)
    344336{
  • trunk/Source/WebCore/html/FileInputType.h

    r92533 r92592  
    4040namespace WebCore {
    4141
    42 class Chrome;
    4342class FileList;
    4443
     
    7877#endif
    7978    void requestIcon(const Vector<String>&);
    80     Chrome* chrome() const;
    8179
    8280    RefPtr<FileList> m_fileList;
  • trunk/Source/WebCore/html/HTMLInputElement.cpp

    r92589 r92592  
    888888    HTMLTextFormControlElement::detach();
    889889    setFormControlValueMatchesRenderer(false);
     890    m_inputType->detach();
    890891}
    891892
  • trunk/Source/WebCore/html/InputType.cpp

    r92589 r92592  
    4949#include "MonthInputType.h"
    5050#include "NumberInputType.h"
     51#include "Page.h"
    5152#include "PasswordInputType.h"
    5253#include "RadioInputType.h"
     
    402403}
    403404
     405Chrome* InputType::chrome() const
     406{
     407    if (Page* page = element()->document()->page())
     408        return page->chrome();
     409    return 0;
     410}
     411
    404412bool InputType::canSetStringValue() const
    405413{
     
    427435
    428436void InputType::attach()
     437{
     438}
     439
     440void InputType::detach()
    429441{
    430442}
  • trunk/Source/WebCore/html/InputType.h

    r92589 r92592  
    4242
    4343class BeforeTextInsertedEvent;
     44class Chrome;
     45class Color;
    4446class DateComponents;
    4547class Event;
     
    9294#if ENABLE(INPUT_COLOR)
    9395    virtual bool isColorControl() const;
    94 #endif // ENABLE(INPUT_COLOR)
     96#endif
    9597    virtual bool isCheckbox() const;
    9698    virtual bool isEmailField() const;
     
    207209    virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) const;
    208210    virtual void attach();
     211    virtual void detach();
    209212    virtual void minOrMaxAttributeChanged();
    210213    virtual void stepAttributeChanged();
     
    263266    // We can't make this a static const data member because VC++ doesn't like it.
    264267    static double defaultStepBase() { return 0.0; }
     268    Chrome* chrome() const;
    265269
    266270private:
  • trunk/Source/WebCore/loader/EmptyClients.h

    r92533 r92592  
    196196#endif
    197197
     198#if ENABLE(INPUT_COLOR)
     199    void openColorChooser(ColorChooser*, const Color&) { }
     200    void closeColorChooser() { }
     201    void setSelectedColorInColorChooser(const Color&) { }
     202#endif
     203
    198204    virtual void runOpenPanel(Frame*, PassRefPtr<FileChooser>) { }
    199205    virtual void loadIconForFiles(const Vector<String>&, FileIconLoader*) { }
  • trunk/Source/WebCore/loader/FrameLoader.cpp

    r92533 r92592  
    101101#include <wtf/text/WTFString.h>
    102102
     103#if ENABLE(INPUT_COLOR)
     104#include "ColorChooser.h"
     105#include "ColorInputType.h"
     106#endif
     107
    103108#if ENABLE(SHARED_WORKERS)
    104109#include "SharedWorkerRepository.h"
     
    18161821    if (m_frame->view())
    18171822        m_frame->view()->scrollAnimator()->cancelAnimations();
     1823
     1824#if ENABLE(INPUT_COLOR)
     1825    ColorChooserClient* colorChooserClient = ColorChooser::chooser()->client();
     1826    if (colorChooserClient && colorChooserClient->isColorInputType())
     1827        static_cast<ColorInputType*>(colorChooserClient)->closeColorChooserIfCurrentClient();
     1828#endif
    18181829
    18191830    m_client->setCopiesOnScroll();
  • trunk/Source/WebCore/page/Chrome.cpp

    r92533 r92592  
    5353#endif
    5454
     55#if ENABLE(INPUT_COLOR)
     56#include "ColorChooser.h"
     57#endif
     58
    5559namespace WebCore {
    5660
     
    468472#endif
    469473
     474#if ENABLE(INPUT_COLOR)
     475void Chrome::openColorChooser(ColorChooser* colorChooser, const Color& initialColor)
     476{
     477    m_client->openColorChooser(colorChooser, initialColor);
     478}
     479
     480void Chrome::closeColorChooser()
     481{
     482    m_client->closeColorChooser();
     483}
     484
     485void Chrome::setSelectedColorInColorChooser(const Color& color)
     486{
     487    m_client->setSelectedColorInColorChooser(color);
     488}
     489#endif
     490
    470491void Chrome::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> fileChooser)
    471492{
  • trunk/Source/WebCore/page/Chrome.h

    r92533 r92592  
    3737
    3838    class ChromeClient;
     39#if ENABLE(INPUT_COLOR)
     40    class ColorChooser;
     41#endif
    3942    class FileChooser;
    4043    class FileIconLoader;
     
    155158        void cancelGeolocationPermissionRequestForFrame(Frame*, Geolocation*);
    156159
     160#if ENABLE(INPUT_COLOR)
     161        void openColorChooser(ColorChooser*, const Color&);
     162        void closeColorChooser();
     163        void setSelectedColorInColorChooser(const Color&);
     164#endif
     165
    157166        void runOpenPanel(Frame*, PassRefPtr<FileChooser>);
    158167        void loadIconForFiles(const Vector<String>&, FileIconLoader*);
  • trunk/Source/WebCore/page/ChromeClient.h

    r92533 r92592  
    7272#endif
    7373
     74#if ENABLE(INPUT_COLOR)
     75    class ColorChooser;
     76#endif
     77
    7478#if ENABLE(NOTIFICATIONS)
    7579    class NotificationPresenter;
     
    231235        virtual void requestGeolocationPermissionForFrame(Frame*, Geolocation*) = 0;
    232236        virtual void cancelGeolocationPermissionRequestForFrame(Frame*, Geolocation*) = 0;
     237
     238#if ENABLE(INPUT_COLOR)
     239        virtual void openColorChooser(ColorChooser*, const Color&) = 0;
     240        virtual void closeColorChooser() = 0;
     241        virtual void setSelectedColorInColorChooser(const Color&) = 0;
     242#endif
    233243
    234244        virtual void runOpenPanel(Frame*, PassRefPtr<FileChooser>) = 0;
Note: See TracChangeset for help on using the changeset viewer.