Home | History | Annotate | Download | only in web
      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 
     38 namespace blink {
     39 
     40 // Keep in sync with Actions in colorSuggestionPicker.js.
     41 enum ColorPickerPopupAction {
     42     ColorPickerPopupActionChooseOtherColor = -2,
     43     ColorPickerPopupActionCancel = -1,
     44     ColorPickerPopupActionSetValue = 0
     45 };
     46 
     47 ColorChooserPopupUIController::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 
     56 ColorChooserPopupUIController::~ColorChooserPopupUIController()
     57 {
     58 }
     59 
     60 void ColorChooserPopupUIController::openUI()
     61 {
     62     if (m_client->shouldShowSuggestions())
     63         openPopup();
     64     else
     65         openColorChooser();
     66 }
     67 
     68 void ColorChooserPopupUIController::endChooser()
     69 {
     70     if (m_chooser)
     71         m_chooser->endChooser();
     72     if (m_popup)
     73         closePopup();
     74 }
     75 
     76 AXObject* ColorChooserPopupUIController::rootAXObject()
     77 {
     78     return m_popup ? m_popup->rootAXObject() : 0;
     79 }
     80 
     81 IntSize ColorChooserPopupUIController::contentSize()
     82 {
     83     return IntSize(0, 0);
     84 }
     85 
     86 void 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 
    108 Locale& ColorChooserPopupUIController::locale()
    109 {
    110     return m_locale;
    111 }
    112 
    113 void 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 
    124 void 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 
    133 void ColorChooserPopupUIController::didClosePopup()
    134 {
    135     m_popup = 0;
    136 
    137     if (!m_chooser)
    138         didEndChooser();
    139 }
    140 
    141 Element& ColorChooserPopupUIController::ownerElement()
    142 {
    143     return m_client->ownerElement();
    144 }
    145 
    146 void ColorChooserPopupUIController::openPopup()
    147 {
    148     ASSERT(!m_popup);
    149     m_popup = m_chromeClient->openPagePopup(this, m_client->elementRectRelativeToRootView());
    150 }
    151 
    152 void ColorChooserPopupUIController::closePopup()
    153 {
    154     if (!m_popup)
    155         return;
    156     m_chromeClient->closePagePopup(m_popup);
    157 }
    158 
    159 } // namespace blink
    160