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