1643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*
2643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Google Inc. All rights reserved.
3db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
5643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Redistribution and use in source and binary forms, with or without
6643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * modification, are permitted provided that the following conditions are
7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * met:
8643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
9643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Redistributions of source code must retain the above copyright
10643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * notice, this list of conditions and the following disclaimer.
11643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Redistributions in binary form must reproduce the above
12643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * copyright notice, this list of conditions and the following disclaimer
13643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * in the documentation and/or other materials provided with the
14643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * distribution.
15643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Neither the name of Google Inc. nor the names of its
16643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * contributors may be used to endorse or promote products derived from
17643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * this software without specific prior written permission.
18643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
19643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30643ca7872b450ea4efacab6188849e5aac2ba161Steve Block */
31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "config.h"
33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "ChromeClientImpl.h"
34643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
35643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "AXObjectCache.h"
36967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "AccessibilityObject.h"
37643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Console.h"
38643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Cursor.h"
39643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "DatabaseTracker.h"
40643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Document.h"
41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "DocumentLoader.h"
42e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "ExternalPopupMenu.h"
43643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "FileChooser.h"
44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "FloatRect.h"
45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "FrameLoadRequest.h"
46643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "FrameView.h"
47692e5dbf12901edacf14812a6fae25462920af42Steve Block#include "Geolocation.h"
48692e5dbf12901edacf14812a6fae25462920af42Steve Block#include "GeolocationService.h"
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "GraphicsLayer.h"
50545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "HTMLNames.h"
51643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "HitTestResult.h"
52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "IntRect.h"
53e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "NavigationAction.h"
54643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Node.h"
55643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "NotificationPresenterImpl.h"
56643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Page.h"
572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "PlatformBridge.h"
58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "PopupMenuChromium.h"
59a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "RenderWidget.h"
60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "ScriptController.h"
6168513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "SearchPopupMenuChromium.h"
62db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include "SecurityOrigin.h"
634a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch#include "Settings.h"
64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if USE(V8)
65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "V8Proxy.h"
66643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
67643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebAccessibilityObject.h"
68643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebConsoleMessage.h"
69643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebCursorInfo.h"
70643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebFileChooserCompletionImpl.h"
71643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebFrameClient.h"
72643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebFrameImpl.h"
732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "WebIconLoadingCompletionImpl.h"
74643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebInputEvent.h"
75643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebKit.h"
766c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include "WebNode.h"
77a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebPlugin.h"
78a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "WebPluginContainerImpl.h"
79643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebPopupMenuImpl.h"
80643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebPopupMenuInfo.h"
81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "WebPopupType.h"
82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebRect.h"
8381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "WebSettings.h"
84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebTextDirection.h"
85643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebURLRequest.h"
86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebViewClient.h"
87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebViewImpl.h"
8821939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "WebWindowFeatures.h"
89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WindowFeatures.h"
90643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WrappedResourceRequest.h"
912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/unicode/CharacterNames.h>
92643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
93643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockusing namespace WebCore;
94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
95643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocknamespace WebKit {
96643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// Converts a WebCore::PopupContainerType to a WebKit::WebPopupType.
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic WebPopupType convertPopupType(PopupContainer::PopupType type)
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    switch (type) {
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PopupContainer::Select:
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return WebPopupTypeSelect;
103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PopupContainer::Suggestion:
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return WebPopupTypeSuggestion;
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    default:
106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ASSERT_NOT_REACHED();
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return WebPopupTypeNone;
108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
11168513a70bcd92384395513322f1b801e7bf9c729Steve Block// Converts a WebCore::AXObjectCache::AXNotification to a WebKit::WebAccessibilityNotification
11268513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic WebAccessibilityNotification toWebAccessibilityNotification(AXObjectCache::AXNotification notification)
11368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
11468513a70bcd92384395513322f1b801e7bf9c729Steve Block    switch (notification) {
11568513a70bcd92384395513322f1b801e7bf9c729Steve Block    case AXObjectCache::AXActiveDescendantChanged:
11668513a70bcd92384395513322f1b801e7bf9c729Steve Block        return WebAccessibilityNotificationActiveDescendantChanged;
11768513a70bcd92384395513322f1b801e7bf9c729Steve Block    case AXObjectCache::AXCheckedStateChanged:
11868513a70bcd92384395513322f1b801e7bf9c729Steve Block        return WebAccessibilityNotificationCheckedStateChanged;
11968513a70bcd92384395513322f1b801e7bf9c729Steve Block    case AXObjectCache::AXChildrenChanged:
12068513a70bcd92384395513322f1b801e7bf9c729Steve Block        return WebAccessibilityNotificationChildrenChanged;
12168513a70bcd92384395513322f1b801e7bf9c729Steve Block    case AXObjectCache::AXFocusedUIElementChanged:
12268513a70bcd92384395513322f1b801e7bf9c729Steve Block        return WebAccessibilityNotificationFocusedUIElementChanged;
12368513a70bcd92384395513322f1b801e7bf9c729Steve Block    case AXObjectCache::AXLayoutComplete:
12468513a70bcd92384395513322f1b801e7bf9c729Steve Block        return WebAccessibilityNotificationLayoutComplete;
12568513a70bcd92384395513322f1b801e7bf9c729Steve Block    case AXObjectCache::AXLoadComplete:
12668513a70bcd92384395513322f1b801e7bf9c729Steve Block        return WebAccessibilityNotificationLoadComplete;
12768513a70bcd92384395513322f1b801e7bf9c729Steve Block    case AXObjectCache::AXSelectedChildrenChanged:
12868513a70bcd92384395513322f1b801e7bf9c729Steve Block        return WebAccessibilityNotificationSelectedChildrenChanged;
12968513a70bcd92384395513322f1b801e7bf9c729Steve Block    case AXObjectCache::AXSelectedTextChanged:
13068513a70bcd92384395513322f1b801e7bf9c729Steve Block        return WebAccessibilityNotificationSelectedTextChanged;
13168513a70bcd92384395513322f1b801e7bf9c729Steve Block    case AXObjectCache::AXValueChanged:
13268513a70bcd92384395513322f1b801e7bf9c729Steve Block        return WebAccessibilityNotificationValueChanged;
13368513a70bcd92384395513322f1b801e7bf9c729Steve Block    case AXObjectCache::AXScrolledToAnchor:
13468513a70bcd92384395513322f1b801e7bf9c729Steve Block        return WebAccessibilityNotificationScrolledToAnchor;
13568513a70bcd92384395513322f1b801e7bf9c729Steve Block    case AXObjectCache::AXLiveRegionChanged:
13668513a70bcd92384395513322f1b801e7bf9c729Steve Block        return WebAccessibilityNotificationLiveRegionChanged;
13768513a70bcd92384395513322f1b801e7bf9c729Steve Block    case AXObjectCache::AXMenuListValueChanged:
13868513a70bcd92384395513322f1b801e7bf9c729Steve Block        return WebAccessibilityNotificationMenuListValueChanged;
13968513a70bcd92384395513322f1b801e7bf9c729Steve Block    case AXObjectCache::AXRowCountChanged:
14068513a70bcd92384395513322f1b801e7bf9c729Steve Block        return WebAccessibilityNotificationRowCountChanged;
14168513a70bcd92384395513322f1b801e7bf9c729Steve Block    case AXObjectCache::AXRowCollapsed:
14268513a70bcd92384395513322f1b801e7bf9c729Steve Block        return WebAccessibilityNotificationRowCollapsed;
14368513a70bcd92384395513322f1b801e7bf9c729Steve Block    case AXObjectCache::AXRowExpanded:
14468513a70bcd92384395513322f1b801e7bf9c729Steve Block        return WebAccessibilityNotificationRowExpanded;
14568513a70bcd92384395513322f1b801e7bf9c729Steve Block    default:
14668513a70bcd92384395513322f1b801e7bf9c729Steve Block        ASSERT_NOT_REACHED();
14768513a70bcd92384395513322f1b801e7bf9c729Steve Block        return WebAccessibilityNotificationInvalid;
14868513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
14968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
15068513a70bcd92384395513322f1b801e7bf9c729Steve Block
151643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockChromeClientImpl::ChromeClientImpl(WebViewImpl* webView)
152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    : m_webView(webView)
153643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_toolbarsVisible(true)
154643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_statusbarVisible(true)
155643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_scrollbarsVisible(true)
156643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_menubarVisible(true)
157643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_resizable(true)
158643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
160643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
161643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockChromeClientImpl::~ChromeClientImpl()
162643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
163643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
164643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
16554cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Blockvoid* ChromeClientImpl::webView() const
16654cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block{
16754cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    return static_cast<void*>(m_webView);
16854cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block}
16954cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block
170643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::chromeDestroyed()
171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
172643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Our lifetime is bound to the WebViewImpl.
173643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
174643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
175643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::setWindowRect(const FloatRect& r)
176643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_webView->client())
178643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_webView->client()->setWindowRect(IntRect(r));
179643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
180643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
181643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockFloatRect ChromeClientImpl::windowRect()
182643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebRect rect;
184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_webView->client())
185643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        rect = m_webView->client()->rootWindowRect();
186643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else {
187643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // These numbers will be fairly wrong. The window's x/y coordinates will
188643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // be the top left corner of the screen and the size will be the content
189643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // size instead of the window size.
190643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        rect.width = m_webView->size().width;
191643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        rect.height = m_webView->size().height;
192643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
193643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return FloatRect(rect);
194643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
195643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
196643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockFloatRect ChromeClientImpl::pageRect()
197643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // We hide the details of the window's border thickness from the web page by
199643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // simple re-using the window position here.  So, from the point-of-view of
200643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // the web page, the window has no border.
201643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return windowRect();
202643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
203643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
204643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockfloat ChromeClientImpl::scaleFactor()
205643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
206643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // This is supposed to return the scale factor of the web page. It looks like
207643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // the implementor of the graphics layer is responsible for doing most of the
208643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // operations associated with scaling. However, this value is used ins some
209643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // cases by WebCore. For example, this is used as a scaling factor in canvas
210643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // so that things drawn in it are scaled just like the web page is.
211643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    //
212643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // We don't currently implement scaling, so just return 1.0 (no scaling).
213643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return 1.0;
214643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
215643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
216643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::focus()
217643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
218545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (m_webView->client())
219545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        m_webView->client()->didFocus();
220643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
221643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
222643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::unfocus()
223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
224643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_webView->client())
225643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_webView->client()->didBlur();
226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
228643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool ChromeClientImpl::canTakeFocus(FocusDirection)
229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
230643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // For now the browser can always take focus if we're not running layout
231643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // tests.
232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return !layoutTestMode();
233643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
234643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
235643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::takeFocus(FocusDirection direction)
236643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
237643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_webView->client())
238643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
239643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (direction == FocusDirectionBackward)
240643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_webView->client()->focusPrevious();
241643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else
242643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_webView->client()->focusNext();
243643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
244643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
245643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::focusedNodeChanged(Node* node)
246643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_webView->client()->focusedNodeChanged(WebNode(node));
2486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
249545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    WebURL focusURL;
250643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (node && node->isLink()) {
251643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // This HitTestResult hack is the easiest way to get a link URL out of a
252643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // WebCore::Node.
253545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        HitTestResult hitTest(IntPoint(0, 0));
254643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // This cast must be valid because of the isLink() check.
255545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        hitTest.setURLElement(static_cast<Element*>(node));
256545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (hitTest.isLiveLink())
257545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            focusURL = hitTest.absoluteLinkURL();
258545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
259545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    m_webView->client()->setKeyboardFocusURL(focusURL);
260643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
261643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
26228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid ChromeClientImpl::focusedFrameChanged(Frame*)
26328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
26428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
26528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
266643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPage* ChromeClientImpl::createWindow(
267e14391e94c850b8bd03680c23b38978db68687a8John Reck    Frame* frame, const FrameLoadRequest& r, const WindowFeatures& features, const NavigationAction&)
268643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
269643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_webView->client())
270643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return 0;
271643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WrappedResourceRequest request;
27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!r.resourceRequest().isEmpty())
27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        request.bind(r.resourceRequest());
275643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebViewImpl* newView = static_cast<WebViewImpl*>(
27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_webView->client()->createView(WebFrameImpl::fromFrame(frame), request, features, r.frameName()));
277643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!newView)
278643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return 0;
279643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
280643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return newView->page();
281643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
282643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
283643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic inline bool currentEventShouldCauseBackgroundTab(const WebInputEvent* inputEvent)
284643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
285643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!inputEvent)
286643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
287643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
288643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (inputEvent->type != WebInputEvent::MouseUp)
289643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
290643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
291643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    const WebMouseEvent* mouseEvent = static_cast<const WebMouseEvent*>(inputEvent);
292643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
293643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebNavigationPolicy policy;
294643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    unsigned short buttonNumber;
295643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    switch (mouseEvent->button) {
296643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case WebMouseEvent::ButtonLeft:
297643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        buttonNumber = 0;
298643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        break;
299643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case WebMouseEvent::ButtonMiddle:
300643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        buttonNumber = 1;
301643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        break;
302643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case WebMouseEvent::ButtonRight:
303643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        buttonNumber = 2;
304643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        break;
305643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    default:
306643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
307643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
308643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool ctrl = mouseEvent->modifiers & WebMouseEvent::ControlKey;
309643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool shift = mouseEvent->modifiers & WebMouseEvent::ShiftKey;
310643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool alt = mouseEvent->modifiers & WebMouseEvent::AltKey;
311643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool meta = mouseEvent->modifiers & WebMouseEvent::MetaKey;
312643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
313643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!WebViewImpl::navigationPolicyFromMouseEvent(buttonNumber, ctrl, shift, alt, meta, &policy))
314643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
315643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
316643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return policy == WebNavigationPolicyNewBackgroundTab;
317643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
318643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
319643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::show()
320643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
321643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_webView->client())
322643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
323643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
324643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // If our default configuration was modified by a script or wasn't
325643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // created by a user gesture, then show as a popup. Else, let this
326643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // new window be opened as a toplevel window.
327643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool asPopup = !m_toolbarsVisible
328643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        || !m_statusbarVisible
329643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        || !m_scrollbarsVisible
330643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        || !m_menubarVisible
331643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        || !m_resizable;
332643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
333643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebNavigationPolicy policy = WebNavigationPolicyNewForegroundTab;
334643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (asPopup)
335643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        policy = WebNavigationPolicyNewPopup;
336643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (currentEventShouldCauseBackgroundTab(WebViewImpl::currentInputEvent()))
337643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        policy = WebNavigationPolicyNewBackgroundTab;
338643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
339643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_webView->client()->show(policy);
340643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
341643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
342643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool ChromeClientImpl::canRunModal()
343643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
344643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return !!m_webView->client();
345643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
346643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
347643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::runModal()
348643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
349643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_webView->client())
350643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_webView->client()->runModal();
351643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
352643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
353643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::setToolbarsVisible(bool value)
354643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
355643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_toolbarsVisible = value;
356643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
357643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
358643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool ChromeClientImpl::toolbarsVisible()
359643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
360643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return m_toolbarsVisible;
361643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
362643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
363643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::setStatusbarVisible(bool value)
364643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
365643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_statusbarVisible = value;
366643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
367643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
368643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool ChromeClientImpl::statusbarVisible()
369643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
370643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return m_statusbarVisible;
371643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
372643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
373643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::setScrollbarsVisible(bool value)
374643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
375643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_scrollbarsVisible = value;
37668513a70bcd92384395513322f1b801e7bf9c729Steve Block    WebFrameImpl* webFrame = static_cast<WebFrameImpl*>(m_webView->mainFrame());
37768513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (webFrame)
37868513a70bcd92384395513322f1b801e7bf9c729Steve Block        webFrame->setCanHaveScrollbars(value);
379643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
380643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
381643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool ChromeClientImpl::scrollbarsVisible()
382643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
383643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return m_scrollbarsVisible;
384643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
385643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
386643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::setMenubarVisible(bool value)
387643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
388643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_menubarVisible = value;
389643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
390643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
391643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool ChromeClientImpl::menubarVisible()
392643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
393643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return m_menubarVisible;
394643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
395643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
396643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::setResizable(bool value)
397643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
398643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_resizable = value;
399643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
400643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
401643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::addMessageToConsole(MessageSource source,
402643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                           MessageType type,
403643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                           MessageLevel level,
404643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                           const String& message,
405643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                           unsigned lineNumber,
406643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                           const String& sourceID)
407643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
408643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_webView->client()) {
409643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_webView->client()->didAddMessageToConsole(
410643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            WebConsoleMessage(static_cast<WebConsoleMessage::Level>(level), message),
411643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            sourceID,
412643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            lineNumber);
413643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
414643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
415643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
416643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool ChromeClientImpl::canRunBeforeUnloadConfirmPanel()
417643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
418643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return !!m_webView->client();
419643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
420643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
421643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool ChromeClientImpl::runBeforeUnloadConfirmPanel(const String& message, Frame* frame)
422643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
423643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_webView->client()) {
424643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return m_webView->client()->runModalBeforeUnloadDialog(
425643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            WebFrameImpl::fromFrame(frame), message);
426643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
427643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return false;
428643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
429643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
430643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::closeWindowSoon()
431643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
432643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Make sure this Page can no longer be found by JS.
433643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_webView->page()->setGroupName(String());
434643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
435643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Make sure that all loading is stopped.  Ensures that JS stops executing!
436643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_webView->mainFrame()->stopLoading();
437643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
438643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_webView->client())
439643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_webView->client()->closeWidgetSoon();
440643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
441643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
442643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Although a Frame is passed in, we don't actually use it, since we
443643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// already know our own m_webView.
444643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::runJavaScriptAlert(Frame* frame, const String& message)
445643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
446643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_webView->client()) {
447643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_webView->client()->runModalAlertDialog(
448643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            WebFrameImpl::fromFrame(frame), message);
449643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
450643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
451643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
452643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// See comments for runJavaScriptAlert().
453643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool ChromeClientImpl::runJavaScriptConfirm(Frame* frame, const String& message)
454643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
455643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_webView->client()) {
456643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return m_webView->client()->runModalConfirmDialog(
457643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            WebFrameImpl::fromFrame(frame), message);
458643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
459643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return false;
460643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
461643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
462643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// See comments for runJavaScriptAlert().
463643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool ChromeClientImpl::runJavaScriptPrompt(Frame* frame,
464643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                           const String& message,
465643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                           const String& defaultValue,
466643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                           String& result)
467643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
468643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_webView->client()) {
469643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        WebString actualValue;
470643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        bool ok = m_webView->client()->runModalPromptDialog(
471643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            WebFrameImpl::fromFrame(frame),
472643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            message,
473643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            defaultValue,
474643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            &actualValue);
475643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (ok)
476643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            result = actualValue;
477643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return ok;
478643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
479643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return false;
480643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
481643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
482643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::setStatusbarText(const String& message)
483643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
484643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_webView->client())
485643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_webView->client()->setStatusText(message);
486643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
487643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
488643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool ChromeClientImpl::shouldInterruptJavaScript()
489643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
490643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // FIXME: implement me
491643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return false;
492643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
493643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
49481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochKeyboardUIMode ChromeClientImpl::keyboardUIMode()
495643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
49681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return m_webView->tabsToLinks() ? KeyboardAccessTabsToLinks : KeyboardAccessDefault;
497643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
498643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
499643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockIntRect ChromeClientImpl::windowResizerRect() const
500643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
501643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    IntRect result;
502643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_webView->client())
503643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        result = m_webView->client()->windowResizerRect();
504643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return result;
505643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
506643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
5072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(REGISTER_PROTOCOL_HANDLER)
5082fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid ChromeClientImpl::registerProtocolHandler(const String& scheme, const String& baseURL, const String& url, const String& title)
5092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
51081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_webView->client()->registerProtocolHandler(scheme, baseURL, url, title);
5112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
5122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
5132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
514dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ChromeClientImpl::invalidateWindow(const IntRect&, bool)
515dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
516dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    notImplemented();
517dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
518dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
519dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ChromeClientImpl::invalidateContentsAndWindow(const IntRect& updateRect, bool /*immediate*/)
520643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (updateRect.isEmpty())
522643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
52368513a70bcd92384395513322f1b801e7bf9c729Steve Block#if USE(ACCELERATED_COMPOSITING)
52468513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!m_webView->isAcceleratedCompositingActive()) {
52568513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
52668513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (m_webView->client())
52768513a70bcd92384395513322f1b801e7bf9c729Steve Block            m_webView->client()->didInvalidateRect(updateRect);
52868513a70bcd92384395513322f1b801e7bf9c729Steve Block#if USE(ACCELERATED_COMPOSITING)
52968513a70bcd92384395513322f1b801e7bf9c729Steve Block    } else
53068513a70bcd92384395513322f1b801e7bf9c729Steve Block        m_webView->invalidateRootLayerRect(updateRect);
53168513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
533dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
534dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ChromeClientImpl::invalidateContentsForSlowScroll(const IntRect& updateRect, bool immediate)
535dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
536e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    m_webView->hidePopups();
537dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    invalidateContentsAndWindow(updateRect, immediate);
538643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
539643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
540ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#if ENABLE(REQUEST_ANIMATION_FRAME)
541ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid ChromeClientImpl::scheduleAnimation()
542ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
543ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    m_webView->client()->scheduleAnimation();
544ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
545ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#endif
546ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
547643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::scroll(
548643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    const IntSize& scrollDelta, const IntRect& scrollRect,
549643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    const IntRect& clipRect)
550643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
551e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    m_webView->hidePopups();
55268513a70bcd92384395513322f1b801e7bf9c729Steve Block#if USE(ACCELERATED_COMPOSITING)
55368513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!m_webView->isAcceleratedCompositingActive()) {
55468513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
55568513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (m_webView->client()) {
55668513a70bcd92384395513322f1b801e7bf9c729Steve Block            int dx = scrollDelta.width();
55768513a70bcd92384395513322f1b801e7bf9c729Steve Block            int dy = scrollDelta.height();
55868513a70bcd92384395513322f1b801e7bf9c729Steve Block            m_webView->client()->didScrollRect(dx, dy, clipRect);
55968513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
56068513a70bcd92384395513322f1b801e7bf9c729Steve Block#if USE(ACCELERATED_COMPOSITING)
56168513a70bcd92384395513322f1b801e7bf9c729Steve Block    } else
56268513a70bcd92384395513322f1b801e7bf9c729Steve Block        m_webView->scrollRootLayerRect(scrollDelta, clipRect);
56368513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
564643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
565643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
566643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockIntPoint ChromeClientImpl::screenToWindow(const IntPoint&) const
567643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
568643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    notImplemented();
569643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return IntPoint();
570643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
571643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
572643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockIntRect ChromeClientImpl::windowToScreen(const IntRect& rect) const
573643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
574643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    IntRect screenRect(rect);
575643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
576643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_webView->client()) {
577643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        WebRect windowRect = m_webView->client()->windowRect();
578643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        screenRect.move(windowRect.x, windowRect.y);
579643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
580643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
581643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return screenRect;
582643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
583643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
584643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::contentsSizeChanged(Frame* frame, const IntSize& size) const
585643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
586643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebFrameImpl* webframe = WebFrameImpl::fromFrame(frame);
587643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (webframe->client())
588643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        webframe->client()->didChangeContentsSize(webframe, size);
589643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
590643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
591643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::scrollbarsModeDidChange() const
592643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
593643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
594643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
595643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::mouseDidMoveOverElement(
596643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    const HitTestResult& result, unsigned modifierFlags)
597643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
598643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_webView->client())
599643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
600a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
601a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    WebURL url;
602643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Find out if the mouse is over a link, and if so, let our UI know...
603643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (result.isLiveLink() && !result.absoluteLinkURL().string().isEmpty())
604a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        url = result.absoluteLinkURL();
605a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    else if (result.innerNonSharedNode()
606a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch             && (result.innerNonSharedNode()->hasTagName(HTMLNames::objectTag)
607a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                 || result.innerNonSharedNode()->hasTagName(HTMLNames::embedTag))) {
608a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        RenderObject* object = result.innerNonSharedNode()->renderer();
609a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (object && object->isWidget()) {
610a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            Widget* widget = toRenderWidget(object)->widget();
611a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (widget && widget->isPluginContainer()) {
612a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                WebPluginContainerImpl* plugin = static_cast<WebPluginContainerImpl*>(widget);
613a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                url = plugin->plugin()->linkAtPosition(result.point());
614a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            }
615a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
616a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
617a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
618a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_webView->client()->setMouseOverURL(url);
619643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
620643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
621643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::setToolTip(const String& tooltipText, TextDirection dir)
622643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
623643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_webView->client())
624643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
625643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebTextDirection textDirection = (dir == RTL) ?
626643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        WebTextDirectionRightToLeft :
627643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        WebTextDirectionLeftToRight;
628643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_webView->client()->setToolTipText(
629643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        tooltipText, textDirection);
630643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
631643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
632643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::print(Frame* frame)
633643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
634643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_webView->client())
635643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_webView->client()->printPage(WebFrameImpl::fromFrame(frame));
636643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
637643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
638643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::exceededDatabaseQuota(Frame* frame, const String& databaseName)
639643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
640643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Chromium users cannot currently change the default quota
641643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
642643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
643643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if ENABLE(OFFLINE_WEB_APPLICATIONS)
644643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::reachedMaxAppCacheSize(int64_t spaceNeeded)
645643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
646643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT_NOT_REACHED();
647643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
648db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
649db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid ChromeClientImpl::reachedApplicationCacheOriginQuota(SecurityOrigin*)
650db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{
651db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    ASSERT_NOT_REACHED();
652db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block}
653643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
654643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
655643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> fileChooser)
656643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
657643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebViewClient* client = m_webView->client();
658643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!client)
659643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
660643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
661d0825bca7fe65beaee391d30da42e937db621564Steve Block    WebFileChooserParams params;
662d0825bca7fe65beaee391d30da42e937db621564Steve Block    params.multiSelect = fileChooser->allowsMultipleFiles();
663967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if ENABLE(DIRECTORY_UPLOAD)
664967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    params.directory = fileChooser->allowsDirectoryUpload();
665967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#else
666967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    params.directory = false;
667967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif
668d0825bca7fe65beaee391d30da42e937db621564Steve Block    params.acceptTypes = fileChooser->acceptTypes();
669d0825bca7fe65beaee391d30da42e937db621564Steve Block    params.selectedFiles = fileChooser->filenames();
670d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (params.selectedFiles.size() > 0)
671d0825bca7fe65beaee391d30da42e937db621564Steve Block        params.initialValue = params.selectedFiles[0];
672643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebFileChooserCompletionImpl* chooserCompletion =
673643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        new WebFileChooserCompletionImpl(fileChooser);
674d0825bca7fe65beaee391d30da42e937db621564Steve Block
675d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (client->runFileChooser(params, chooserCompletion))
676d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
677d0825bca7fe65beaee391d30da42e937db621564Steve Block
678d0825bca7fe65beaee391d30da42e937db621564Steve Block    // Choosing failed, so do callback with an empty list.
679d0825bca7fe65beaee391d30da42e937db621564Steve Block    chooserCompletion->didChooseFile(WebVector<WebString>());
680643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
681643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
6822fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid ChromeClientImpl::chooseIconForFiles(const Vector<String>& filenames, FileChooser* fileChooser)
683692e5dbf12901edacf14812a6fae25462920af42Steve Block{
6842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_webView->client())
6852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
6862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WebIconLoadingCompletionImpl* iconCompletion = new WebIconLoadingCompletionImpl(fileChooser);
6872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_webView->client()->queryIconForFiles(filenames, iconCompletion))
6882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        iconCompletion->didLoadIcon(WebData());
689692e5dbf12901edacf14812a6fae25462920af42Steve Block}
690692e5dbf12901edacf14812a6fae25462920af42Steve Block
6912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(DIRECTORY_UPLOAD)
6922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid ChromeClientImpl::enumerateChosenDirectory(const String& path, FileChooser* fileChooser)
6932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
6942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    WebViewClient* client = m_webView->client();
6952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!client)
6962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
6972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    WebFileChooserCompletionImpl* chooserCompletion =
6992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        new WebFileChooserCompletionImpl(fileChooser);
7002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // If the enumeration can't happen, call the callback with an empty list.
7022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!client->enumerateChosenDirectory(path, chooserCompletion))
7032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        chooserCompletion->didChooseFile(WebVector<WebString>());
7042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
7052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
7062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
707643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::popupOpened(PopupContainer* popupContainer,
708643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                   const IntRect& bounds,
709643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                   bool handleExternally)
710643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
711643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_webView->client())
712643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
713643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
714643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebWidget* webwidget;
715643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (handleExternally) {
716643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        WebPopupMenuInfo popupInfo;
717643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        getPopupMenuInfo(popupContainer, &popupInfo);
718643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        webwidget = m_webView->client()->createPopupMenu(popupInfo);
719dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
720dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        webwidget = m_webView->client()->createPopupMenu(
721dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            convertPopupType(popupContainer->popupType()));
72221939df44de1705786c545cd1bf519d47250322dBen Murdoch        // We only notify when the WebView has to handle the popup, as when
72321939df44de1705786c545cd1bf519d47250322dBen Murdoch        // the popup is handled externally, the fact that a popup is showing is
72421939df44de1705786c545cd1bf519d47250322dBen Murdoch        // transparent to the WebView.
72521939df44de1705786c545cd1bf519d47250322dBen Murdoch        m_webView->popupOpened(popupContainer);
726dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
727643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    static_cast<WebPopupMenuImpl*>(webwidget)->Init(popupContainer, bounds);
728643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
729643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
730dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ChromeClientImpl::popupClosed(WebCore::PopupContainer* popupContainer)
731643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
732dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_webView->popupClosed(popupContainer);
733dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
734643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
735ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid ChromeClientImpl::setCursor(const WebCore::Cursor& cursor)
736ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
737ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    setCursor(WebCursorInfo(cursor));
738ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
739ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
740dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ChromeClientImpl::setCursor(const WebCursorInfo& cursor)
741dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
742643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_webView->client())
743643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_webView->client()->didChangeCursor(cursor);
744643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
745643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
746643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::setCursorForPlugin(const WebCursorInfo& cursor)
747643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
748643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    setCursor(cursor);
749643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
750643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
751643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::formStateDidChange(const Node* node)
752643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
753643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // The current history item is not updated yet.  That happens lazily when
754643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // WebFrame::currentHistoryItem is requested.
755643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebFrameImpl* webframe = WebFrameImpl::fromFrame(node->document()->frame());
756643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (webframe->client())
757643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        webframe->client()->didUpdateCurrentHistoryItem(webframe);
758643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
759643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
760643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ChromeClientImpl::getPopupMenuInfo(PopupContainer* popupContainer,
761643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                        WebPopupMenuInfo* info)
762643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
763643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    const Vector<PopupItem*>& inputItems = popupContainer->popupData();
764643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
7652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WebVector<WebMenuItemInfo> outputItems(inputItems.size());
766643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
767643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    for (size_t i = 0; i < inputItems.size(); ++i) {
768643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        const PopupItem& inputItem = *inputItems[i];
7692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        WebMenuItemInfo& outputItem = outputItems[i];
770643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
771643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        outputItem.label = inputItem.label;
772643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        outputItem.enabled = inputItem.enabled;
7732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (inputItem.textDirection == WebCore::RTL)
7742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            outputItem.textDirection = WebTextDirectionRightToLeft;
7752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        else
7762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            outputItem.textDirection = WebTextDirectionLeftToRight;
7772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        outputItem.hasTextDirectionOverride = inputItem.hasTextDirectionOverride;
778643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
779643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        switch (inputItem.type) {
780643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        case PopupItem::TypeOption:
7812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            outputItem.type = WebMenuItemInfo::Option;
782643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            break;
783643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        case PopupItem::TypeGroup:
7842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            outputItem.type = WebMenuItemInfo::Group;
785643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            break;
786643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        case PopupItem::TypeSeparator:
7872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            outputItem.type = WebMenuItemInfo::Separator;
788643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            break;
789643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        default:
790643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            ASSERT_NOT_REACHED();
791643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
792643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
793643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
794643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    info->itemHeight = popupContainer->menuItemHeight();
795dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    info->itemFontSize = popupContainer->menuItemFontSize();
796643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    info->selectedIndex = popupContainer->selectedIndex();
797643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    info->items.swap(outputItems);
7986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    info->rightAligned = popupContainer->menuStyle().textDirection() == RTL;
799643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
800643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
80168513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid ChromeClientImpl::postAccessibilityNotification(AccessibilityObject* obj, AXObjectCache::AXNotification notification)
80268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
80368513a70bcd92384395513322f1b801e7bf9c729Steve Block    // Alert assistive technology about the accessibility object notification.
80468513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (obj)
80568513a70bcd92384395513322f1b801e7bf9c729Steve Block        m_webView->client()->postAccessibilityNotification(WebAccessibilityObject(obj), toWebAccessibilityNotification(notification));
80668513a70bcd92384395513322f1b801e7bf9c729Steve Block}
80768513a70bcd92384395513322f1b801e7bf9c729Steve Block
808643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if ENABLE(NOTIFICATIONS)
809643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockNotificationPresenter* ChromeClientImpl::notificationPresenter() const
810643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
811643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return m_webView->notificationPresenterImpl();
812643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
813643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
814643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
815f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch// FIXME: Remove ChromeClientImpl::requestGeolocationPermissionForFrame and ChromeClientImpl::cancelGeolocationPermissionRequestForFrame
816f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch// once all ports have moved to client-based geolocation (see https://bugs.webkit.org/show_bug.cgi?id=40373 ).
817f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch// For client-based geolocation, these methods are now implemented as WebGeolocationClient::requestPermission and WebGeolocationClient::cancelPermissionRequest.
818f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch// (see https://bugs.webkit.org/show_bug.cgi?id=50061 ).
819692e5dbf12901edacf14812a6fae25462920af42Steve Blockvoid ChromeClientImpl::requestGeolocationPermissionForFrame(Frame* frame, Geolocation* geolocation)
820692e5dbf12901edacf14812a6fae25462920af42Steve Block{
82165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_NOT_REACHED();
822dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
823dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
824dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ChromeClientImpl::cancelGeolocationPermissionRequestForFrame(Frame* frame, Geolocation* geolocation)
825dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
82665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_NOT_REACHED();
827dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
828dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
829dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if USE(ACCELERATED_COMPOSITING)
830dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ChromeClientImpl::attachRootGraphicsLayer(Frame* frame, GraphicsLayer* graphicsLayer)
831dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
832dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_webView->setRootGraphicsLayer(graphicsLayer ? graphicsLayer->platformLayer() : 0);
833692e5dbf12901edacf14812a6fae25462920af42Steve Block}
834692e5dbf12901edacf14812a6fae25462920af42Steve Block
835dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid ChromeClientImpl::scheduleCompositingLayerSync()
836dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
837dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_webView->setRootLayerNeedsDisplay();
838dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
8395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
8404a156157940f51b91eadd76f6c86f862ec0a1da0Ben MurdochChromeClient::CompositingTriggerFlags ChromeClientImpl::allowedCompositingTriggers() const
8415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
842d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch    // FIXME: RTL style not supported by the compositor yet.
843d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch    if (!m_webView->allowsAcceleratedCompositing() || m_webView->pageHasRTLStyle())
8444a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch        return 0;
8454a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
8464a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    CompositingTriggerFlags flags = 0;
8474a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    Settings* settings = m_webView->page()->settings();
8484a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    if (settings->acceleratedCompositingFor3DTransformsEnabled())
8494a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch        flags |= ThreeDTransformTrigger;
8504a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    if (settings->acceleratedCompositingForVideoEnabled())
8514a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch        flags |= VideoTrigger;
8524a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    if (settings->acceleratedCompositingForPluginsEnabled())
8534a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch        flags |= PluginTrigger;
8544a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    if (settings->acceleratedCompositingForAnimationEnabled())
8554a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch        flags |= AnimationTrigger;
8564a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    if (settings->acceleratedCompositingForCanvasEnabled())
8574a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch        flags |= CanvasTrigger;
8584a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
8594a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    return flags;
8605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
861db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#endif
862967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
863545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochbool ChromeClientImpl::supportsFullscreenForNode(const WebCore::Node* node)
864545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
865545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (m_webView->client() && node->hasTagName(WebCore::HTMLNames::videoTag))
866545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return m_webView->client()->supportsFullscreen();
867545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return false;
868545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
869545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
870545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid ChromeClientImpl::enterFullscreenForNode(WebCore::Node* node)
871545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
872545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (m_webView->client())
873545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        m_webView->client()->enterFullscreenForNode(WebNode(node));
874545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
875545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
876545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid ChromeClientImpl::exitFullscreenForNode(WebCore::Node* node)
877545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
878545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (m_webView->client())
879545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        m_webView->client()->exitFullscreenForNode(WebNode(node));
880545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
881545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
88281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if ENABLE(FULLSCREEN_API)
8832bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool ChromeClientImpl::supportsFullScreenForElement(const WebCore::Element* element, bool withKeyboard)
88481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
88581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return m_webView->page()->settings()->fullScreenEnabled();
88681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
88781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
88881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid ChromeClientImpl::enterFullScreenForElement(WebCore::Element* element)
88981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
89081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // FIXME: We may need to call these someplace else when window resizes.
89181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    element->document()->webkitWillEnterFullScreenForElement(element);
89281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    element->document()->webkitDidEnterFullScreenForElement(element);
89381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
89481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
89581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid ChromeClientImpl::exitFullScreenForElement(WebCore::Element* element)
89681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
89781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // FIXME: We may need to call these someplace else when window resizes.
89881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    element->document()->webkitWillExitFullScreenForElement(element);
89981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    element->document()->webkitDidExitFullScreenForElement(element);
90081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
90181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
90281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid ChromeClientImpl::fullScreenRendererChanged(RenderBox*)
90381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
90481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    notImplemented();
90581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
90681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
90781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
908db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockbool ChromeClientImpl::selectItemWritingDirectionIsNatural()
909db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{
910db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    return false;
911db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block}
912db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
9132fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool ChromeClientImpl::selectItemAlignmentFollowsMenuWritingDirection()
9142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return true;
9162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
918db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockPassRefPtr<PopupMenu> ChromeClientImpl::createPopupMenu(PopupMenuClient* client) const
919db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{
920e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (WebViewImpl::useExternalPopupMenus())
921e14391e94c850b8bd03680c23b38978db68687a8John Reck        return adoptRef(new ExternalPopupMenu(client, m_webView->client()));
9226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
923db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    return adoptRef(new PopupMenuChromium(client));
924db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block}
925db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
926db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockPassRefPtr<SearchPopupMenu> ChromeClientImpl::createSearchPopupMenu(PopupMenuClient* client) const
927db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{
928db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    return adoptRef(new SearchPopupMenuChromium(client));
929db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block}
930db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
9312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid ChromeClientImpl::willRunModalDialogDuringPageDismissal(const DialogType& dialogType) const
9322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
9332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    PlatformBridge::histogramEnumeration("Renderer.ModalDialogsDuringPageDismissal", static_cast<int>(dialogType), static_cast<int>(NumDialogTypes));
9342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
9352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
936643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} // namespace WebKit
937