1/* 2 * Copyright (C) 2012 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "web/ColorChooserPopupUIController.h" 28 29#include "core/frame/FrameView.h" 30#include "core/html/forms/ColorChooserClient.h" 31#include "core/page/PagePopup.h" 32#include "platform/geometry/IntRect.h" 33#include "public/platform/Platform.h" 34#include "public/web/WebColorChooser.h" 35#include "web/ChromeClientImpl.h" 36#include "web/WebViewImpl.h" 37 38namespace blink { 39 40// Keep in sync with Actions in colorSuggestionPicker.js. 41enum ColorPickerPopupAction { 42 ColorPickerPopupActionChooseOtherColor = -2, 43 ColorPickerPopupActionCancel = -1, 44 ColorPickerPopupActionSetValue = 0 45}; 46 47ColorChooserPopupUIController::ColorChooserPopupUIController(LocalFrame* frame, ChromeClientImpl* chromeClient, ColorChooserClient* client) 48 : ColorChooserUIController(frame, client) 49 , m_chromeClient(chromeClient) 50 , m_client(client) 51 , m_popup(0) 52 , m_locale(Locale::defaultLocale()) 53{ 54} 55 56ColorChooserPopupUIController::~ColorChooserPopupUIController() 57{ 58} 59 60void ColorChooserPopupUIController::openUI() 61{ 62 if (m_client->shouldShowSuggestions()) 63 openPopup(); 64 else 65 openColorChooser(); 66} 67 68void ColorChooserPopupUIController::endChooser() 69{ 70 if (m_chooser) 71 m_chooser->endChooser(); 72 if (m_popup) 73 closePopup(); 74} 75 76AXObject* ColorChooserPopupUIController::rootAXObject() 77{ 78 return m_popup ? m_popup->rootAXObject() : 0; 79} 80 81IntSize ColorChooserPopupUIController::contentSize() 82{ 83 return IntSize(0, 0); 84} 85 86void ColorChooserPopupUIController::writeDocument(SharedBuffer* data) 87{ 88 Vector<ColorSuggestion> suggestions = m_client->suggestions(); 89 Vector<String> suggestionValues; 90 for (unsigned i = 0; i < suggestions.size(); i++) 91 suggestionValues.append(suggestions[i].color.serialized()); 92 IntRect anchorRectInScreen = m_chromeClient->rootViewToScreen(m_client->elementRectRelativeToRootView()); 93 94 PagePopupClient::addString("<!DOCTYPE html><head><meta charset='UTF-8'><style>\n", data); 95 data->append(Platform::current()->loadResource("pickerCommon.css")); 96 data->append(Platform::current()->loadResource("colorSuggestionPicker.css")); 97 PagePopupClient::addString("</style></head><body><div id=main>Loading...</div><script>\n" 98 "window.dialogArguments = {\n", data); 99 PagePopupClient::addProperty("values", suggestionValues, data); 100 PagePopupClient::addProperty("otherColorLabel", locale().queryString(WebLocalizedString::OtherColorLabel), data); 101 addProperty("anchorRectInScreen", anchorRectInScreen, data); 102 PagePopupClient::addString("};\n", data); 103 data->append(Platform::current()->loadResource("pickerCommon.js")); 104 data->append(Platform::current()->loadResource("colorSuggestionPicker.js")); 105 PagePopupClient::addString("</script></body>\n", data); 106} 107 108Locale& ColorChooserPopupUIController::locale() 109{ 110 return m_locale; 111} 112 113void ColorChooserPopupUIController::setValueAndClosePopup(int numValue, const String& stringValue) 114{ 115 ASSERT(m_popup); 116 ASSERT(m_client); 117 if (numValue == ColorPickerPopupActionSetValue) 118 setValue(stringValue); 119 if (numValue == ColorPickerPopupActionChooseOtherColor) 120 openColorChooser(); 121 closePopup(); 122} 123 124void ColorChooserPopupUIController::setValue(const String& value) 125{ 126 ASSERT(m_client); 127 Color color; 128 bool success = color.setFromString(value); 129 ASSERT_UNUSED(success, success); 130 m_client->didChooseColor(color); 131} 132 133void ColorChooserPopupUIController::didClosePopup() 134{ 135 m_popup = 0; 136 137 if (!m_chooser) 138 didEndChooser(); 139} 140 141Element& ColorChooserPopupUIController::ownerElement() 142{ 143 return m_client->ownerElement(); 144} 145 146void ColorChooserPopupUIController::openPopup() 147{ 148 ASSERT(!m_popup); 149 m_popup = m_chromeClient->openPagePopup(this, m_client->elementRectRelativeToRootView()); 150} 151 152void ColorChooserPopupUIController::closePopup() 153{ 154 if (!m_popup) 155 return; 156 m_chromeClient->closePagePopup(m_popup); 157} 158 159} // namespace blink 160