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)
35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/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"
409e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "core/dom/Fullscreen.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"
497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/html/forms/ColorChooser.h"
507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/html/forms/ColorChooserClient.h"
517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/html/forms/DateTimeChooser.h"
5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/DocumentLoader.h"
5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoadRequest.h"
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h"
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/PagePopupDriver.h"
56e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/page/WindowFeatures.h"
5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/HitTestResult.h"
58197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/rendering/RenderPart.h"
5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderWidget.h"
607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/compositing/CompositedSelectionBound.h"
61a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/Cursor.h"
621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/FileChooser.h"
6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "platform/NotImplemented.h"
64bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/PlatformScreen.h"
6576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h"
6619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "platform/exported/WrappedResourceRequest.h"
671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatRect.h"
681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/IntRect.h"
69a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsLayer.h"
7051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SecurityOrigin.h"
715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/Platform.h"
7251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "public/platform/WebCursorInfo.h"
735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebRect.h"
747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "public/platform/WebSelectionBound.h"
755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebURLRequest.h"
76f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebAXObject.h"
77f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebAutofillClient.h"
78f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebColorChooser.h"
79f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebColorSuggestion.h"
80f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebConsoleMessage.h"
81f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebFrameClient.h"
82f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebInputElement.h"
83f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebInputEvent.h"
84f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebKit.h"
85f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebNode.h"
86f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPlugin.h"
87f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPopupMenuInfo.h"
88f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebSettings.h"
89f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebTextDirection.h"
90a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "public/web/WebTouchAction.h"
91f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebUserGestureIndicator.h"
92f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebUserGestureToken.h"
93f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebViewClient.h"
94f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebWindowFeatures.h"
95f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ColorChooserPopupUIController.h"
96f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ColorChooserUIController.h"
97f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/DateTimeChooserImpl.h"
98f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ExternalDateTimeChooser.h"
99f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ExternalPopupMenu.h"
100f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/PopupMenuChromium.h"
101f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebFileChooserCompletionImpl.h"
102f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebInputEventConversion.h"
103f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebLocalFrameImpl.h"
104f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPluginContainerImpl.h"
105f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPopupMenuImpl.h"
106f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebSettingsImpl.h"
107f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebViewImpl.h"
108591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/CString.h"
109591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/StringBuilder.h"
110591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/StringConcatenate.h"
111591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/unicode/CharacterNames.h"
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
115e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// Converts a AXObjectCache::AXNotification to a WebAXEvent
116c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)static WebAXEvent toWebAXEvent(AXObjectCache::AXNotification notification)
117c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
118c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    // These enums have the same values; enforced in AssertMatchingEnums.cpp.
119c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return static_cast<WebAXEvent>(notification);
120c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
121c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
1227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistatic WebSelectionBound toWebSelectionBound(const CompositedSelectionBound& bound)
1237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(bound.layer);
1257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // These enums have the same values; enforced in AssertMatchingEnums.cpp.
1277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WebSelectionBound result(static_cast<WebSelectionBound::Type>(bound.type));
1287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    result.layerId = bound.layer->platformLayer()->id();
1297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    result.edgeTopInLayer = roundedIntPoint(bound.edgeTopInLayer);
1307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    result.edgeBottomInLayer = roundedIntPoint(bound.edgeBottomInLayer);
1317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return result;
1327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ChromeClientImpl::ChromeClientImpl(WebViewImpl* webView)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_webView(webView)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_toolbarsVisible(true)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_statusbarVisible(true)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_scrollbarsVisible(true)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_menubarVisible(true)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_resizable(true)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_pagePopupDriver(webView)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ChromeClientImpl::~ChromeClientImpl()
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void* ChromeClientImpl::webView() const
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<void*>(m_webView);
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::chromeDestroyed()
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Our lifetime is bound to the WebViewImpl.
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setWindowRect(const FloatRect& r)
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->setWindowRect(IntRect(r));
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatRect ChromeClientImpl::windowRect()
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebRect rect;
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rect = m_webView->client()->rootWindowRect();
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else {
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // These numbers will be fairly wrong. The window's x/y coordinates will
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // be the top left corner of the screen and the size will be the content
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // size instead of the window size.
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rect.width = m_webView->size().width;
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rect.height = m_webView->size().height;
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return FloatRect(rect);
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatRect ChromeClientImpl::pageRect()
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We hide the details of the window's border thickness from the web page by
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // simple re-using the window position here.  So, from the point-of-view of
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the web page, the window has no border.
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return windowRect();
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::focus()
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->didFocus();
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool ChromeClientImpl::canTakeFocus(FocusType)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For now the browser can always take focus if we're not running layout
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // tests.
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !layoutTestMode();
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void ChromeClientImpl::takeFocus(FocusType type)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->client())
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
20509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (type == FocusTypeBackward)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->focusPrevious();
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->focusNext();
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::focusedNodeChanged(Node* node)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->client()->focusedNodeChanged(WebNode(node));
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebURL focusURL;
216197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (node && node->isElementNode() && toElement(node)->isLiveLink())
217197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        focusURL = toElement(node)->hrefURL();
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->client()->setKeyboardFocusURL(focusURL);
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
221e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void ChromeClientImpl::focusedFrameChanged(LocalFrame* frame)
222d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
22310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webframe = WebLocalFrameImpl::fromFrame(frame);
224d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (webframe && webframe->client())
225d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        webframe->client()->frameFocused();
226d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
227d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
228d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)Page* ChromeClientImpl::createWindow(LocalFrame* frame, const FrameLoadRequest& r, const WindowFeatures& features,
22951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    NavigationPolicy navigationPolicy, ShouldSendReferrer shouldSendReferrer)
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->client())
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
234591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    WebNavigationPolicy policy = static_cast<WebNavigationPolicy>(navigationPolicy);
235591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (policy == WebNavigationPolicyIgnore)
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        policy = getNavigationPolicy();
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
238d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(frame->document());
2399e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    Fullscreen::fullyExitFullscreen(*frame->document());
240bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
241c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    WebViewImpl* newView = toWebViewImpl(
24210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        m_webView->client()->createView(WebLocalFrameImpl::fromFrame(frame), WrappedResourceRequest(r.resourceRequest()), features, r.frameName(), policy, shouldSendReferrer == NeverSendReferrer));
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!newView)
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return newView->page();
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
248591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochstatic inline void updatePolicyForEvent(const WebInputEvent* inputEvent, NavigationPolicy* policy)
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!inputEvent || inputEvent->type != WebInputEvent::MouseUp)
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const WebMouseEvent* mouseEvent = static_cast<const WebMouseEvent*>(inputEvent);
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned short buttonNumber;
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (mouseEvent->button) {
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebMouseEvent::ButtonLeft:
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        buttonNumber = 0;
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebMouseEvent::ButtonMiddle:
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        buttonNumber = 1;
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebMouseEvent::ButtonRight:
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        buttonNumber = 2;
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool ctrl = mouseEvent->modifiers & WebMouseEvent::ControlKey;
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool shift = mouseEvent->modifiers & WebMouseEvent::ShiftKey;
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool alt = mouseEvent->modifiers & WebMouseEvent::AltKey;
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool meta = mouseEvent->modifiers & WebMouseEvent::MetaKey;
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
274591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    NavigationPolicy userPolicy = *policy;
275591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    navigationPolicyFromMouseEvent(buttonNumber, ctrl, shift, alt, meta, &userPolicy);
276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // User and app agree that we want a new window; let the app override the decorations.
277591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (userPolicy == NavigationPolicyNewWindow && *policy == NavigationPolicyNewPopup)
278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    *policy = userPolicy;
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebNavigationPolicy ChromeClientImpl::getNavigationPolicy()
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If our default configuration was modified by a script or wasn't
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // created by a user gesture, then show as a popup. Else, let this
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // new window be opened as a toplevel window.
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool asPopup = !m_toolbarsVisible
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !m_statusbarVisible
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !m_scrollbarsVisible
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !m_menubarVisible
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !m_resizable;
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
293591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    NavigationPolicy policy = NavigationPolicyNewForegroundTab;
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (asPopup)
295591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        policy = NavigationPolicyNewPopup;
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updatePolicyForEvent(WebViewImpl::currentInputEvent(), &policy);
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
298591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return static_cast<WebNavigationPolicy>(policy);
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
301591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid ChromeClientImpl::show(NavigationPolicy navigationPolicy)
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->client())
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
306591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    WebNavigationPolicy policy = static_cast<WebNavigationPolicy>(navigationPolicy);
307591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (policy == WebNavigationPolicyIgnore)
308591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        policy = getNavigationPolicy();
309591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_webView->client()->show(policy);
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::canRunModal()
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !!m_webView->client();
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::runModal()
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->runModal();
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setToolbarsVisible(bool value)
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_toolbarsVisible = value;
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::toolbarsVisible()
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_toolbarsVisible;
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setStatusbarVisible(bool value)
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_statusbarVisible = value;
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::statusbarVisible()
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_statusbarVisible;
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setScrollbarsVisible(bool value)
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_scrollbarsVisible = value;
34610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webFrame = toWebLocalFrameImpl(m_webView->mainFrame());
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (webFrame)
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webFrame->setCanHaveScrollbars(value);
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::scrollbarsVisible()
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollbarsVisible;
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setMenubarVisible(bool value)
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_menubarVisible = value;
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::menubarVisible()
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_menubarVisible;
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setResizable(bool value)
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_resizable = value;
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
371c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)bool ChromeClientImpl::shouldReportDetailedMessageForSource(const String& url)
372c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
373197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebLocalFrameImpl* webframe = m_webView->localFrameRootTemporary();
374a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return webframe->client() && webframe->client()->shouldReportDetailedMessageForSource(url);
375c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
376c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
3776f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochvoid ChromeClientImpl::addMessageToConsole(LocalFrame* localFrame, MessageSource source, MessageLevel level, const String& message, unsigned lineNumber, const String& sourceID, const String& stackTrace)
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
37910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* frame = WebLocalFrameImpl::fromFrame(localFrame);
3806f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (frame && frame->client()) {
3816f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        frame->client()->didAddMessageToConsole(
382aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            WebConsoleMessage(static_cast<WebConsoleMessage::Level>(level), message),
383aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            sourceID,
384aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            lineNumber,
385aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            stackTrace);
386aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    }
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::canRunBeforeUnloadConfirmPanel()
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !!m_webView->client();
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
394d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool ChromeClientImpl::runBeforeUnloadConfirmPanel(const String& message, LocalFrame* frame)
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
39610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webframe = WebLocalFrameImpl::fromFrame(frame);
3976f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
3986f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    bool isReload = false;
3996f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    WebDataSource* ds = webframe->provisionalDataSource();
4006f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (ds)
401e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        isReload = (ds->navigationType() == WebNavigationTypeReload);
4026f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
4036f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (webframe->client())
4046f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return webframe->client()->runModalBeforeUnloadDialog(isReload, message);
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::closeWindowSoon()
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Make sure this Page can no longer be found by JS.
411d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Page::ordinaryPages().remove(m_webView->page());
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Make sure that all loading is stopped.  Ensures that JS stops executing!
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->mainFrame()->stopLoading();
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->closeWidgetSoon();
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
420d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Although a LocalFrame is passed in, we don't actually use it, since we
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// already know our own m_webView.
422d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void ChromeClientImpl::runJavaScriptAlert(LocalFrame* frame, const String& message)
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
42410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webframe = WebLocalFrameImpl::fromFrame(frame);
4256f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (webframe->client()) {
4263c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        if (WebUserGestureIndicator::isProcessingUserGesture())
4273c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            WebUserGestureIndicator::currentUserGestureToken().setJavascriptPrompt();
4286f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        webframe->client()->runModalAlertDialog(message);
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// See comments for runJavaScriptAlert().
433d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool ChromeClientImpl::runJavaScriptConfirm(LocalFrame* frame, const String& message)
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
43510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webframe = WebLocalFrameImpl::fromFrame(frame);
4366f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (webframe->client()) {
4373c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        if (WebUserGestureIndicator::isProcessingUserGesture())
4383c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            WebUserGestureIndicator::currentUserGestureToken().setJavascriptPrompt();
4396f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return webframe->client()->runModalConfirmDialog(message);
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// See comments for runJavaScriptAlert().
445d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool ChromeClientImpl::runJavaScriptPrompt(LocalFrame* frame,
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           const String& message,
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           const String& defaultValue,
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           String& result)
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
45010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webframe = WebLocalFrameImpl::fromFrame(frame);
4516f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (webframe->client()) {
4523c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        if (WebUserGestureIndicator::isProcessingUserGesture())
4533c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            WebUserGestureIndicator::currentUserGestureToken().setJavascriptPrompt();
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebString actualValue;
4556f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        bool ok = webframe->client()->runModalPromptDialog(
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            message,
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            defaultValue,
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            &actualValue);
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (ok)
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result = actualValue;
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ok;
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setStatusbarText(const String& message)
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->setStatusText(message);
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool ChromeClientImpl::tabsToLinks()
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
47453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return m_webView->tabsToLinks();
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect ChromeClientImpl::windowResizerRect() const
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect result;
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = m_webView->client()->windowResizerRect();
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void ChromeClientImpl::invalidateContentsAndRootView(const IntRect& updateRect)
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (updateRect.isEmpty())
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->invalidateRect(updateRect);
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void ChromeClientImpl::invalidateContentsForSlowScroll(const IntRect& updateRect)
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
49453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    invalidateContentsAndRootView(updateRect);
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::scheduleAnimation()
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->scheduleAnimation();
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect ChromeClientImpl::rootViewToScreen(const IntRect& rect) const
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect screenRect(rect);
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client()) {
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebRect windowRect = m_webView->client()->windowRect();
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        screenRect.move(windowRect.x, windowRect.y);
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return screenRect;
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)WebScreenInfo ChromeClientImpl::screenInfo() const
51553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
51653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return m_webView->client() ? m_webView->client()->screenInfo() : WebScreenInfo();
51753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
51853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
519d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void ChromeClientImpl::contentsSizeChanged(LocalFrame* frame, const IntSize& size) const
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->didChangeContentsSize();
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webframe = WebLocalFrameImpl::fromFrame(frame);
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    webframe->didChangeContentsSize(size);
525d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
526d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frame->loader().restoreScrollPositionAndViewState();
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void ChromeClientImpl::deviceOrPageScaleFactorChanged() const
53053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
53153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_webView->deviceOrPageScaleFactorChanged();
53253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
53353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
534d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void ChromeClientImpl::layoutUpdated(LocalFrame* frame) const
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
53610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_webView->layoutUpdated(WebLocalFrameImpl::fromFrame(frame));
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::mouseDidMoveOverElement(
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const HitTestResult& result, unsigned modifierFlags)
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->client())
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebURL url;
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Find out if the mouse is over a link, and if so, let our UI know...
547d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (result.isLiveLink() && !result.absoluteLinkURL().string().isEmpty()) {
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        url = result.absoluteLinkURL();
549d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else if (result.innerNonSharedNode()
550d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        && (isHTMLObjectElement(*result.innerNonSharedNode())
551d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            || isHTMLEmbedElement(*result.innerNonSharedNode()))) {
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderObject* object = result.innerNonSharedNode()->renderer();
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (object && object->isWidget()) {
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Widget* widget = toRenderWidget(object)->widget();
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (widget && widget->isPluginContainer()) {
55609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                WebPluginContainerImpl* plugin = toWebPluginContainerImpl(widget);
557926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                url = plugin->plugin()->linkAtPosition(result.roundedPointInInnerNodeFrame());
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->client()->setMouseOverURL(url);
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setToolTip(const String& tooltipText, TextDirection dir)
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
567e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (m_webView->client())
568e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        m_webView->client()->setToolTipText(tooltipText, toWebTextDirection(dir));
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5711e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void ChromeClientImpl::dispatchViewportPropertiesDidChange(const ViewportDescription& description) const
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
573bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    m_webView->updatePageDefinedViewportConstraints(description);
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
576d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void ChromeClientImpl::print(LocalFrame* frame)
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
57910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        m_webView->client()->printPage(WebLocalFrameImpl::fromFrame(frame));
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5826f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochPassOwnPtr<ColorChooser> ChromeClientImpl::createColorChooser(LocalFrame* frame, ColorChooserClient* chooserClient, const Color&)
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
584926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    OwnPtr<ColorChooserUIController> controller;
58593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (RuntimeEnabledFeatures::pagePopupEnabled())
5866f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        controller = adoptPtr(new ColorChooserPopupUIController(frame, this, chooserClient));
58793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    else
5886f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        controller = adoptPtr(new ColorChooserUIController(frame, chooserClient));
589926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    controller->openUI();
590926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return controller.release();
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciPassRefPtr<DateTimeChooser> ChromeClientImpl::openDateTimeChooser(DateTimeChooserClient* pickerClient, const DateTimeChooserParameters& parameters)
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return DateTimeChooserImpl::create(this, pickerClient, parameters);
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else
598926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return ExternalDateTimeChooser::create(this, m_webView->client(), pickerClient, parameters);
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
602d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void ChromeClientImpl::runOpenPanel(LocalFrame* frame, PassRefPtr<FileChooser> fileChooser)
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebViewClient* client = m_webView->client();
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!client)
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebFileChooserParams params;
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    params.multiSelect = fileChooser->settings().allowsMultipleFiles;
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    params.directory = fileChooser->settings().allowsDirectoryUpload;
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    params.acceptTypes = fileChooser->settings().acceptTypes();
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    params.selectedFiles = fileChooser->settings().selectedFiles;
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (params.selectedFiles.size() > 0)
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        params.initialValue = params.selectedFiles[0];
615e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    params.useMediaCapture = fileChooser->settings().useMediaCapture;
616197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebFileChooserCompletionImpl* chooserCompletion =
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        new WebFileChooserCompletionImpl(fileChooser);
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (client->runFileChooser(params, chooserCompletion))
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Choosing failed, so do callback with an empty list.
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    chooserCompletion->didChooseFile(WebVector<WebString>());
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::enumerateChosenDirectory(FileChooser* fileChooser)
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebViewClient* client = m_webView->client();
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!client)
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebFileChooserCompletionImpl* chooserCompletion =
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        new WebFileChooserCompletionImpl(fileChooser);
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(fileChooser && fileChooser->settings().selectedFiles.size());
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the enumeration can't happen, call the callback with an empty list.
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!client->enumerateChosenDirectory(fileChooser->settings().selectedFiles[0], chooserCompletion))
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        chooserCompletion->didChooseFile(WebVector<WebString>());
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
643e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void ChromeClientImpl::setCursor(const Cursor& cursor)
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setCursor(WebCursorInfo(cursor));
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setCursor(const WebCursorInfo& cursor)
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6508abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX)
651926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // On Mac the mousemove event propagates to both the popup and main window.
652926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // If a popup is open we don't want the main window to change the cursor.
653926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_webView->hasOpenedPopup())
654926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
655926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->didChangeCursor(cursor);
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setCursorForPlugin(const WebCursorInfo& cursor)
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setCursor(cursor);
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void ChromeClientImpl::postAccessibilityNotification(AXObject* obj, AXObjectCache::AXNotification notification)
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Alert assistive technology about the accessibility object notification.
668697ef0c10ac944be8499480c025020e4c282c980Ben Murdoch    if (!obj || !obj->document())
669c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        return;
6707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
671697ef0c10ac944be8499480c025020e4c282c980Ben Murdoch    WebLocalFrameImpl* webframe = WebLocalFrameImpl::fromFrame(obj->document()->axObjectCacheOwner().frame());
6727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (webframe && webframe->client())
6737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        webframe->client()->postAccessibilityEvent(WebAXObject(obj), toWebAXEvent(notification));
6747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
6757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME: delete these lines once Chrome only uses the frame client interface, above.
67609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_webView->client())
67709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_webView->client()->postAccessibilityEvent(WebAXObject(obj), toWebAXEvent(notification));
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
680521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)String ChromeClientImpl::acceptLanguages()
681521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
682521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    return m_webView->client()->acceptLanguages();
683521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
684521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::paintCustomOverhangArea(GraphicsContext* context, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect)
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
687d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame = m_webView->mainFrameImpl()->frame();
68810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebPluginContainerImpl* pluginContainer = WebLocalFrameImpl::pluginContainerFromFrame(frame);
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pluginContainer)
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return pluginContainer->paintCustomOverhangArea(context, horizontalOverhangArea, verticalOverhangArea, dirtyRect);
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
694926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)GraphicsLayerFactory* ChromeClientImpl::graphicsLayerFactory() const
695926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
696926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_webView->graphicsLayerFactory();
697926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
698926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
699d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void ChromeClientImpl::attachRootGraphicsLayer(GraphicsLayer* rootLayer)
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
701d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_webView->setRootGraphicsLayer(rootLayer);
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::enterFullScreenForElement(Element* element)
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->enterFullScreenForElement(element);
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::exitFullScreenForElement(Element* element)
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->exitFullScreenForElement(element);
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
714197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid ChromeClientImpl::clearCompositedSelectionBounds()
715197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
716197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_webView->clearCompositedSelectionBounds();
717197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
718197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
7197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ChromeClientImpl::updateCompositedSelectionBounds(const CompositedSelectionBound& anchor, const CompositedSelectionBound& focus)
7207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
7217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_webView->updateCompositedSelectionBounds(toWebSelectionBound(anchor), toWebSelectionBound(focus));
7227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
7237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::hasOpenedPopup() const
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_webView->hasOpenedPopup();
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciPassRefPtrWillBeRawPtr<PopupMenu> ChromeClientImpl::createPopupMenu(LocalFrame& frame, PopupMenuClient* client) const
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (WebViewImpl::useExternalPopupMenus())
7327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return adoptRefWillBeNoop(new ExternalPopupMenu(frame, client, *m_webView));
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return adoptRefWillBeNoop(new PopupMenuChromium(frame, client));
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PagePopup* ChromeClientImpl::openPagePopup(PagePopupClient* client, const IntRect& originBoundsInRootView)
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_pagePopupDriver);
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_pagePopupDriver->openPagePopup(client, originBoundsInRootView);
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::closePagePopup(PagePopup* popup)
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_pagePopupDriver);
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pagePopupDriver->closePagePopup(popup);
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setPagePopupDriver(PagePopupDriver* driver)
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(driver);
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pagePopupDriver = driver;
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::resetPagePopupDriver()
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pagePopupDriver = m_webView;
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
760e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)bool ChromeClientImpl::shouldRunModalDialogDuringPageDismissal(const DialogType& dialogType, const String& dialogMessage, Document::PageDismissalType dismissalType) const
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const char* kDialogs[] = {"alert", "confirm", "prompt", "showModalDialog"};
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int dialog = static_cast<int>(dialogType);
764926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(0 <= dialog && dialog < static_cast<int>(arraysize(kDialogs)));
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const char* kDismissals[] = {"beforeunload", "pagehide", "unload"};
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int dismissal = static_cast<int>(dismissalType) - 1; // Exclude NoDismissal.
768926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(0 <= dismissal && dismissal < static_cast<int>(arraysize(kDismissals)));
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
770e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Platform::current()->histogramEnumeration("Renderer.ModalDialogsDuringPageDismissal", dismissal * arraysize(kDialogs) + dialog, arraysize(kDialogs) * arraysize(kDismissals));
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
77293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    String message = String("Blocked ") + kDialogs[dialog] + "('" + dialogMessage + "') during " + kDismissals[dismissal] + ".";
77393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    m_webView->mainFrame()->addMessageToConsole(WebConsoleMessage(WebConsoleMessage::LevelError, message));
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::needTouchEvents(bool needsTouchEvents)
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->hasTouchEventHandlers(needsTouchEvents);
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
783a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void ChromeClientImpl::setTouchAction(TouchAction touchAction)
784a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
785a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (WebViewClient* client = m_webView->client()) {
786a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        WebTouchAction webTouchAction = static_cast<WebTouchAction>(touchAction);
787a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        client->setTouchAction(webTouchAction);
788a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
789a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
790a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::requestPointerLock()
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_webView->requestPointerLock();
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::requestPointerUnlock()
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_webView->requestPointerUnlock();
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::annotatedRegionsChanged()
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebViewClient* client = m_webView->client();
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (client)
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        client->draggableRegionsChanged();
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
808d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void ChromeClientImpl::didAssociateFormControls(const WillBeHeapVector<RefPtrWillBeMember<Element> >& elements)
809926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
810d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (m_webView->autofillClient())
811d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_webView->autofillClient()->didAssociateFormControls(elements);
812926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
813926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
81451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void ChromeClientImpl::didCancelCompositionOnSelectionChange()
81551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
81651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_webView->client())
81751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_webView->client()->didCancelCompositionOnSelectionChange();
81851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
81951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
82051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void ChromeClientImpl::willSetInputMethodState()
82151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
82251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_webView->client())
82351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_webView->client()->resetInputMethod();
82451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
82551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
826a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid ChromeClientImpl::didUpdateTextOfFocusedElementByNonUserInput()
827a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
828a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (m_webView->client())
829a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        m_webView->client()->didUpdateTextOfFocusedElementByNonUserInput();
830a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
831a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
832197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid ChromeClientImpl::showImeIfNeeded()
833197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
834197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (m_webView->client())
835197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        m_webView->client()->showImeIfNeeded();
836197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
837197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
83851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void ChromeClientImpl::handleKeyboardEventOnTextField(HTMLInputElement& inputElement, KeyboardEvent& event)
83951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
84051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!m_webView->autofillClient())
84151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return;
84251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_webView->autofillClient()->textFieldDidReceiveKeyDown(WebInputElement(&inputElement), WebKeyboardEventBuilder(event));
84351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
84451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
84509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// FIXME: Remove this code once we have input routing in the browser
84609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// process. See http://crbug.com/339659.
84709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void ChromeClientImpl::forwardInputEvent(
848e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Frame* frame, Event* event)
84909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
850197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // FIXME: Input event forwarding to out-of-process frames is broken until
851197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // WebRemoteFrameImpl has a WebFrameClient.
852197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (frame->isRemoteFrame())
853197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return;
854197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
855197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(toLocalFrame(frame));
85609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
85709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // This is only called when we have out-of-process iframes, which
85809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // need to forward input events across processes.
85909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // FIXME: Add a check for out-of-process iframes enabled.
86009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (event->isKeyboardEvent()) {
861e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        WebKeyboardEventBuilder webEvent(*static_cast<KeyboardEvent*>(event));
86209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        webFrame->client()->forwardInputEvent(&webEvent);
86309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    } else if (event->isMouseEvent()) {
864e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        WebMouseEventBuilder webEvent(webFrame->frameView(), frame->ownerRenderer(), *static_cast<MouseEvent*>(event));
86509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // Internal Blink events should not be forwarded.
86609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (webEvent.type == WebInputEvent::Undefined)
86709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return;
86809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
86909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        webFrame->client()->forwardInputEvent(&webEvent);
87009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    } else if (event->isWheelEvent()) {
871e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        WebMouseWheelEventBuilder webEvent(webFrame->frameView(), frame->ownerRenderer(), *static_cast<WheelEvent*>(event));
87209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (webEvent.type == WebInputEvent::Undefined)
87309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return;
87409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        webFrame->client()->forwardInputEvent(&webEvent);
87509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
87609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
87709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
878d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void ChromeClientImpl::didChangeValueInTextField(HTMLFormControlElement& element)
879d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
880d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_webView->autofillClient())
881d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
882d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_webView->autofillClient()->textFieldDidChange(WebFormControlElement(&element));
883d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
884d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
88551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void ChromeClientImpl::didEndEditingOnTextField(HTMLInputElement& inputElement)
88651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
88751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_webView->autofillClient())
88851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_webView->autofillClient()->textFieldDidEndEditing(WebInputElement(&inputElement));
88909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
89051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
89109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void ChromeClientImpl::openTextDataListChooser(HTMLInputElement& input)
89209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
89309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_webView->autofillClient())
89409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_webView->autofillClient()->openTextDataListChooser(WebInputElement(&input));
89551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
89651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
89751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink
898