Changeset 92592 in webkit
- Timestamp:
- Aug 8, 2011 5:44:33 AM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 added
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r92589 r92592 1 2011-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 1 57 2011-08-08 Shinya Kawanaka <shinyak@google.com> 2 58 -
trunk/Source/WebCore/WebCore.exp.in
r92587 r92592 1940 1940 __ZN7WebCore14ResourceHandle12releaseProxyEv 1941 1941 #endif 1942 1943 #if ENABLE(INPUT_COLOR) 1944 __ZN7WebCore12ColorChooser7chooserEv 1945 __ZNK7WebCore12ColorChooser13colorSelectedERKNS_5ColorE 1946 #endif -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r92582 r92592 5332 5332 C105DA620F3AA68F001DD44F /* TextEncodingDetectorICU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C105DA610F3AA68F001DD44F /* TextEncodingDetectorICU.cpp */; }; 5333 5333 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, ); }; }; 5334 5336 C50B561612119D23008B46E0 /* GroupSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C50B561412119D23008B46E0 /* GroupSettings.cpp */; }; 5335 5337 C50B561712119D23008B46E0 /* GroupSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = C50B561512119D23008B46E0 /* GroupSettings.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 12038 12040 C105DA610F3AA68F001DD44F /* TextEncodingDetectorICU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextEncodingDetectorICU.cpp; sourceTree = "<group>"; }; 12039 12041 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>"; }; 12040 12044 C50B561412119D23008B46E0 /* GroupSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GroupSettings.cpp; sourceTree = "<group>"; }; 12041 12045 C50B561512119D23008B46E0 /* GroupSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupSettings.h; sourceTree = "<group>"; }; … … 19026 19030 89D08D9E12228451001241DF /* AsyncFileSystemCallbacks.h */, 19027 19031 51E1ECB10C91C55600DC255B /* AutodrainedPool.h */, 19032 C330A22013EC196B0000B45B /* ColorChooser.cpp */, 19033 C330A22113EC196B0000B45B /* ColorChooser.h */, 19028 19034 BCC8CFCA0986CD2400140BF2 /* ColorData.gperf */, 19029 19035 41D015C90F4B5C71004A662F /* ContentType.cpp */, … … 20522 20528 93C442000F813AE100C1A634 /* CollectionType.h in Headers */, 20523 20529 B27535670B053814002CE64F /* Color.h in Headers */, 20530 C330A22313EC196B0000B45B /* ColorChooser.h in Headers */, 20524 20531 B22279630D00BF220071B782 /* ColorDistance.h in Headers */, 20525 20532 F55B3DB41251F12D003EF269 /* ColorInputType.h in Headers */, … … 23817 23824 B27535660B053814002CE64F /* Color.cpp in Sources */, 23818 23825 0FCF33240F2B9715004B6795 /* ColorCG.cpp in Sources */, 23826 C330A22213EC196B0000B45B /* ColorChooser.cpp in Sources */, 23819 23827 1ABA76C911D20E47004C201C /* ColorData.cpp in Sources */, 23820 23828 B22279620D00BF220071B782 /* ColorDistance.cpp in Sources */, -
trunk/Source/WebCore/html/ColorInputType.cpp
r92533 r92592 32 32 #include "ColorInputType.h" 33 33 34 #include "Chrome.h" 34 35 #include "Color.h" 35 36 #include "HTMLDivElement.h" 36 37 #include "HTMLInputElement.h" 38 #include "MouseEvent.h" 39 #include "ScriptController.h" 37 40 #include "ShadowRoot.h" 38 41 #include <wtf/PassOwnPtr.h> … … 62 65 } 63 66 67 ColorInputType::~ColorInputType() 68 { 69 closeColorChooserIfCurrentClient(); 70 } 71 64 72 bool ColorInputType::isColorControl() const 65 73 { … … 91 99 92 100 return proposedValue.lower(); 101 } 102 103 Color ColorInputType::valueAsColor() const 104 { 105 return Color(element()->value()); 106 } 107 108 void ColorInputType::setValueAsColor(const Color& color) const 109 { 110 element()->setValue(color.serialized(), true); 93 111 } 94 112 … … 112 130 { 113 131 updateColorSwatch(); 132 if (ColorChooser::chooser()->client() == this) { 133 if (Chrome* chrome = this->chrome()) 134 chrome->setSelectedColorInColorChooser(valueAsColor()); 135 } 136 } 137 138 void 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 153 void 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 168 void ColorInputType::detach() 169 { 170 closeColorChooserIfCurrentClient(); 171 } 172 173 void ColorInputType::colorSelected(const Color& color) 174 { 175 if (element()->disabled() || element()->readOnly()) 176 return; 177 setValueAsColor(color); 178 } 179 180 bool ColorInputType::isColorInputType() const 181 { 182 return true; 114 183 } 115 184 … … 130 199 } 131 200 201 void ColorInputType::closeColorChooserIfCurrentClient() const 202 { 203 if (ColorChooser::chooser()->client() != this) 204 return; 205 if (Chrome* chrome = this->chrome()) 206 chrome->closeColorChooser(); 207 } 208 132 209 } // namespace WebCore 133 210 -
trunk/Source/WebCore/html/ColorInputType.h
r92533 r92592 32 32 #define ColorInputType_h 33 33 34 #include "BaseButtonInputType.h" 34 #include "ColorChooser.h" 35 #include "InputType.h" 35 36 36 37 #if ENABLE(INPUT_COLOR) … … 38 39 namespace WebCore { 39 40 40 class ColorInputType : public InputType {41 class ColorInputType : public InputType, public ColorChooserClient { 41 42 public: 42 43 static PassOwnPtr<InputType> create(HTMLInputElement*); 44 virtual ~ColorInputType(); 45 46 void closeColorChooserIfCurrentClient() const; 43 47 44 48 private: … … 49 53 virtual String fallbackValue(); 50 54 virtual String sanitizeValue(const String&); 55 virtual Color valueAsColor() const; 56 virtual void setValueAsColor(const Color&) const; 51 57 virtual void createShadowSubtree(); 52 58 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; 53 66 54 67 void updateColorSwatch(); -
trunk/Source/WebCore/html/FileInputType.cpp
r92533 r92592 34 34 #include "Icon.h" 35 35 #include "LocalizedStrings.h" 36 #include "Page.h"37 36 #include "RenderFileUploadControl.h" 38 37 #include "ScriptController.h" … … 334 333 } 335 334 336 Chrome* FileInputType::chrome() const337 {338 if (Page* page = element()->document()->page())339 return page->chrome();340 return 0;341 }342 343 335 void FileInputType::receiveDroppedFiles(const Vector<String>& paths) 344 336 { -
trunk/Source/WebCore/html/FileInputType.h
r92533 r92592 40 40 namespace WebCore { 41 41 42 class Chrome;43 42 class FileList; 44 43 … … 78 77 #endif 79 78 void requestIcon(const Vector<String>&); 80 Chrome* chrome() const;81 79 82 80 RefPtr<FileList> m_fileList; -
trunk/Source/WebCore/html/HTMLInputElement.cpp
r92589 r92592 888 888 HTMLTextFormControlElement::detach(); 889 889 setFormControlValueMatchesRenderer(false); 890 m_inputType->detach(); 890 891 } 891 892 -
trunk/Source/WebCore/html/InputType.cpp
r92589 r92592 49 49 #include "MonthInputType.h" 50 50 #include "NumberInputType.h" 51 #include "Page.h" 51 52 #include "PasswordInputType.h" 52 53 #include "RadioInputType.h" … … 402 403 } 403 404 405 Chrome* InputType::chrome() const 406 { 407 if (Page* page = element()->document()->page()) 408 return page->chrome(); 409 return 0; 410 } 411 404 412 bool InputType::canSetStringValue() const 405 413 { … … 427 435 428 436 void InputType::attach() 437 { 438 } 439 440 void InputType::detach() 429 441 { 430 442 } -
trunk/Source/WebCore/html/InputType.h
r92589 r92592 42 42 43 43 class BeforeTextInsertedEvent; 44 class Chrome; 45 class Color; 44 46 class DateComponents; 45 47 class Event; … … 92 94 #if ENABLE(INPUT_COLOR) 93 95 virtual bool isColorControl() const; 94 #endif // ENABLE(INPUT_COLOR)96 #endif 95 97 virtual bool isCheckbox() const; 96 98 virtual bool isEmailField() const; … … 207 209 virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) const; 208 210 virtual void attach(); 211 virtual void detach(); 209 212 virtual void minOrMaxAttributeChanged(); 210 213 virtual void stepAttributeChanged(); … … 263 266 // We can't make this a static const data member because VC++ doesn't like it. 264 267 static double defaultStepBase() { return 0.0; } 268 Chrome* chrome() const; 265 269 266 270 private: -
trunk/Source/WebCore/loader/EmptyClients.h
r92533 r92592 196 196 #endif 197 197 198 #if ENABLE(INPUT_COLOR) 199 void openColorChooser(ColorChooser*, const Color&) { } 200 void closeColorChooser() { } 201 void setSelectedColorInColorChooser(const Color&) { } 202 #endif 203 198 204 virtual void runOpenPanel(Frame*, PassRefPtr<FileChooser>) { } 199 205 virtual void loadIconForFiles(const Vector<String>&, FileIconLoader*) { } -
trunk/Source/WebCore/loader/FrameLoader.cpp
r92533 r92592 101 101 #include <wtf/text/WTFString.h> 102 102 103 #if ENABLE(INPUT_COLOR) 104 #include "ColorChooser.h" 105 #include "ColorInputType.h" 106 #endif 107 103 108 #if ENABLE(SHARED_WORKERS) 104 109 #include "SharedWorkerRepository.h" … … 1816 1821 if (m_frame->view()) 1817 1822 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 1818 1829 1819 1830 m_client->setCopiesOnScroll(); -
trunk/Source/WebCore/page/Chrome.cpp
r92533 r92592 53 53 #endif 54 54 55 #if ENABLE(INPUT_COLOR) 56 #include "ColorChooser.h" 57 #endif 58 55 59 namespace WebCore { 56 60 … … 468 472 #endif 469 473 474 #if ENABLE(INPUT_COLOR) 475 void Chrome::openColorChooser(ColorChooser* colorChooser, const Color& initialColor) 476 { 477 m_client->openColorChooser(colorChooser, initialColor); 478 } 479 480 void Chrome::closeColorChooser() 481 { 482 m_client->closeColorChooser(); 483 } 484 485 void Chrome::setSelectedColorInColorChooser(const Color& color) 486 { 487 m_client->setSelectedColorInColorChooser(color); 488 } 489 #endif 490 470 491 void Chrome::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> fileChooser) 471 492 { -
trunk/Source/WebCore/page/Chrome.h
r92533 r92592 37 37 38 38 class ChromeClient; 39 #if ENABLE(INPUT_COLOR) 40 class ColorChooser; 41 #endif 39 42 class FileChooser; 40 43 class FileIconLoader; … … 155 158 void cancelGeolocationPermissionRequestForFrame(Frame*, Geolocation*); 156 159 160 #if ENABLE(INPUT_COLOR) 161 void openColorChooser(ColorChooser*, const Color&); 162 void closeColorChooser(); 163 void setSelectedColorInColorChooser(const Color&); 164 #endif 165 157 166 void runOpenPanel(Frame*, PassRefPtr<FileChooser>); 158 167 void loadIconForFiles(const Vector<String>&, FileIconLoader*); -
trunk/Source/WebCore/page/ChromeClient.h
r92533 r92592 72 72 #endif 73 73 74 #if ENABLE(INPUT_COLOR) 75 class ColorChooser; 76 #endif 77 74 78 #if ENABLE(NOTIFICATIONS) 75 79 class NotificationPresenter; … … 231 235 virtual void requestGeolocationPermissionForFrame(Frame*, Geolocation*) = 0; 232 236 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 233 243 234 244 virtual void runOpenPanel(Frame*, PassRefPtr<FileChooser>) = 0;
Note: See TracChangeset
for help on using the changeset viewer.