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"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "ChromeClientImpl.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "ColorChooserPopupUIController.h"
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "ColorChooserUIController.h"
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "DateTimeChooserImpl.h"
38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "ExternalDateTimeChooser.h"
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "ExternalPopupMenu.h"
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "HTMLNames.h"
4193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "PopupContainer.h"
4293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "PopupMenuChromium.h"
4393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "RuntimeEnabledFeatures.h"
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "WebAccessibilityObject.h"
45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "WebAutofillClient.h"
46e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebColorChooser.h"
47e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebConsoleMessage.h"
48e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebCursorInfo.h"
49e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebFileChooserCompletionImpl.h"
50e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebFrameClient.h"
51e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebFrameImpl.h"
52e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebInputElement.h"
53e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebInputEvent.h"
54e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebKit.h"
55e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebNode.h"
56e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebPasswordGeneratorClient.h"
57e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebPlugin.h"
58e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebPluginContainerImpl.h"
59e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebPopupMenuImpl.h"
60e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebPopupMenuInfo.h"
61e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebPopupType.h"
62e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebSettings.h"
63e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebSettingsImpl.h"
64e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebTextDirection.h"
65e6d4491e48613634a83c1957c72759da80987961Ben Murdoch#include "WebUserGestureIndicator.h"
66e6d4491e48613634a83c1957c72759da80987961Ben Murdoch#include "WebUserGestureToken.h"
67e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebViewClient.h"
68e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebViewImpl.h"
69e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebWindowFeatures.h"
7053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptController.h"
71e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/accessibility/AXObjectCache.h"
72e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/accessibility/AccessibilityObject.h"
7353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
7453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Node.h"
7553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h"
7653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/DocumentLoader.h"
7753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoadRequest.h"
7853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/NavigationAction.h"
7953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Console.h"
8053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameView.h"
8153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h"
8253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/PagePopupDriver.h"
8353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Settings.h"
84e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/page/WindowFeatures.h"
85e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/platform/ColorChooser.h"
86e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/platform/ColorChooserClient.h"
8753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/Cursor.h"
8853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/DateTimeChooser.h"
8953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/FileChooser.h"
9053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/PlatformScreen.h"
91e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/platform/chromium/support/WrappedResourceRequest.h"
9253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/FloatRect.h"
935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/platform/graphics/GraphicsLayer.h"
9453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/IntRect.h"
9553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/HitTestResult.h"
9653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderWidget.h"
9753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/geolocation/Geolocation.h"
985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/Platform.h"
995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebRect.h"
1005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebURLRequest.h"
101e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "weborigin/SecurityOrigin.h"
102591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/CString.h"
103591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/StringBuilder.h"
104591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/StringConcatenate.h"
105591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/unicode/CharacterNames.h"
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WebCore;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebKit {
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Converts a WebCore::PopupContainerType to a WebKit::WebPopupType.
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static WebPopupType convertPopupType(PopupContainer::PopupType type)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (type) {
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PopupContainer::Select:
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebPopupTypeSelect;
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PopupContainer::Suggestion:
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebPopupTypeSuggestion;
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebPopupTypeNone;
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Converts a WebCore::AXObjectCache::AXNotification to a WebKit::WebAccessibilityNotification
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static WebAccessibilityNotification toWebAccessibilityNotification(AXObjectCache::AXNotification notification)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // These enums have the same values; enforced in AssertMatchingEnums.cpp.
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<WebAccessibilityNotification>(notification);
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ChromeClientImpl::ChromeClientImpl(WebViewImpl* webView)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_webView(webView)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_toolbarsVisible(true)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_statusbarVisible(true)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_scrollbarsVisible(true)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_menubarVisible(true)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_resizable(true)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_pagePopupDriver(webView)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ChromeClientImpl::~ChromeClientImpl()
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void* ChromeClientImpl::webView() const
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<void*>(m_webView);
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::chromeDestroyed()
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Our lifetime is bound to the WebViewImpl.
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setWindowRect(const FloatRect& r)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->setWindowRect(IntRect(r));
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatRect ChromeClientImpl::windowRect()
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebRect rect;
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rect = m_webView->client()->rootWindowRect();
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else {
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // These numbers will be fairly wrong. The window's x/y coordinates will
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // be the top left corner of the screen and the size will be the content
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // size instead of the window size.
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rect.width = m_webView->size().width;
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rect.height = m_webView->size().height;
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return FloatRect(rect);
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatRect ChromeClientImpl::pageRect()
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We hide the details of the window's border thickness from the web page by
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // simple re-using the window position here.  So, from the point-of-view of
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the web page, the window has no border.
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return windowRect();
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::focus()
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->didFocus();
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::unfocus()
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->didBlur();
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::canTakeFocus(FocusDirection)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For now the browser can always take focus if we're not running layout
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // tests.
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !layoutTestMode();
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::takeFocus(FocusDirection direction)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->client())
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (direction == FocusDirectionBackward)
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->focusPrevious();
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->focusNext();
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::focusedNodeChanged(Node* node)
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->client()->focusedNodeChanged(WebNode(node));
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebURL focusURL;
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (node && node->isLink()) {
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // This HitTestResult hack is the easiest way to get a link URL out of a
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // WebCore::Node.
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HitTestResult hitTest(IntPoint(0, 0));
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // This cast must be valid because of the isLink() check.
225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        hitTest.setURLElement(toElement(node));
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (hitTest.isLiveLink())
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            focusURL = hitTest.absoluteLinkURL();
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->client()->setKeyboardFocusURL(focusURL);
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Page* ChromeClientImpl::createWindow(
233591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    Frame* frame, const FrameLoadRequest& r, const WindowFeatures& features, const NavigationAction& action, NavigationPolicy navigationPolicy)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->client())
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
238591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    WebNavigationPolicy policy = static_cast<WebNavigationPolicy>(navigationPolicy);
239591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (policy == WebNavigationPolicyIgnore)
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        policy = getNavigationPolicy();
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WrappedResourceRequest request;
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!r.resourceRequest().isEmpty())
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        request.bind(r.resourceRequest());
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (!action.resourceRequest().isEmpty())
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        request.bind(action.resourceRequest());
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebViewImpl* newView = static_cast<WebViewImpl*>(
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->createView(WebFrameImpl::fromFrame(frame), request, features, r.frameName(), policy));
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!newView)
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return newView->page();
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
254591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochstatic inline void updatePolicyForEvent(const WebInputEvent* inputEvent, NavigationPolicy* policy)
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!inputEvent || inputEvent->type != WebInputEvent::MouseUp)
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const WebMouseEvent* mouseEvent = static_cast<const WebMouseEvent*>(inputEvent);
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned short buttonNumber;
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (mouseEvent->button) {
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebMouseEvent::ButtonLeft:
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        buttonNumber = 0;
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebMouseEvent::ButtonMiddle:
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        buttonNumber = 1;
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebMouseEvent::ButtonRight:
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        buttonNumber = 2;
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool ctrl = mouseEvent->modifiers & WebMouseEvent::ControlKey;
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool shift = mouseEvent->modifiers & WebMouseEvent::ShiftKey;
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool alt = mouseEvent->modifiers & WebMouseEvent::AltKey;
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool meta = mouseEvent->modifiers & WebMouseEvent::MetaKey;
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
280591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    NavigationPolicy userPolicy = *policy;
281591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    navigationPolicyFromMouseEvent(buttonNumber, ctrl, shift, alt, meta, &userPolicy);
282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // User and app agree that we want a new window; let the app override the decorations.
283591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (userPolicy == NavigationPolicyNewWindow && *policy == NavigationPolicyNewPopup)
284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    *policy = userPolicy;
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebNavigationPolicy ChromeClientImpl::getNavigationPolicy()
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If our default configuration was modified by a script or wasn't
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // created by a user gesture, then show as a popup. Else, let this
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // new window be opened as a toplevel window.
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool asPopup = !m_toolbarsVisible
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !m_statusbarVisible
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !m_scrollbarsVisible
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !m_menubarVisible
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !m_resizable;
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
299591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    NavigationPolicy policy = NavigationPolicyNewForegroundTab;
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (asPopup)
301591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        policy = NavigationPolicyNewPopup;
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updatePolicyForEvent(WebViewImpl::currentInputEvent(), &policy);
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
304591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return static_cast<WebNavigationPolicy>(policy);
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
307591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid ChromeClientImpl::show(NavigationPolicy navigationPolicy)
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->client())
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
312591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    WebNavigationPolicy policy = static_cast<WebNavigationPolicy>(navigationPolicy);
313591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (policy == WebNavigationPolicyIgnore)
314591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        policy = getNavigationPolicy();
315591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_webView->client()->show(policy);
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::canRunModal()
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !!m_webView->client();
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::runModal()
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->runModal();
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setToolbarsVisible(bool value)
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_toolbarsVisible = value;
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::toolbarsVisible()
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_toolbarsVisible;
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setStatusbarVisible(bool value)
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_statusbarVisible = value;
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::statusbarVisible()
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_statusbarVisible;
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setScrollbarsVisible(bool value)
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_scrollbarsVisible = value;
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebFrameImpl* webFrame = static_cast<WebFrameImpl*>(m_webView->mainFrame());
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (webFrame)
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webFrame->setCanHaveScrollbars(value);
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::scrollbarsVisible()
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_scrollbarsVisible;
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setMenubarVisible(bool value)
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_menubarVisible = value;
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::menubarVisible()
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_menubarVisible;
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setResizable(bool value)
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_resizable = value;
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::addMessageToConsole(MessageSource source,
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           MessageLevel level,
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           const String& message,
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           unsigned lineNumber,
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           const String& sourceID)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client()) {
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->didAddMessageToConsole(
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            WebConsoleMessage(static_cast<WebConsoleMessage::Level>(level), message),
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            sourceID,
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            lineNumber);
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::canRunBeforeUnloadConfirmPanel()
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !!m_webView->client();
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::runBeforeUnloadConfirmPanel(const String& message, Frame* frame)
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client()) {
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_webView->client()->runModalBeforeUnloadDialog(
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            WebFrameImpl::fromFrame(frame), message);
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::closeWindowSoon()
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Make sure this Page can no longer be found by JS.
40853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_webView->page()->clearPageGroup();
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Make sure that all loading is stopped.  Ensures that JS stops executing!
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->mainFrame()->stopLoading();
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->closeWidgetSoon();
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Although a Frame is passed in, we don't actually use it, since we
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// already know our own m_webView.
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::runJavaScriptAlert(Frame* frame, const String& message)
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client()) {
422e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        if (WebUserGestureIndicator::isProcessingUserGesture())
423e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            WebUserGestureIndicator::currentUserGestureToken().setJavascriptPrompt();
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->runModalAlertDialog(
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            WebFrameImpl::fromFrame(frame), message);
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// See comments for runJavaScriptAlert().
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::runJavaScriptConfirm(Frame* frame, const String& message)
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client()) {
433e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        if (WebUserGestureIndicator::isProcessingUserGesture())
434e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            WebUserGestureIndicator::currentUserGestureToken().setJavascriptPrompt();
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_webView->client()->runModalConfirmDialog(
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            WebFrameImpl::fromFrame(frame), message);
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// See comments for runJavaScriptAlert().
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::runJavaScriptPrompt(Frame* frame,
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           const String& message,
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           const String& defaultValue,
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           String& result)
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client()) {
448e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        if (WebUserGestureIndicator::isProcessingUserGesture())
449e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            WebUserGestureIndicator::currentUserGestureToken().setJavascriptPrompt();
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebString actualValue;
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool ok = m_webView->client()->runModalPromptDialog(
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            WebFrameImpl::fromFrame(frame),
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            message,
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            defaultValue,
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            &actualValue);
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (ok)
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result = actualValue;
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ok;
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setStatusbarText(const String& message)
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->setStatusText(message);
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool ChromeClientImpl::tabsToLinks()
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
47153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return m_webView->tabsToLinks();
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect ChromeClientImpl::windowResizerRect() const
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect result;
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = m_webView->client()->windowResizerRect();
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void ChromeClientImpl::invalidateContentsAndRootView(const IntRect& updateRect)
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (updateRect.isEmpty())
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->invalidateRect(updateRect);
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void ChromeClientImpl::invalidateContentsForSlowScroll(const IntRect& updateRect)
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
49153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    invalidateContentsAndRootView(updateRect);
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::scheduleAnimation()
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->scheduleAnimation();
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::scroll(
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const IntSize& scrollDelta, const IntRect& scrollRect,
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const IntRect& clipRect)
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->isAcceleratedCompositingActive()) {
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_webView->client()) {
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int dx = scrollDelta.width();
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int dy = scrollDelta.height();
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_webView->client()->didScrollRect(dx, dy, intersection(scrollRect, clipRect));
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->scrollRootLayerRect(scrollDelta, clipRect);
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntPoint ChromeClientImpl::screenToRootView(const IntPoint& point) const
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint windowPoint(point);
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client()) {
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebRect windowRect = m_webView->client()->windowRect();
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        windowPoint.move(-windowRect.x, -windowRect.y);
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return windowPoint;
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect ChromeClientImpl::rootViewToScreen(const IntRect& rect) const
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect screenRect(rect);
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client()) {
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebRect windowRect = m_webView->client()->windowRect();
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        screenRect.move(windowRect.x, windowRect.y);
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return screenRect;
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)WebScreenInfo ChromeClientImpl::screenInfo() const
53853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
53953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return m_webView->client() ? m_webView->client()->screenInfo() : WebScreenInfo();
54053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
54153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::contentsSizeChanged(Frame* frame, const IntSize& size) const
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->didChangeContentsSize();
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebFrameImpl* webframe = WebFrameImpl::fromFrame(frame);
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    webframe->didChangeContentsSize(size);
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (webframe->client())
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webframe->client()->didChangeContentsSize(webframe, size);
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void ChromeClientImpl::deviceOrPageScaleFactorChanged() const
55353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
55453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_webView->deviceOrPageScaleFactorChanged();
55553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
55653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
55753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void ChromeClientImpl::didProgrammaticallyScroll(Frame* frame, const IntPoint& scrollPoint) const
55853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
55953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ASSERT(frame->view()->inProgrammaticScroll());
56053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (frame->page()->mainFrame() == frame)
56153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        m_webView->didProgrammaticallyScroll(scrollPoint);
56253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
56353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::layoutUpdated(Frame* frame) const
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->layoutUpdated(WebFrameImpl::fromFrame(frame));
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::mouseDidMoveOverElement(
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const HitTestResult& result, unsigned modifierFlags)
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->client())
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebURL url;
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Find out if the mouse is over a link, and if so, let our UI know...
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (result.isLiveLink() && !result.absoluteLinkURL().string().isEmpty())
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        url = result.absoluteLinkURL();
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (result.innerNonSharedNode()
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             && (result.innerNonSharedNode()->hasTagName(HTMLNames::objectTag)
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 || result.innerNonSharedNode()->hasTagName(HTMLNames::embedTag))) {
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderObject* object = result.innerNonSharedNode()->renderer();
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (object && object->isWidget()) {
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Widget* widget = toRenderWidget(object)->widget();
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (widget && widget->isPluginContainer()) {
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                WebPluginContainerImpl* plugin = static_cast<WebPluginContainerImpl*>(widget);
587926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                url = plugin->plugin()->linkAtPosition(result.roundedPointInInnerNodeFrame());
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->client()->setMouseOverURL(url);
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setToolTip(const String& tooltipText, TextDirection dir)
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->client())
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebTextDirection textDirection = (dir == RTL) ?
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebTextDirectionRightToLeft :
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebTextDirectionLeftToRight;
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->client()->setToolTipText(
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        tooltipText, textDirection);
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::dispatchViewportPropertiesDidChange(const ViewportArguments& arguments) const
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
60893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    m_webView->updatePageDefinedPageScaleConstraints(arguments);
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::print(Frame* frame)
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->printPage(WebFrameImpl::fromFrame(frame));
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassOwnPtr<ColorChooser> ChromeClientImpl::createColorChooser(ColorChooserClient* chooserClient, const Color&)
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
619926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    OwnPtr<ColorChooserUIController> controller;
62093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (RuntimeEnabledFeatures::pagePopupEnabled())
62193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        controller = adoptPtr(new ColorChooserPopupUIController(this, chooserClient));
62293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    else
62393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        controller = adoptPtr(new ColorChooserUIController(this, chooserClient));
624926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    controller->openUI();
625926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return controller.release();
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassOwnPtr<WebColorChooser> ChromeClientImpl::createWebColorChooser(WebColorChooserClient* chooserClient, const WebColor& initialColor)
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebViewClient* client = m_webView->client();
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!client)
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return nullptr;
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return adoptPtr(client->createColorChooser(chooserClient, initialColor));
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<DateTimeChooser> ChromeClientImpl::openDateTimeChooser(DateTimeChooserClient* pickerClient, const DateTimeChooserParameters& parameters)
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return DateTimeChooserImpl::create(this, pickerClient, parameters);
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else
640926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return ExternalDateTimeChooser::create(this, m_webView->client(), pickerClient, parameters);
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> fileChooser)
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebViewClient* client = m_webView->client();
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!client)
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebFileChooserParams params;
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    params.multiSelect = fileChooser->settings().allowsMultipleFiles;
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    params.directory = fileChooser->settings().allowsDirectoryUpload;
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    params.acceptTypes = fileChooser->settings().acceptTypes();
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    params.selectedFiles = fileChooser->settings().selectedFiles;
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (params.selectedFiles.size() > 0)
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        params.initialValue = params.selectedFiles[0];
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(MEDIA_CAPTURE)
658e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    params.useMediaCapture = fileChooser->settings().useMediaCapture;
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebFileChooserCompletionImpl* chooserCompletion =
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        new WebFileChooserCompletionImpl(fileChooser);
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (client->runFileChooser(params, chooserCompletion))
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Choosing failed, so do callback with an empty list.
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    chooserCompletion->didChooseFile(WebVector<WebString>());
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::enumerateChosenDirectory(FileChooser* fileChooser)
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebViewClient* client = m_webView->client();
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!client)
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebFileChooserCompletionImpl* chooserCompletion =
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        new WebFileChooserCompletionImpl(fileChooser);
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(fileChooser && fileChooser->settings().selectedFiles.size());
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the enumeration can't happen, call the callback with an empty list.
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!client->enumerateChosenDirectory(fileChooser->settings().selectedFiles[0], chooserCompletion))
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        chooserCompletion->didChooseFile(WebVector<WebString>());
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::popupOpened(PopupContainer* popupContainer,
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   const IntRect& bounds,
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   bool handleExternally)
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For Autofill popups, if the popup will not be fully visible, we shouldn't
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // show it at all. Among other things, this prevents users from being able
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // to interact via the keyboard with an invisible popup.
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (popupContainer->popupType() == PopupContainer::Suggestion) {
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        FrameView* view = m_webView->page()->mainFrame()->view();
695926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        IntRect visibleRect = view->visibleContentRect(ScrollableArea::IncludeScrollbars);
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // |bounds| is in screen coordinates, so make sure to convert it to
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // content coordinates prior to comparing to |visibleRect|.
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect screenRect = bounds;
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        screenRect.setLocation(view->screenToContents(bounds.location()));
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!visibleRect.contains(screenRect)) {
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_webView->hideAutofillPopup();
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->client())
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebWidget* webwidget;
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (handleExternally) {
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebPopupMenuInfo popupInfo;
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        getPopupMenuInfo(popupContainer, &popupInfo);
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webwidget = m_webView->client()->createPopupMenu(popupInfo);
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webwidget = m_webView->client()->createPopupMenu(
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            convertPopupType(popupContainer->popupType()));
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We only notify when the WebView has to handle the popup, as when
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // the popup is handled externally, the fact that a popup is showing is
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // transparent to the WebView.
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->popupOpened(popupContainer);
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
722926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    static_cast<WebPopupMenuImpl*>(webwidget)->initialize(popupContainer, bounds);
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::popupClosed(WebCore::PopupContainer* popupContainer)
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->popupClosed(popupContainer);
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setCursor(const WebCore::Cursor& cursor)
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setCursor(WebCursorInfo(cursor));
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setCursor(const WebCursorInfo& cursor)
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
737926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#if OS(DARWIN)
738926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // On Mac the mousemove event propagates to both the popup and main window.
739926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // If a popup is open we don't want the main window to change the cursor.
740926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_webView->hasOpenedPopup())
741926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
742926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->didChangeCursor(cursor);
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setCursorForPlugin(const WebCursorInfo& cursor)
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setCursor(cursor);
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::formStateDidChange(const Node* node)
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webView->client())
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->didChangeFormState(WebNode(const_cast<Node*>(node)));
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The current history item is not updated yet.  That happens lazily when
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // WebFrame::currentHistoryItem is requested.
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebFrameImpl* webframe = WebFrameImpl::fromFrame(node->document()->frame());
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (webframe->client())
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webframe->client()->didUpdateCurrentHistoryItem(webframe);
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::getPopupMenuInfo(PopupContainer* popupContainer,
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        WebPopupMenuInfo* info)
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Vector<PopupItem*>& inputItems = popupContainer->popupData();
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebVector<WebMenuItemInfo> outputItems(inputItems.size());
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < inputItems.size(); ++i) {
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const PopupItem& inputItem = *inputItems[i];
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebMenuItemInfo& outputItem = outputItems[i];
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        outputItem.label = inputItem.label;
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        outputItem.enabled = inputItem.enabled;
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (inputItem.textDirection == WebCore::RTL)
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            outputItem.textDirection = WebTextDirectionRightToLeft;
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            outputItem.textDirection = WebTextDirectionLeftToRight;
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        outputItem.hasTextDirectionOverride = inputItem.hasTextDirectionOverride;
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        switch (inputItem.type) {
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case PopupItem::TypeOption:
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            outputItem.type = WebMenuItemInfo::Option;
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case PopupItem::TypeGroup:
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            outputItem.type = WebMenuItemInfo::Group;
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case PopupItem::TypeSeparator:
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            outputItem.type = WebMenuItemInfo::Separator;
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ASSERT_NOT_REACHED();
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    info->itemHeight = popupContainer->menuItemHeight();
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    info->itemFontSize = popupContainer->menuItemFontSize();
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    info->selectedIndex = popupContainer->selectedIndex();
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    info->items.swap(outputItems);
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    info->rightAligned = popupContainer->menuStyle().textDirection() == RTL;
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::postAccessibilityNotification(AccessibilityObject* obj, AXObjectCache::AXNotification notification)
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Alert assistive technology about the accessibility object notification.
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (obj)
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webView->client()->postAccessibilityNotification(WebAccessibilityObject(obj), toWebAccessibilityNotification(notification));
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
812521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)String ChromeClientImpl::acceptLanguages()
813521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
814521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    return m_webView->client()->acceptLanguages();
815521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
816521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::paintCustomOverhangArea(GraphicsContext* context, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect)
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Frame* frame = m_webView->mainFrameImpl()->frame();
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebPluginContainerImpl* pluginContainer = WebFrameImpl::pluginContainerFromFrame(frame);
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pluginContainer)
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return pluginContainer->paintCustomOverhangArea(context, horizontalOverhangArea, verticalOverhangArea, dirtyRect);
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
826926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)GraphicsLayerFactory* ChromeClientImpl::graphicsLayerFactory() const
827926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
828926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_webView->graphicsLayerFactory();
829926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
830926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::attachRootGraphicsLayer(Frame* frame, GraphicsLayer* graphicsLayer)
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->setRootGraphicsLayer(graphicsLayer);
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::scheduleCompositingLayerFlush()
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->scheduleCompositingLayerSync();
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ChromeClient::CompositingTriggerFlags ChromeClientImpl::allowedCompositingTriggers() const
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->allowsAcceleratedCompositing())
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CompositingTriggerFlags flags = 0;
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Settings* settings = m_webView->page()->settings();
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (settings->acceleratedCompositingFor3DTransformsEnabled())
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        flags |= ThreeDTransformTrigger;
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (settings->acceleratedCompositingForVideoEnabled())
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        flags |= VideoTrigger;
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (settings->acceleratedCompositingForPluginsEnabled())
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        flags |= PluginTrigger;
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (settings->acceleratedCompositingForAnimationEnabled())
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        flags |= AnimationTrigger;
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (settings->acceleratedCompositingForCanvasEnabled())
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        flags |= CanvasTrigger;
858926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (settings->acceleratedCompositingForScrollableFramesEnabled())
859926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        flags |= ScrollableInnerFrameTrigger;
860591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (settings->acceleratedCompositingForFiltersEnabled())
861591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        flags |= FilterTrigger;
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return flags;
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::enterFullScreenForElement(Element* element)
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->enterFullScreenForElement(element);
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::exitFullScreenForElement(Element* element)
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->exitFullScreenForElement(element);
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::hasOpenedPopup() const
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_webView->hasOpenedPopup();
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)PassRefPtr<PopupMenu> ChromeClientImpl::createPopupMenu(Frame& frame, PopupMenuClient* client) const
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (WebViewImpl::useExternalPopupMenus())
88493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return adoptRef(new ExternalPopupMenu(frame, client, m_webView->client()));
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return adoptRef(new PopupMenuChromium(frame, client));
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PagePopup* ChromeClientImpl::openPagePopup(PagePopupClient* client, const IntRect& originBoundsInRootView)
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_pagePopupDriver);
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_pagePopupDriver->openPagePopup(client, originBoundsInRootView);
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::closePagePopup(PagePopup* popup)
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_pagePopupDriver);
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pagePopupDriver->closePagePopup(popup);
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::setPagePopupDriver(PagePopupDriver* driver)
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(driver);
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pagePopupDriver = driver;
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::resetPagePopupDriver()
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pagePopupDriver = m_webView;
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
912e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochbool ChromeClientImpl::isPasswordGenerationEnabled() const
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
914e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    return m_webView->passwordGeneratorClient();
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
917e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochvoid ChromeClientImpl::openPasswordGenerator(HTMLInputElement* input)
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
919e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    ASSERT(isPasswordGenerationEnabled());
920e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    WebInputElement webInput(input);
921e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    m_webView->passwordGeneratorClient()->openPasswordGenerator(webInput);
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::shouldRunModalDialogDuringPageDismissal(const DialogType& dialogType, const String& dialogMessage, FrameLoader::PageDismissalType dismissalType) const
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const char* kDialogs[] = {"alert", "confirm", "prompt", "showModalDialog"};
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int dialog = static_cast<int>(dialogType);
928926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(0 <= dialog && dialog < static_cast<int>(arraysize(kDialogs)));
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const char* kDismissals[] = {"beforeunload", "pagehide", "unload"};
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int dismissal = static_cast<int>(dismissalType) - 1; // Exclude NoDismissal.
932926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(0 <= dismissal && dismissal < static_cast<int>(arraysize(kDismissals)));
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebKit::Platform::current()->histogramEnumeration("Renderer.ModalDialogsDuringPageDismissal", dismissal * arraysize(kDialogs) + dialog, arraysize(kDialogs) * arraysize(kDismissals));
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
93693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    String message = String("Blocked ") + kDialogs[dialog] + "('" + dialogMessage + "') during " + kDismissals[dismissal] + ".";
93793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    m_webView->mainFrame()->addMessageToConsole(WebConsoleMessage(WebConsoleMessage::LevelError, message));
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::shouldRubberBandInDirection(WebCore::ScrollDirection direction) const
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(direction != WebCore::ScrollUp && direction != WebCore::ScrollDown);
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webView->client())
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (direction == WebCore::ScrollLeft)
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return !m_webView->client()->historyBackListCount();
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (direction == WebCore::ScrollRight)
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return !m_webView->client()->historyForwardListCount();
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_NOT_REACHED();
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::numWheelEventHandlersChanged(unsigned numberOfWheelHandlers)
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->numberOfWheelEventHandlersChanged(numberOfWheelHandlers);
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::needTouchEvents(bool needsTouchEvents)
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->hasTouchEventHandlers(needsTouchEvents);
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::requestPointerLock()
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_webView->requestPointerLock();
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::requestPointerUnlock()
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_webView->requestPointerUnlock();
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ChromeClientImpl::isPointerLocked()
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_webView->isPointerLocked();
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ChromeClientImpl::annotatedRegionsChanged()
9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebViewClient* client = m_webView->client();
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (client)
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        client->draggableRegionsChanged();
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
99053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void ChromeClientImpl::didAssociateFormControls(const Vector<RefPtr<Element> >& elements)
991926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
992926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_webView->autofillClient())
993926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
994926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebVector<WebNode> elementVector(static_cast<size_t>(elements.size()));
995926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    size_t elementsCount = elements.size();
996926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (size_t i = 0; i < elementsCount; ++i)
997926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        elementVector[i] = elements[i];
998926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_webView->autofillClient()->didAssociateFormControls(elementVector);
999926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1000926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(NAVIGATOR_CONTENT_UTILS)
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassOwnPtr<NavigatorContentUtilsClientImpl> NavigatorContentUtilsClientImpl::create(WebViewImpl* webView)
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return adoptPtr(new NavigatorContentUtilsClientImpl(webView));
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)NavigatorContentUtilsClientImpl::NavigatorContentUtilsClientImpl(WebViewImpl* webView)
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_webView(webView)
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NavigatorContentUtilsClientImpl::registerProtocolHandler(const String& scheme, const String& baseURL, const String& url, const String& title)
101302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webView->client()->registerProtocolHandler(scheme, baseURL, url, title);
101502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch}
10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebKit
1019