15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
33f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ChromeClientImpl.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptController.h"
3676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/HTMLNames.h"
37bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/accessibility/AXObject.h"
38e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/accessibility/AXObjectCache.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
40bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/dom/DocumentFullscreen.h"
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Node.h"
4209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/events/KeyboardEvent.h"
4309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/events/MouseEvent.h"
4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/events/WheelEvent.h"
45f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "core/frame/Console.h"
46f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "core/frame/FrameView.h"
47f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "core/frame/Settings.h"
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h"
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/DocumentLoader.h"
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoadRequest.h"
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h"
5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/PagePopupDriver.h"
53e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/page/WindowFeatures.h"
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/HitTestResult.h"
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderWidget.h"
5619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "platform/ColorChooser.h"
5719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "platform/ColorChooserClient.h"
58a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/Cursor.h"
5919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "platform/DateTimeChooser.h"
601e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/FileChooser.h"
6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "platform/NotImplemented.h"
62bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/PlatformScreen.h"
6376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h"
6419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "platform/exported/WrappedResourceRequest.h"
651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatRect.h"
661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/IntRect.h"
67a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsLayer.h"
6851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SecurityOrigin.h"
695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/Platform.h"
7051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "public/platform/WebCursorInfo.h"
715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebRect.h"
725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebURLRequest.h"
73f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebAXObject.h"
74f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebAutofillClient.h"
75f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebColorChooser.h"
76f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebColorSuggestion.h"
77f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebConsoleMessage.h"
78f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebFrameClient.h"
79f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebInputElement.h"
80f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebInputEvent.h"
81f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebKit.h"
82f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebNode.h"
83f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPlugin.h"
84f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPopupMenuInfo.h"
85f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebSettings.h"
86f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebTextDirection.h"
87a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "public/web/WebTouchAction.h"
88f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebUserGestureIndicator.h"
89f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebUserGestureToken.h"
90f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebViewClient.h"
91f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebWindowFeatures.h"
92f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ColorChooserPopupUIController.h"
93f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ColorChooserUIController.h"
94f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/DateTimeChooserImpl.h"
95f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ExternalDateTimeChooser.h"
96f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ExternalPopupMenu.h"
97f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/PopupMenuChromium.h"
98f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebFileChooserCompletionImpl.h"
99f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebInputEventConversion.h"
100f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebLocalFrameImpl.h"
101f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPluginContainerImpl.h"
102f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPopupMenuImpl.h"
103f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebSettingsImpl.h"
104f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebViewImpl.h"
105591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/CString.h"
106591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/StringBuilder.h"
107591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/StringConcatenate.h"
108591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/unicode/CharacterNames.h"
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WebCore;
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)// Converts a WebCore::AXObjectCache::AXNotification to a blink::WebAXEvent
115c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)static WebAXEvent toWebAXEvent(AXObjectCache::AXNotification notification)
116c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
117c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    // These enums have the same values; enforced in AssertMatchingEnums.cpp.
118c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return static_cast<WebAXEvent>(notification);
119c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
120c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ChromeClientImpl::ChromeClientImpl(WebViewImpl* webView)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_webView(webView)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_toolbarsVisible(true)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_statusbarVisible(true)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_scrollbarsVisible(true)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_menubarVisible(true)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_resizable(true)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_pagePopupDriver(webView)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ChromeClientImpl::~ChromeClientImpl()
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void* ChromeClientImpl::webView() const
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<void*>(m_webView);
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::chromeDestroyed()
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Our lifetime is bound to the WebViewImpl.
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setWindowRect(const FloatRect& r)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->setWindowRect(IntRect(r));
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatRect ChromeClientImpl::windowRect()
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebRect rect;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rect = m_webView->client()->rootWindowRect();
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else {
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // These numbers will be fairly wrong. The window's x/y coordinates will
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // be the top left corner of the screen and the size will be the content
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // size instead of the window size.
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rect.width = m_webView->size().width;
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rect.height = m_webView->size().height;
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return FloatRect(rect);
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatRect ChromeClientImpl::pageRect()
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We hide the details of the window's border thickness from the web page by
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // simple re-using the window position here.  So, from the point-of-view of
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the web page, the window has no border.
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return windowRect();
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::focus()
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->didFocus();
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool ChromeClientImpl::canTakeFocus(FocusType)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For now the browser can always take focus if we're not running layout
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // tests.
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !layoutTestMode();
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void ChromeClientImpl::takeFocus(FocusType type)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->client())
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
19209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (type == FocusTypeBackward)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->focusPrevious();
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->focusNext();
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::focusedNodeChanged(Node* node)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->client()->focusedNodeChanged(WebNode(node));
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebURL focusURL;
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (node && node->isLink()) {
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // This HitTestResult hack is the easiest way to get a link URL out of a
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // WebCore::Node.
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HitTestResult hitTest(IntPoint(0, 0));
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // This cast must be valid because of the isLink() check.
208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        hitTest.setURLElement(toElement(node));
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (hitTest.isLiveLink())
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            focusURL = hitTest.absoluteLinkURL();
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->client()->setKeyboardFocusURL(focusURL);
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
215d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void ChromeClientImpl::focusedFrameChanged(WebCore::LocalFrame* frame)
216d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
21710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webframe = WebLocalFrameImpl::fromFrame(frame);
218d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (webframe && webframe->client())
219d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        webframe->client()->frameFocused();
220d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
221d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
222d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)Page* ChromeClientImpl::createWindow(LocalFrame* frame, const FrameLoadRequest& r, const WindowFeatures& features,
22351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    NavigationPolicy navigationPolicy, ShouldSendReferrer shouldSendReferrer)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->client())
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
228591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    WebNavigationPolicy policy = static_cast<WebNavigationPolicy>(navigationPolicy);
229591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (policy == WebNavigationPolicyIgnore)
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        policy = getNavigationPolicy();
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
232d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(frame->document());
233d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    DocumentFullscreen::webkitCancelFullScreen(*frame->document());
234bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
235c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    WebViewImpl* newView = toWebViewImpl(
23610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        m_webView->client()->createView(WebLocalFrameImpl::fromFrame(frame), WrappedResourceRequest(r.resourceRequest()), features, r.frameName(), policy, shouldSendReferrer == NeverSendReferrer));
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!newView)
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return newView->page();
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
242591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochstatic inline void updatePolicyForEvent(const WebInputEvent* inputEvent, NavigationPolicy* policy)
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!inputEvent || inputEvent->type != WebInputEvent::MouseUp)
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const WebMouseEvent* mouseEvent = static_cast<const WebMouseEvent*>(inputEvent);
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned short buttonNumber;
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (mouseEvent->button) {
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebMouseEvent::ButtonLeft:
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        buttonNumber = 0;
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebMouseEvent::ButtonMiddle:
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        buttonNumber = 1;
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebMouseEvent::ButtonRight:
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        buttonNumber = 2;
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool ctrl = mouseEvent->modifiers & WebMouseEvent::ControlKey;
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool shift = mouseEvent->modifiers & WebMouseEvent::ShiftKey;
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool alt = mouseEvent->modifiers & WebMouseEvent::AltKey;
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool meta = mouseEvent->modifiers & WebMouseEvent::MetaKey;
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
268591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    NavigationPolicy userPolicy = *policy;
269591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    navigationPolicyFromMouseEvent(buttonNumber, ctrl, shift, alt, meta, &userPolicy);
270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // User and app agree that we want a new window; let the app override the decorations.
271591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (userPolicy == NavigationPolicyNewWindow && *policy == NavigationPolicyNewPopup)
272926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    *policy = userPolicy;
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebNavigationPolicy ChromeClientImpl::getNavigationPolicy()
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If our default configuration was modified by a script or wasn't
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // created by a user gesture, then show as a popup. Else, let this
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // new window be opened as a toplevel window.
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool asPopup = !m_toolbarsVisible
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !m_statusbarVisible
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !m_scrollbarsVisible
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !m_menubarVisible
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !m_resizable;
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
287591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    NavigationPolicy policy = NavigationPolicyNewForegroundTab;
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (asPopup)
289591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        policy = NavigationPolicyNewPopup;
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updatePolicyForEvent(WebViewImpl::currentInputEvent(), &policy);
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
292591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return static_cast<WebNavigationPolicy>(policy);
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
295591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid ChromeClientImpl::show(NavigationPolicy navigationPolicy)
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->client())
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
300591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    WebNavigationPolicy policy = static_cast<WebNavigationPolicy>(navigationPolicy);
301591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (policy == WebNavigationPolicyIgnore)
302591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        policy = getNavigationPolicy();
303591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_webView->client()->show(policy);
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::canRunModal()
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !!m_webView->client();
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::runModal()
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->runModal();
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setToolbarsVisible(bool value)
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_toolbarsVisible = value;
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::toolbarsVisible()
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_toolbarsVisible;
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setStatusbarVisible(bool value)
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_statusbarVisible = value;
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::statusbarVisible()
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_statusbarVisible;
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setScrollbarsVisible(bool value)
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_scrollbarsVisible = value;
34010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webFrame = toWebLocalFrameImpl(m_webView->mainFrame());
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (webFrame)
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webFrame->setCanHaveScrollbars(value);
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::scrollbarsVisible()
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollbarsVisible;
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setMenubarVisible(bool value)
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_menubarVisible = value;
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::menubarVisible()
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_menubarVisible;
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setResizable(bool value)
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_resizable = value;
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
365c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)bool ChromeClientImpl::shouldReportDetailedMessageForSource(const String& url)
366c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
36710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webframe = m_webView->mainFrameImpl();
368a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return webframe->client() && webframe->client()->shouldReportDetailedMessageForSource(url);
369c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
370c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
3716f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochvoid ChromeClientImpl::addMessageToConsole(LocalFrame* localFrame, MessageSource source, MessageLevel level, const String& message, unsigned lineNumber, const String& sourceID, const String& stackTrace)
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
37310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* frame = WebLocalFrameImpl::fromFrame(localFrame);
3746f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (frame && frame->client()) {
3756f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        frame->client()->didAddMessageToConsole(
376aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            WebConsoleMessage(static_cast<WebConsoleMessage::Level>(level), message),
377aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            sourceID,
378aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            lineNumber,
379aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            stackTrace);
380aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    }
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::canRunBeforeUnloadConfirmPanel()
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !!m_webView->client();
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
388d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool ChromeClientImpl::runBeforeUnloadConfirmPanel(const String& message, LocalFrame* frame)
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
39010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webframe = WebLocalFrameImpl::fromFrame(frame);
3916f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
3926f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    bool isReload = false;
3936f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    WebDataSource* ds = webframe->provisionalDataSource();
3946f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (ds)
3956f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        isReload = (ds->navigationType() == blink::WebNavigationTypeReload);
3966f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
3976f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (webframe->client())
3986f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return webframe->client()->runModalBeforeUnloadDialog(isReload, message);
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::closeWindowSoon()
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Make sure this Page can no longer be found by JS.
405d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Page::ordinaryPages().remove(m_webView->page());
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Make sure that all loading is stopped.  Ensures that JS stops executing!
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->mainFrame()->stopLoading();
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->closeWidgetSoon();
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
414d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Although a LocalFrame is passed in, we don't actually use it, since we
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// already know our own m_webView.
416d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void ChromeClientImpl::runJavaScriptAlert(LocalFrame* frame, const String& message)
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
41810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webframe = WebLocalFrameImpl::fromFrame(frame);
4196f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (webframe->client()) {
4203c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        if (WebUserGestureIndicator::isProcessingUserGesture())
4213c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            WebUserGestureIndicator::currentUserGestureToken().setJavascriptPrompt();
4226f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        webframe->client()->runModalAlertDialog(message);
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// See comments for runJavaScriptAlert().
427d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool ChromeClientImpl::runJavaScriptConfirm(LocalFrame* frame, const String& message)
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
42910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webframe = WebLocalFrameImpl::fromFrame(frame);
4306f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (webframe->client()) {
4313c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        if (WebUserGestureIndicator::isProcessingUserGesture())
4323c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            WebUserGestureIndicator::currentUserGestureToken().setJavascriptPrompt();
4336f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return webframe->client()->runModalConfirmDialog(message);
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// See comments for runJavaScriptAlert().
439d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool ChromeClientImpl::runJavaScriptPrompt(LocalFrame* frame,
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           const String& message,
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           const String& defaultValue,
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           String& result)
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
44410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webframe = WebLocalFrameImpl::fromFrame(frame);
4456f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (webframe->client()) {
4463c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        if (WebUserGestureIndicator::isProcessingUserGesture())
4473c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            WebUserGestureIndicator::currentUserGestureToken().setJavascriptPrompt();
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebString actualValue;
4496f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        bool ok = webframe->client()->runModalPromptDialog(
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            message,
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            defaultValue,
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            &actualValue);
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (ok)
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result = actualValue;
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ok;
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setStatusbarText(const String& message)
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->setStatusText(message);
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool ChromeClientImpl::tabsToLinks()
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
46853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return m_webView->tabsToLinks();
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect ChromeClientImpl::windowResizerRect() const
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect result;
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = m_webView->client()->windowResizerRect();
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void ChromeClientImpl::invalidateContentsAndRootView(const IntRect& updateRect)
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (updateRect.isEmpty())
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->invalidateRect(updateRect);
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void ChromeClientImpl::invalidateContentsForSlowScroll(const IntRect& updateRect)
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
48853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    invalidateContentsAndRootView(updateRect);
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::scheduleAnimation()
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->scheduleAnimation();
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::scroll(
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const IntSize& scrollDelta, const IntRect& scrollRect,
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const IntRect& clipRect)
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->isAcceleratedCompositingActive()) {
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_webView->client()) {
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int dx = scrollDelta.width();
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int dy = scrollDelta.height();
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_webView->client()->didScrollRect(dx, dy, intersection(scrollRect, clipRect));
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
506d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else {
507d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_webView->scrollRootLayer();
508d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect ChromeClientImpl::rootViewToScreen(const IntRect& rect) const
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect screenRect(rect);
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client()) {
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebRect windowRect = m_webView->client()->windowRect();
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        screenRect.move(windowRect.x, windowRect.y);
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return screenRect;
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)WebScreenInfo ChromeClientImpl::screenInfo() const
52453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
52553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return m_webView->client() ? m_webView->client()->screenInfo() : WebScreenInfo();
52653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
52753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
528d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void ChromeClientImpl::contentsSizeChanged(LocalFrame* frame, const IntSize& size) const
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->didChangeContentsSize();
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webframe = WebLocalFrameImpl::fromFrame(frame);
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    webframe->didChangeContentsSize(size);
534d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
535d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frame->loader().restoreScrollPositionAndViewState();
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void ChromeClientImpl::deviceOrPageScaleFactorChanged() const
53953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
54053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_webView->deviceOrPageScaleFactorChanged();
54153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
54253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
543d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void ChromeClientImpl::layoutUpdated(LocalFrame* frame) const
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
54510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_webView->layoutUpdated(WebLocalFrameImpl::fromFrame(frame));
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::mouseDidMoveOverElement(
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const HitTestResult& result, unsigned modifierFlags)
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->client())
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebURL url;
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Find out if the mouse is over a link, and if so, let our UI know...
556d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (result.isLiveLink() && !result.absoluteLinkURL().string().isEmpty()) {
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        url = result.absoluteLinkURL();
558d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else if (result.innerNonSharedNode()
559d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        && (isHTMLObjectElement(*result.innerNonSharedNode())
560d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            || isHTMLEmbedElement(*result.innerNonSharedNode()))) {
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderObject* object = result.innerNonSharedNode()->renderer();
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (object && object->isWidget()) {
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Widget* widget = toRenderWidget(object)->widget();
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (widget && widget->isPluginContainer()) {
56509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                WebPluginContainerImpl* plugin = toWebPluginContainerImpl(widget);
566926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                url = plugin->plugin()->linkAtPosition(result.roundedPointInInnerNodeFrame());
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->client()->setMouseOverURL(url);
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setToolTip(const String& tooltipText, TextDirection dir)
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->client())
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebTextDirection textDirection = (dir == RTL) ?
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebTextDirectionRightToLeft :
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebTextDirectionLeftToRight;
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->client()->setToolTipText(
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        tooltipText, textDirection);
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5851e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void ChromeClientImpl::dispatchViewportPropertiesDidChange(const ViewportDescription& description) const
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
587bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    m_webView->updatePageDefinedViewportConstraints(description);
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
590d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void ChromeClientImpl::print(LocalFrame* frame)
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
59310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        m_webView->client()->printPage(WebLocalFrameImpl::fromFrame(frame));
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5966f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochPassOwnPtr<ColorChooser> ChromeClientImpl::createColorChooser(LocalFrame* frame, ColorChooserClient* chooserClient, const Color&)
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
598926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    OwnPtr<ColorChooserUIController> controller;
59993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (RuntimeEnabledFeatures::pagePopupEnabled())
6006f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        controller = adoptPtr(new ColorChooserPopupUIController(frame, this, chooserClient));
60193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    else
6026f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        controller = adoptPtr(new ColorChooserUIController(frame, chooserClient));
603926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    controller->openUI();
604926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return controller.release();
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)PassRefPtrWillBeRawPtr<DateTimeChooser> ChromeClientImpl::openDateTimeChooser(DateTimeChooserClient* pickerClient, const DateTimeChooserParameters& parameters)
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return DateTimeChooserImpl::create(this, pickerClient, parameters);
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else
612926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return ExternalDateTimeChooser::create(this, m_webView->client(), pickerClient, parameters);
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
616d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void ChromeClientImpl::runOpenPanel(LocalFrame* frame, PassRefPtr<FileChooser> fileChooser)
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebViewClient* client = m_webView->client();
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!client)
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebFileChooserParams params;
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    params.multiSelect = fileChooser->settings().allowsMultipleFiles;
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    params.directory = fileChooser->settings().allowsDirectoryUpload;
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    params.acceptTypes = fileChooser->settings().acceptTypes();
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    params.selectedFiles = fileChooser->settings().selectedFiles;
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (params.selectedFiles.size() > 0)
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        params.initialValue = params.selectedFiles[0];
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(MEDIA_CAPTURE)
630e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    params.useMediaCapture = fileChooser->settings().useMediaCapture;
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebFileChooserCompletionImpl* chooserCompletion =
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        new WebFileChooserCompletionImpl(fileChooser);
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (client->runFileChooser(params, chooserCompletion))
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Choosing failed, so do callback with an empty list.
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    chooserCompletion->didChooseFile(WebVector<WebString>());
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::enumerateChosenDirectory(FileChooser* fileChooser)
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebViewClient* client = m_webView->client();
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!client)
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebFileChooserCompletionImpl* chooserCompletion =
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        new WebFileChooserCompletionImpl(fileChooser);
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(fileChooser && fileChooser->settings().selectedFiles.size());
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the enumeration can't happen, call the callback with an empty list.
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!client->enumerateChosenDirectory(fileChooser->settings().selectedFiles[0], chooserCompletion))
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        chooserCompletion->didChooseFile(WebVector<WebString>());
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setCursor(const WebCore::Cursor& cursor)
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setCursor(WebCursorInfo(cursor));
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setCursor(const WebCursorInfo& cursor)
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX)
666926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // On Mac the mousemove event propagates to both the popup and main window.
667926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // If a popup is open we don't want the main window to change the cursor.
668926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_webView->hasOpenedPopup())
669926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
670926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->didChangeCursor(cursor);
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setCursorForPlugin(const WebCursorInfo& cursor)
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setCursor(cursor);
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
680bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void ChromeClientImpl::postAccessibilityNotification(AXObject* obj, AXObjectCache::AXNotification notification)
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Alert assistive technology about the accessibility object notification.
683c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (!obj)
684c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        return;
68509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_webView->client())
68609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_webView->client()->postAccessibilityEvent(WebAXObject(obj), toWebAXEvent(notification));
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
689521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)String ChromeClientImpl::acceptLanguages()
690521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
691521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    return m_webView->client()->acceptLanguages();
692521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
693521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::paintCustomOverhangArea(GraphicsContext* context, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect)
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
696d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame = m_webView->mainFrameImpl()->frame();
69710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebPluginContainerImpl* pluginContainer = WebLocalFrameImpl::pluginContainerFromFrame(frame);
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pluginContainer)
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return pluginContainer->paintCustomOverhangArea(context, horizontalOverhangArea, verticalOverhangArea, dirtyRect);
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
703926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)GraphicsLayerFactory* ChromeClientImpl::graphicsLayerFactory() const
704926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
705926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_webView->graphicsLayerFactory();
706926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
707926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
708d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void ChromeClientImpl::attachRootGraphicsLayer(GraphicsLayer* rootLayer)
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
710d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_webView->setRootGraphicsLayer(rootLayer);
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::enterFullScreenForElement(Element* element)
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->enterFullScreenForElement(element);
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::exitFullScreenForElement(Element* element)
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->exitFullScreenForElement(element);
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::hasOpenedPopup() const
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_webView->hasOpenedPopup();
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
728d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassRefPtr<PopupMenu> ChromeClientImpl::createPopupMenu(LocalFrame& frame, PopupMenuClient* client) const
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (WebViewImpl::useExternalPopupMenus())
73109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return adoptRef(new ExternalPopupMenu(frame, client, *m_webView));
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
73393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return adoptRef(new PopupMenuChromium(frame, client));
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PagePopup* ChromeClientImpl::openPagePopup(PagePopupClient* client, const IntRect& originBoundsInRootView)
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_pagePopupDriver);
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_pagePopupDriver->openPagePopup(client, originBoundsInRootView);
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::closePagePopup(PagePopup* popup)
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_pagePopupDriver);
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pagePopupDriver->closePagePopup(popup);
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setPagePopupDriver(PagePopupDriver* driver)
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(driver);
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pagePopupDriver = driver;
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::resetPagePopupDriver()
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pagePopupDriver = m_webView;
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
759e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)bool ChromeClientImpl::shouldRunModalDialogDuringPageDismissal(const DialogType& dialogType, const String& dialogMessage, Document::PageDismissalType dismissalType) const
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const char* kDialogs[] = {"alert", "confirm", "prompt", "showModalDialog"};
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int dialog = static_cast<int>(dialogType);
763926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(0 <= dialog && dialog < static_cast<int>(arraysize(kDialogs)));
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const char* kDismissals[] = {"beforeunload", "pagehide", "unload"};
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int dismissal = static_cast<int>(dismissalType) - 1; // Exclude NoDismissal.
767926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(0 <= dismissal && dismissal < static_cast<int>(arraysize(kDismissals)));
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
76951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    blink::Platform::current()->histogramEnumeration("Renderer.ModalDialogsDuringPageDismissal", dismissal * arraysize(kDialogs) + dialog, arraysize(kDialogs) * arraysize(kDismissals));
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
77193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    String message = String("Blocked ") + kDialogs[dialog] + "('" + dialogMessage + "') during " + kDismissals[dismissal] + ".";
77293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    m_webView->mainFrame()->addMessageToConsole(WebConsoleMessage(WebConsoleMessage::LevelError, message));
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::needTouchEvents(bool needsTouchEvents)
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->hasTouchEventHandlers(needsTouchEvents);
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
782a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void ChromeClientImpl::setTouchAction(TouchAction touchAction)
783a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
784a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (WebViewClient* client = m_webView->client()) {
785a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        WebTouchAction webTouchAction = static_cast<WebTouchAction>(touchAction);
786a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        client->setTouchAction(webTouchAction);
787a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
788a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
789a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::requestPointerLock()
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_webView->requestPointerLock();
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::requestPointerUnlock()
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_webView->requestPointerUnlock();
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::annotatedRegionsChanged()
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebViewClient* client = m_webView->client();
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (client)
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        client->draggableRegionsChanged();
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
807d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void ChromeClientImpl::didAssociateFormControls(const WillBeHeapVector<RefPtrWillBeMember<Element> >& elements)
808926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
809d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (m_webView->autofillClient())
810d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_webView->autofillClient()->didAssociateFormControls(elements);
811926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
812926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
81351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void ChromeClientImpl::didCancelCompositionOnSelectionChange()
81451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
81551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_webView->client())
81651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_webView->client()->didCancelCompositionOnSelectionChange();
81751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
81851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
81951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void ChromeClientImpl::willSetInputMethodState()
82051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
82151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_webView->client())
82251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_webView->client()->resetInputMethod();
82351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
82451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
825a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid ChromeClientImpl::didUpdateTextOfFocusedElementByNonUserInput()
826a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
827a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (m_webView->client())
828a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        m_webView->client()->didUpdateTextOfFocusedElementByNonUserInput();
829a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
830a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
83151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void ChromeClientImpl::handleKeyboardEventOnTextField(HTMLInputElement& inputElement, KeyboardEvent& event)
83251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
83351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!m_webView->autofillClient())
83451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return;
83551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_webView->autofillClient()->textFieldDidReceiveKeyDown(WebInputElement(&inputElement), WebKeyboardEventBuilder(event));
83651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
83751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
83809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// FIXME: Remove this code once we have input routing in the browser
83909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// process. See http://crbug.com/339659.
84009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void ChromeClientImpl::forwardInputEvent(
841a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    WebCore::Frame* frame, WebCore::Event* event)
84209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
84310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(toLocalFrameTemporary(frame));
84409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
84509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // This is only called when we have out-of-process iframes, which
84609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // need to forward input events across processes.
84709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // FIXME: Add a check for out-of-process iframes enabled.
84809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (event->isKeyboardEvent()) {
84909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        WebKeyboardEventBuilder webEvent(*static_cast<WebCore::KeyboardEvent*>(event));
85009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        webFrame->client()->forwardInputEvent(&webEvent);
85109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    } else if (event->isMouseEvent()) {
852a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        WebMouseEventBuilder webEvent(webFrame->frameView(), frame->ownerRenderer(), *static_cast<WebCore::MouseEvent*>(event));
85309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // Internal Blink events should not be forwarded.
85409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (webEvent.type == WebInputEvent::Undefined)
85509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return;
85609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
85709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        webFrame->client()->forwardInputEvent(&webEvent);
85809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    } else if (event->isWheelEvent()) {
859a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        WebMouseWheelEventBuilder webEvent(webFrame->frameView(), frame->ownerRenderer(), *static_cast<WebCore::WheelEvent*>(event));
86009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (webEvent.type == WebInputEvent::Undefined)
86109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return;
86209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        webFrame->client()->forwardInputEvent(&webEvent);
86309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
86409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
86509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
866d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void ChromeClientImpl::didChangeValueInTextField(HTMLFormControlElement& element)
867d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
868d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_webView->autofillClient())
869d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
870d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_webView->autofillClient()->textFieldDidChange(WebFormControlElement(&element));
871d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
872d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
87351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void ChromeClientImpl::didEndEditingOnTextField(HTMLInputElement& inputElement)
87451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
87551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_webView->autofillClient())
87651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_webView->autofillClient()->textFieldDidEndEditing(WebInputElement(&inputElement));
87709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
87851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
87909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void ChromeClientImpl::openTextDataListChooser(HTMLInputElement& input)
88009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
88109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_webView->autofillClient())
88209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_webView->autofillClient()->openTextDataListChooser(WebInputElement(&input));
88351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
88451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
88551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink
886