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)
29926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "ColorSuggestionPicker.h"
30926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "PickerCommon.h"
311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/FrameView.h"
3219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "platform/ColorChooserClient.h"
331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/IntRect.h"
34f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebColorChooser.h"
35f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ChromeClientImpl.h"
36f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebViewImpl.h"
37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)using namespace WebCore;
39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
41926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// Keep in sync with Actions in colorSuggestionPicker.js.
43926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)enum ColorPickerPopupAction {
44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ColorPickerPopupActionChooseOtherColor = -2,
45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ColorPickerPopupActionCancel = -1,
46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ColorPickerPopupActionSetValue = 0
47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
48926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
496f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochColorChooserPopupUIController::ColorChooserPopupUIController(WebCore::LocalFrame* frame, ChromeClientImpl* chromeClient, ColorChooserClient* client)
506f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    : ColorChooserUIController(frame, client)
51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_chromeClient(chromeClient)
52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_client(client)
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_popup(0)
541e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    , m_locale(Locale::defaultLocale())
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)ColorChooserPopupUIController::~ColorChooserPopupUIController()
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ColorChooserPopupUIController::openUI()
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_client->shouldShowSuggestions())
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        openPopup();
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        openColorChooser();
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ColorChooserPopupUIController::endChooser()
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_chooser)
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_chooser->endChooser();
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_popup)
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        closePopup();
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)IntSize ColorChooserPopupUIController::contentSize()
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return IntSize(0, 0);
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void ColorChooserPopupUIController::writeDocument(SharedBuffer* data)
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
8551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    Vector<ColorSuggestion> suggestions = m_client->suggestions();
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Vector<String> suggestionValues;
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (unsigned i = 0; i < suggestions.size(); i++)
8851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        suggestionValues.append(suggestions[i].color.serialized());
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    IntRect anchorRectInScreen = m_chromeClient->rootViewToScreen(m_client->elementRectRelativeToRootView());
90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
9109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    PagePopupClient::addString("<!DOCTYPE html><head><meta charset='UTF-8'><style>\n", data);
9209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    data->append(pickerCommonCss, sizeof(pickerCommonCss));
9309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    data->append(colorSuggestionPickerCss, sizeof(colorSuggestionPickerCss));
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    PagePopupClient::addString("</style></head><body><div id=main>Loading...</div><script>\n"
9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        "window.dialogArguments = {\n", data);
9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    PagePopupClient::addProperty("values", suggestionValues, data);
9709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    PagePopupClient::addProperty("otherColorLabel", locale().queryString(WebLocalizedString::OtherColorLabel), data);
9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    addProperty("anchorRectInScreen", anchorRectInScreen, data);
9909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    PagePopupClient::addString("};\n", data);
10009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    data->append(pickerCommonJs, sizeof(pickerCommonJs));
10109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    data->append(colorSuggestionPickerJs, sizeof(colorSuggestionPickerJs));
10209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    PagePopupClient::addString("</script></body>\n", data);
103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Locale& ColorChooserPopupUIController::locale()
106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
107bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return m_locale;
108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ColorChooserPopupUIController::setValueAndClosePopup(int numValue, const String& stringValue)
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(m_popup);
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(m_client);
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (numValue == ColorPickerPopupActionSetValue)
11509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        setValue(stringValue);
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (numValue == ColorPickerPopupActionChooseOtherColor)
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        openColorChooser();
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    closePopup();
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ColorChooserPopupUIController::setValue(const String& value)
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(m_client);
12409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Color color;
12509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool success = color.setFromString(value);
12609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT_UNUSED(success, success);
12709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_client->didChooseColor(color);
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ColorChooserPopupUIController::didClosePopup()
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_popup = 0;
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_chooser)
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        didEndChooser();
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ColorChooserPopupUIController::openPopup()
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!m_popup);
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_popup = m_chromeClient->openPagePopup(this, m_client->elementRectRelativeToRootView());
143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ColorChooserPopupUIController::closePopup()
146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_popup)
148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_chromeClient->closePagePopup(m_popup);
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
153