Changeset 92477 in webkit


Ignore:
Timestamp:
Aug 5, 2011 6:45:21 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::closeColorChooserIfClientIsInDocument): Close color chooser if element is in
document. Called when the page navigates away.
(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): Added.
(WebCore::EmptyChromeClient::closeColorChooser): Added.
(WebCore::EmptyChromeClient::setSelectedColorInColorChooser): Added.

  • loader/FrameLoader.cpp:

(WebCore::FrameLoader::transitionToCommitted): Close color chooser when
navigating away from the page.

  • page/Chrome.cpp:

(WebCore::Chrome::openColorChooser): Added. Opens the color chooser.
(WebCore::Chrome::closeColorChooser): Added. Tries to close the color chooser. Might not close if the
listener of the color chooser is another part of the browser or another render process.
(WebCore::Chrome::setSelectedColorInColorChooser): Added. Sets the selected color in the color chooser.
Again, might not be executed if the listener of the color chooser is another part of the browser or another render process.

  • 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::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::closeColorChooserIfClientIsInDocument): Close the color chooser if the client is
inside the document.
(WebCore::ColorChooser::colorSelected): Called from color chooser listener.

  • platform/ColorChooser.h: 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

    r92476 r92477  
     12011-08-05  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::closeColorChooserIfClientIsInDocument): Close color chooser if element is in
     23        document. Called when the page navigates away.
     24        (WebCore::ColorInputType::closeColorChooserIfCurrentClient): Close color chooser if this input type is the current client of ColorChooser.
     25        * html/ColorInputType.h:
     26        * html/FileInputType.cpp:
     27        * html/FileInputType.h:
     28        * html/HTMLInputElement.cpp:
     29        (WebCore::HTMLInputElement::detach): Calls InputType::detach
     30        * html/InputType.cpp:
     31        (WebCore::InputType::chrome): Added. Used in FileInputType and ColorInputType.
     32        (WebCore::InputType::detach): ColorInputType overrides this.
     33        * html/InputType.h:
     34        * loader/EmptyClients.h:
     35        (WebCore::EmptyChromeClient::openColorChooser): Added.
     36        (WebCore::EmptyChromeClient::closeColorChooser): Added.
     37        (WebCore::EmptyChromeClient::setSelectedColorInColorChooser): Added.
     38        * loader/FrameLoader.cpp:
     39        (WebCore::FrameLoader::transitionToCommitted): Close color chooser when
     40        navigating away from the page.
     41        * page/Chrome.cpp:
     42        (WebCore::Chrome::openColorChooser): Added. Opens the color chooser.
     43        (WebCore::Chrome::closeColorChooser): Added. Tries to close the color chooser. Might not close if the
     44        listener of the color chooser is another part of the browser or another render process.
     45        (WebCore::Chrome::setSelectedColorInColorChooser): Added. Sets the selected color in the color chooser.
     46        Again, might not be executed if the listener of the color chooser is another part of the browser or another render process.
     47        * page/Chrome.h:
     48        * page/ChromeClient.h:
     49        * platform/ColorChooser.cpp: Added.
     50        (WebCore::ColorChooserClient::~ColorChooserClient): Disconnects itself from the ColorChooser.
     51        (WebCore::ColorChooser::chooser): Get shared instance of ColorChooser.
     52        (WebCore::ColorChooser::chooser): Get shared instance of ColorChooser.
     53        (WebCore::ColorChooser::connectClient): Connects a ColorChooserClient that receives the colorSelected callbacks.
     54        (WebCore::ColorChooser::disconnectClient): Disconnects the connectClient.
     55        (WebCore::ColorChooser::closeColorChooserIfClientIsInDocument): Close the color chooser if the client is
     56        inside the document.
     57        (WebCore::ColorChooser::colorSelected): Called from color chooser listener.
     58        * platform/ColorChooser.h: Added.
     59        (WebCore::ColorChooser::client): Added. Returns the current connected client.
     60        (WebCore::ColorChooser::ColorChooser): Added.
     61
    1622011-08-05  Yury Semikhatsky  <yurys@chromium.org>
    263
  • trunk/Source/WebCore/WebCore.exp.in

    r92438 r92477  
    19461946__ZN7WebCore14ResourceHandle12releaseProxyEv
    19471947#endif
     1948
     1949#if ENABLE(INPUT_COLOR)
     1950__ZN7WebCore12ColorChooser7chooserEv
     1951__ZNK7WebCore12ColorChooser13colorSelectedERKNS_5ColorE
     1952#endif
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r92475 r92477  
    53345334                C105DA620F3AA68F001DD44F /* TextEncodingDetectorICU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C105DA610F3AA68F001DD44F /* TextEncodingDetectorICU.cpp */; };
    53355335                C105DA640F3AA6B8001DD44F /* TextEncodingDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = C105DA630F3AA6B8001DD44F /* TextEncodingDetector.h */; };
     5336                C330A22213EC196B0000B45B /* ColorChooser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C330A22013EC196B0000B45B /* ColorChooser.cpp */; };
     5337                C330A22313EC196B0000B45B /* ColorChooser.h in Headers */ = {isa = PBXBuildFile; fileRef = C330A22113EC196B0000B45B /* ColorChooser.h */; settings = {ATTRIBUTES = (Private, ); }; };
    53365338                C50B561612119D23008B46E0 /* GroupSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C50B561412119D23008B46E0 /* GroupSettings.cpp */; };
    53375339                C50B561712119D23008B46E0 /* GroupSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = C50B561512119D23008B46E0 /* GroupSettings.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    1204212044                C105DA610F3AA68F001DD44F /* TextEncodingDetectorICU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextEncodingDetectorICU.cpp; sourceTree = "<group>"; };
    1204312045                C105DA630F3AA6B8001DD44F /* TextEncodingDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextEncodingDetector.h; sourceTree = "<group>"; };
     12046                C330A22013EC196B0000B45B /* ColorChooser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ColorChooser.cpp; sourceTree = "<group>"; };
     12047                C330A22113EC196B0000B45B /* ColorChooser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ColorChooser.h; sourceTree = "<group>"; };
    1204412048                C50B561412119D23008B46E0 /* GroupSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GroupSettings.cpp; sourceTree = "<group>"; };
    1204512049                C50B561512119D23008B46E0 /* GroupSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupSettings.h; sourceTree = "<group>"; };
     
    1903319037                                89D08D9E12228451001241DF /* AsyncFileSystemCallbacks.h */,
    1903419038                                51E1ECB10C91C55600DC255B /* AutodrainedPool.h */,
     19039                                C330A22013EC196B0000B45B /* ColorChooser.cpp */,
     19040                                C330A22113EC196B0000B45B /* ColorChooser.h */,
    1903519041                                BCC8CFCA0986CD2400140BF2 /* ColorData.gperf */,
    1903619042                                41D015C90F4B5C71004A662F /* ContentType.cpp */,
     
    2052920535                                93C442000F813AE100C1A634 /* CollectionType.h in Headers */,
    2053020536                                B27535670B053814002CE64F /* Color.h in Headers */,
     20537                                C330A22313EC196B0000B45B /* ColorChooser.h in Headers */,
    2053120538                                B22279630D00BF220071B782 /* ColorDistance.h in Headers */,
    2053220539                                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

    r91982 r92477  
    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
     180void ColorInputType::closeColorChooserIfClientIsInDocument(Document* document)
     181{
     182    if (element()->document() == document)
     183        closeColorChooserIfCurrentClient();
    114184}
    115185
     
    130200}
    131201
     202void ColorInputType::closeColorChooserIfCurrentClient()
     203{
     204    if (ColorChooser::chooser()->client() == this) {
     205        if (Chrome* chrome = this->chrome())
     206            chrome->closeColorChooser();
     207    }
     208}
     209
    132210} // namespace WebCore
    133211
  • trunk/Source/WebCore/html/ColorInputType.h

    r87372 r92477  
    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, private ColorChooserClient {
    4142public:
    4243    static PassOwnPtr<InputType> create(HTMLInputElement*);
     
    4445private:
    4546    ColorInputType(HTMLInputElement* element) : InputType(element) { }
     47    virtual ~ColorInputType();
    4648    virtual bool isColorControl() const;
    4749    virtual const AtomicString& formControlType() const;
     
    4951    virtual String fallbackValue();
    5052    virtual String sanitizeValue(const String&);
     53    virtual Color valueAsColor() const;
     54    virtual void setValueAsColor(const Color&) const;
    5155    virtual void createShadowSubtree();
    5256    virtual void valueChanged();
     57    virtual void handleClickEvent(MouseEvent*);
     58    virtual void handleDOMActivateEvent(Event*);
     59    virtual void detach();
     60
     61    // ColorChooserClient implementation.
     62    virtual void colorSelected(const Color&);
     63    virtual void closeColorChooserIfClientIsInDocument(Document*);
    5364
    5465    void updateColorSwatch();
    5566    HTMLElement* shadowColorSwatch() const;
     67    void closeColorChooserIfCurrentClient() const;
    5668};
    5769
  • trunk/Source/WebCore/html/FileInputType.cpp

    r90438 r92477  
    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

    r90101 r92477  
    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

    r92088 r92477  
    881881    HTMLTextFormControlElement::detach();
    882882    setFormControlValueMatchesRenderer(false);
     883    m_inputType->detach();
    883884}
    884885
  • trunk/Source/WebCore/html/InputType.cpp

    r91353 r92477  
    4949#include "MonthInputType.h"
    5050#include "NumberInputType.h"
     51#include "Page.h"
    5152#include "PasswordInputType.h"
    5253#include "RadioInputType.h"
     
    396397}
    397398
     399Chrome* InputType::chrome() const
     400{
     401    if (Page* page = element()->document()->page())
     402        return page->chrome();
     403    return 0;
     404}
     405
    398406bool InputType::canSetStringValue() const
    399407{
     
    421429
    422430void InputType::attach()
     431{
     432}
     433
     434void InputType::detach()
    423435{
    424436}
  • trunk/Source/WebCore/html/InputType.h

    r91353 r92477  
    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;
     
    206208    virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) const;
    207209    virtual void attach();
     210    virtual void detach();
    208211    virtual void minOrMaxAttributeChanged();
    209212    virtual void altAttributeChanged();
     
    261264    // We can't make this a static const data member because VC++ doesn't like it.
    262265    static double defaultStepBase() { return 0.0; }
     266    Chrome* chrome() const;
    263267
    264268private:
  • trunk/Source/WebCore/loader/EmptyClients.h

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

    r92453 r92477  
    101101#include <wtf/text/WTFString.h>
    102102
     103#if ENABLE(INPUT_COLOR)
     104#include "ColorChooser.h"
     105#endif
     106
    103107#if ENABLE(SHARED_WORKERS)
    104108#include "SharedWorkerRepository.h"
     
    18161820    if (m_frame->view())
    18171821        m_frame->view()->scrollAnimator()->cancelAnimations();
     1822
     1823#if ENABLE(INPUT_COLOR)
     1824    if (m_frame->document())
     1825        ColorChooser::chooser()->closeColorChooserIfClientIsInDocument(m_frame->document());
     1826#endif
    18181827
    18191828    m_client->setCopiesOnScroll();
  • trunk/Source/WebCore/page/Chrome.cpp

    r91097 r92477  
    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

    r91097 r92477  
    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

    r91097 r92477  
    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.