1926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/*
2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved.
3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
4926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
5926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * modification, are permitted provided that the following conditions
6926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * are met:
7926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
8926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
9926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
10926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
11926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
12926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     documentation and/or other materials provided with the distribution.
13926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
14926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
25926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
26926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "config.h"
27f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ColorChooserPopupUIController.h"
28926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/FrameView.h"
307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/html/forms/ColorChooserClient.h"
317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/page/PagePopup.h"
321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/IntRect.h"
33197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "public/platform/Platform.h"
34f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebColorChooser.h"
35f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ChromeClientImpl.h"
36f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebViewImpl.h"
37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// Keep in sync with Actions in colorSuggestionPicker.js.
41926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)enum ColorPickerPopupAction {
42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ColorPickerPopupActionChooseOtherColor = -2,
43926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ColorPickerPopupActionCancel = -1,
44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ColorPickerPopupActionSetValue = 0
45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
47e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)ColorChooserPopupUIController::ColorChooserPopupUIController(LocalFrame* frame, ChromeClientImpl* chromeClient, ColorChooserClient* client)
486f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    : ColorChooserUIController(frame, client)
49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_chromeClient(chromeClient)
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_client(client)
51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_popup(0)
521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    , m_locale(Locale::defaultLocale())
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)ColorChooserPopupUIController::~ColorChooserPopupUIController()
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ColorChooserPopupUIController::openUI()
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_client->shouldShowSuggestions())
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        openPopup();
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        openColorChooser();
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ColorChooserPopupUIController::endChooser()
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_chooser)
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_chooser->endChooser();
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_popup)
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        closePopup();
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciAXObject* ColorChooserPopupUIController::rootAXObject()
777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_popup ? m_popup->rootAXObject() : 0;
797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)IntSize ColorChooserPopupUIController::contentSize()
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return IntSize(0, 0);
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void ColorChooserPopupUIController::writeDocument(SharedBuffer* data)
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
8851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    Vector<ColorSuggestion> suggestions = m_client->suggestions();
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Vector<String> suggestionValues;
90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (unsigned i = 0; i < suggestions.size(); i++)
9151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        suggestionValues.append(suggestions[i].color.serialized());
92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    IntRect anchorRectInScreen = m_chromeClient->rootViewToScreen(m_client->elementRectRelativeToRootView());
93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
9409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    PagePopupClient::addString("<!DOCTYPE html><head><meta charset='UTF-8'><style>\n", data);
95e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    data->append(Platform::current()->loadResource("pickerCommon.css"));
96e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    data->append(Platform::current()->loadResource("colorSuggestionPicker.css"));
97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    PagePopupClient::addString("</style></head><body><div id=main>Loading...</div><script>\n"
9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        "window.dialogArguments = {\n", data);
9909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    PagePopupClient::addProperty("values", suggestionValues, data);
10009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    PagePopupClient::addProperty("otherColorLabel", locale().queryString(WebLocalizedString::OtherColorLabel), data);
10109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    addProperty("anchorRectInScreen", anchorRectInScreen, data);
10209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    PagePopupClient::addString("};\n", data);
103e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    data->append(Platform::current()->loadResource("pickerCommon.js"));
104e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    data->append(Platform::current()->loadResource("colorSuggestionPicker.js"));
10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    PagePopupClient::addString("</script></body>\n", data);
106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Locale& ColorChooserPopupUIController::locale()
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
110bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return m_locale;
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ColorChooserPopupUIController::setValueAndClosePopup(int numValue, const String& stringValue)
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(m_popup);
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(m_client);
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (numValue == ColorPickerPopupActionSetValue)
11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        setValue(stringValue);
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (numValue == ColorPickerPopupActionChooseOtherColor)
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        openColorChooser();
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    closePopup();
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ColorChooserPopupUIController::setValue(const String& value)
125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(m_client);
12709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Color color;
12809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool success = color.setFromString(value);
12909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT_UNUSED(success, success);
13009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_client->didChooseColor(color);
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ColorChooserPopupUIController::didClosePopup()
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_popup = 0;
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_chooser)
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        didEndChooser();
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciElement& ColorChooserPopupUIController::ownerElement()
1427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_client->ownerElement();
1447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ColorChooserPopupUIController::openPopup()
147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!m_popup);
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_popup = m_chromeClient->openPagePopup(this, m_client->elementRectRelativeToRootView());
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ColorChooserPopupUIController::closePopup()
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_popup)
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_chromeClient->closePagePopup(m_popup);
157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
159e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)} // namespace blink
160