Changeset 92477 in webkit
- Timestamp:
- Aug 5, 2011 6:45:21 AM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 added
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r92476 r92477 1 2011-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 1 62 2011-08-05 Yury Semikhatsky <yurys@chromium.org> 2 63 -
trunk/Source/WebCore/WebCore.exp.in
r92438 r92477 1946 1946 __ZN7WebCore14ResourceHandle12releaseProxyEv 1947 1947 #endif 1948 1949 #if ENABLE(INPUT_COLOR) 1950 __ZN7WebCore12ColorChooser7chooserEv 1951 __ZNK7WebCore12ColorChooser13colorSelectedERKNS_5ColorE 1952 #endif -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r92475 r92477 5334 5334 C105DA620F3AA68F001DD44F /* TextEncodingDetectorICU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C105DA610F3AA68F001DD44F /* TextEncodingDetectorICU.cpp */; }; 5335 5335 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, ); }; }; 5336 5338 C50B561612119D23008B46E0 /* GroupSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C50B561412119D23008B46E0 /* GroupSettings.cpp */; }; 5337 5339 C50B561712119D23008B46E0 /* GroupSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = C50B561512119D23008B46E0 /* GroupSettings.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 12042 12044 C105DA610F3AA68F001DD44F /* TextEncodingDetectorICU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextEncodingDetectorICU.cpp; sourceTree = "<group>"; }; 12043 12045 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>"; }; 12044 12048 C50B561412119D23008B46E0 /* GroupSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GroupSettings.cpp; sourceTree = "<group>"; }; 12045 12049 C50B561512119D23008B46E0 /* GroupSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupSettings.h; sourceTree = "<group>"; }; … … 19033 19037 89D08D9E12228451001241DF /* AsyncFileSystemCallbacks.h */, 19034 19038 51E1ECB10C91C55600DC255B /* AutodrainedPool.h */, 19039 C330A22013EC196B0000B45B /* ColorChooser.cpp */, 19040 C330A22113EC196B0000B45B /* ColorChooser.h */, 19035 19041 BCC8CFCA0986CD2400140BF2 /* ColorData.gperf */, 19036 19042 41D015C90F4B5C71004A662F /* ContentType.cpp */, … … 20529 20535 93C442000F813AE100C1A634 /* CollectionType.h in Headers */, 20530 20536 B27535670B053814002CE64F /* Color.h in Headers */, 20537 C330A22313EC196B0000B45B /* ColorChooser.h in Headers */, 20531 20538 B22279630D00BF220071B782 /* ColorDistance.h in Headers */, 20532 20539 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
r91982 r92477 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 void ColorInputType::closeColorChooserIfClientIsInDocument(Document* document) 181 { 182 if (element()->document() == document) 183 closeColorChooserIfCurrentClient(); 114 184 } 115 185 … … 130 200 } 131 201 202 void ColorInputType::closeColorChooserIfCurrentClient() 203 { 204 if (ColorChooser::chooser()->client() == this) { 205 if (Chrome* chrome = this->chrome()) 206 chrome->closeColorChooser(); 207 } 208 } 209 132 210 } // namespace WebCore 133 211 -
trunk/Source/WebCore/html/ColorInputType.h
r87372 r92477 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, private ColorChooserClient { 41 42 public: 42 43 static PassOwnPtr<InputType> create(HTMLInputElement*); … … 44 45 private: 45 46 ColorInputType(HTMLInputElement* element) : InputType(element) { } 47 virtual ~ColorInputType(); 46 48 virtual bool isColorControl() const; 47 49 virtual const AtomicString& formControlType() const; … … 49 51 virtual String fallbackValue(); 50 52 virtual String sanitizeValue(const String&); 53 virtual Color valueAsColor() const; 54 virtual void setValueAsColor(const Color&) const; 51 55 virtual void createShadowSubtree(); 52 56 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*); 53 64 54 65 void updateColorSwatch(); 55 66 HTMLElement* shadowColorSwatch() const; 67 void closeColorChooserIfCurrentClient() const; 56 68 }; 57 69 -
trunk/Source/WebCore/html/FileInputType.cpp
r90438 r92477 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
r90101 r92477 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
r92088 r92477 881 881 HTMLTextFormControlElement::detach(); 882 882 setFormControlValueMatchesRenderer(false); 883 m_inputType->detach(); 883 884 } 884 885 -
trunk/Source/WebCore/html/InputType.cpp
r91353 r92477 49 49 #include "MonthInputType.h" 50 50 #include "NumberInputType.h" 51 #include "Page.h" 51 52 #include "PasswordInputType.h" 52 53 #include "RadioInputType.h" … … 396 397 } 397 398 399 Chrome* InputType::chrome() const 400 { 401 if (Page* page = element()->document()->page()) 402 return page->chrome(); 403 return 0; 404 } 405 398 406 bool InputType::canSetStringValue() const 399 407 { … … 421 429 422 430 void InputType::attach() 431 { 432 } 433 434 void InputType::detach() 423 435 { 424 436 } -
trunk/Source/WebCore/html/InputType.h
r91353 r92477 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; … … 206 208 virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) const; 207 209 virtual void attach(); 210 virtual void detach(); 208 211 virtual void minOrMaxAttributeChanged(); 209 212 virtual void altAttributeChanged(); … … 261 264 // We can't make this a static const data member because VC++ doesn't like it. 262 265 static double defaultStepBase() { return 0.0; } 266 Chrome* chrome() const; 263 267 264 268 private: -
trunk/Source/WebCore/loader/EmptyClients.h
r92265 r92477 197 197 #endif 198 198 199 #if ENABLE(INPUT_COLOR) 200 void openColorChooser(ColorChooser*, const Color&) { } 201 void closeColorChooser() { } 202 void setSelectedColorInColorChooser(const Color&) { } 203 #endif 204 199 205 virtual void runOpenPanel(Frame*, PassRefPtr<FileChooser>) { } 200 206 virtual void loadIconForFiles(const Vector<String>&, FileIconLoader*) { } -
trunk/Source/WebCore/loader/FrameLoader.cpp
r92453 r92477 101 101 #include <wtf/text/WTFString.h> 102 102 103 #if ENABLE(INPUT_COLOR) 104 #include "ColorChooser.h" 105 #endif 106 103 107 #if ENABLE(SHARED_WORKERS) 104 108 #include "SharedWorkerRepository.h" … … 1816 1820 if (m_frame->view()) 1817 1821 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 1818 1827 1819 1828 m_client->setCopiesOnScroll(); -
trunk/Source/WebCore/page/Chrome.cpp
r91097 r92477 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
r91097 r92477 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
r91097 r92477 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.