18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. 3db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebChromeClient.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "COMPropertyBag.h" 31231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "COMVariantSetter.h" 32ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "DOMCoreClasses.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebElementPropertyBag.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebFrame.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebHistory.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebMutableURLRequest.h" 37231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "WebDesktopNotificationsDelegate.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebSecurityOrigin.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebView.h" 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/BString.h> 410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <WebCore/Console.h> 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/ContextMenu.h> 430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <WebCore/Cursor.h> 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/FileChooser.h> 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/FloatRect.h> 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/FrameLoadRequest.h> 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/FrameView.h> 48d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <WebCore/HTMLNames.h> 49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <WebCore/Icon.h> 505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include <WebCore/LocalWindowsContext.h> 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/LocalizedStrings.h> 52e14391e94c850b8bd03680c23b38978db68687a8John Reck#include <WebCore/NavigationAction.h> 53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <WebCore/NotImplemented.h> 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/Page.h> 55db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include <WebCore/SecurityOrigin.h> 56db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include <WebCore/PopupMenuWin.h> 57db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include <WebCore/SearchPopupMenuWin.h> 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <WebCore/WindowFeatures.h> 592bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <wchar.h> 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 61e14391e94c850b8bd03680c23b38978db68687a8John Reck#if USE(ACCELERATED_COMPOSITING) 62e14391e94c850b8bd03680c23b38978db68687a8John Reck#include <WebCore/GraphicsLayer.h> 63e14391e94c850b8bd03680c23b38978db68687a8John Reck#endif 64e14391e94c850b8bd03680c23b38978db68687a8John Reck 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore; 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// When you call GetOpenFileName, if the size of the buffer is too small, 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// MSDN says that the first two bytes of the buffer contain the required size for the file selection, in bytes or characters 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// So we can assume the required size can't be more than the maximum value for a short. 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const size_t maxFilePathsListSize = USHRT_MAX; 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebChromeClient::WebChromeClient(WebView* webView) 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_webView(webView) 74231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(NOTIFICATIONS) 75231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_notificationsDelegate(new WebDesktopNotificationsDelegate(webView)) 76231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::chromeDestroyed() 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete this; 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::setWindowRect(const FloatRect& r) 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IWebUIDelegate* uiDelegate = 0; 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RECT rect = IntRect(r); 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->setFrame(m_webView, &rect); 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->Release(); 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFloatRect WebChromeClient::windowRect() 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IWebUIDelegate* uiDelegate = 0; 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RECT rect; 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HRESULT retval = uiDelegate->webViewFrame(m_webView, &rect); 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->Release(); 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(retval)) 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return rect; 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return FloatRect(); 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFloatRect WebChromeClient::pageRect() 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RECT rect; 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webView->frameRect(&rect); 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return rect; 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfloat WebChromeClient::scaleFactor() 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Windows doesn't support UI scaling. 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 1.0; 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::focus() 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IWebUIDelegate* uiDelegate = 0; 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->webViewFocus(m_webView); 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->Release(); 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Normally this would happen on a timer, but JS might need to know this earlier, so we'll update here. 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webView->updateActiveState(); 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::unfocus() 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IWebUIDelegate* uiDelegate = 0; 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->webViewUnfocus(m_webView); 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->Release(); 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Normally this would happen on a timer, but JS might need to know this earlier, so we'll update here. 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webView->updateActiveState(); 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebChromeClient::canTakeFocus(FocusDirection direction) 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IWebUIDelegate* uiDelegate = 0; 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL bForward = (direction == FocusDirectionForward) ? TRUE : FALSE; 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL result = FALSE; 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->canTakeFocus(m_webView, bForward, &result); 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->Release(); 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return !!result; 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::takeFocus(FocusDirection direction) 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IWebUIDelegate* uiDelegate = 0; 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL bForward = (direction == FocusDirectionForward) ? TRUE : FALSE; 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->takeFocus(m_webView, bForward); 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->Release(); 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 169643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebChromeClient::focusedNodeChanged(Node*) 170643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 172643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 17328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid WebChromeClient::focusedFrameChanged(Frame*) 17428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 17528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 17628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 177231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic COMPtr<IPropertyBag> createWindowFeaturesPropertyBag(const WindowFeatures& features) 178231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 179231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block HashMap<String, COMVariant> map; 180231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (features.xSet) 181231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block map.set(WebWindowFeaturesXKey, features.x); 182231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (features.ySet) 183231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block map.set(WebWindowFeaturesYKey, features.y); 184231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (features.widthSet) 185231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block map.set(WebWindowFeaturesWidthKey, features.width); 186231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (features.heightSet) 187231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block map.set(WebWindowFeaturesHeightKey, features.height); 188231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block map.set(WebWindowFeaturesMenuBarVisibleKey, features.menuBarVisible); 189231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block map.set(WebWindowFeaturesStatusBarVisibleKey, features.statusBarVisible); 190231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block map.set(WebWindowFeaturesToolBarVisibleKey, features.toolBarVisible); 191231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block map.set(WebWindowFeaturesScrollbarsVisibleKey, features.scrollbarsVisible); 192231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block map.set(WebWindowFeaturesResizableKey, features.resizable); 193231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block map.set(WebWindowFeaturesFullscreenKey, features.fullscreen); 194231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block map.set(WebWindowFeaturesDialogKey, features.dialog); 195231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 196231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return COMPtr<IPropertyBag>(AdoptCOM, COMPropertyBag<COMVariant>::adopt(map)); 197231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 198231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPage* WebChromeClient::createWindow(Frame*, const FrameLoadRequest&, const WindowFeatures& features, const NavigationAction&) 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 201231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block COMPtr<IWebUIDelegate> delegate = uiDelegate(); 202231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!delegate) 203231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return 0; 204231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Just create a blank request because createWindow() is only required to create window but not to load URL. 20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch COMPtr<IWebMutableURLRequest> request(AdoptCOM, WebMutableURLRequest::createInstance()); 207231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 208231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block COMPtr<IWebUIDelegatePrivate2> delegatePrivate(Query, delegate); 209231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (delegatePrivate) { 210231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block COMPtr<IWebView> newWebView; 211231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block HRESULT hr = delegatePrivate->createWebViewWithRequest(m_webView, request.get(), createWindowFeaturesPropertyBag(features).get(), &newWebView); 212231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 213231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (SUCCEEDED(hr) && newWebView) 214231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return core(newWebView.get()); 215231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 216231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // If the delegate doesn't implement the IWebUIDelegatePrivate2 version of the call, fall back 217231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // to the old versions (even if they support the IWebUIDelegatePrivate2 interface). 218231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (hr != E_NOTIMPL) 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 222231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block COMPtr<IWebView> newWebView; 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 224231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (features.dialog) { 225231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (FAILED(delegate->createModalDialog(m_webView, request.get(), &newWebView))) 226231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return 0; 227231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } else if (FAILED(delegate->createWebViewWithRequest(m_webView, request.get(), &newWebView))) 228231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return 0; 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 230231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return newWebView ? core(newWebView.get()) : 0; 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::show() 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IWebUIDelegate* uiDelegate = 0; 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->webViewShow(m_webView); 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->Release(); 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebChromeClient::canRunModal() 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL result = FALSE; 2450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (COMPtr<IWebUIDelegate> delegate = uiDelegate()) 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delegate->canRunModal(m_webView, &result); 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::runModal() 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (COMPtr<IWebUIDelegate> delegate = uiDelegate()) 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delegate->runModal(m_webView); 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::setToolbarsVisible(bool visible) 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IWebUIDelegate* uiDelegate = 0; 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->setToolbarsVisible(m_webView, visible); 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->Release(); 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebChromeClient::toolbarsVisible() 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL result = false; 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IWebUIDelegate* uiDelegate = 0; 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->webViewAreToolbarsVisible(m_webView, &result); 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->Release(); 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result != false; 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::setStatusbarVisible(bool visible) 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IWebUIDelegate* uiDelegate = 0; 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->setStatusBarVisible(m_webView, visible); 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->Release(); 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebChromeClient::statusbarVisible() 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL result = false; 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IWebUIDelegate* uiDelegate = 0; 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->webViewIsStatusBarVisible(m_webView, &result); 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->Release(); 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result != false; 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::setScrollbarsVisible(bool b) 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebFrame* webFrame = m_webView->topLevelFrame(); 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (webFrame) 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webFrame->setAllowsScrolling(b); 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebChromeClient::scrollbarsVisible() 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebFrame* webFrame = m_webView->topLevelFrame(); 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL b = false; 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (webFrame) 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webFrame->allowsScrolling(&b); 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return !!b; 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::setMenubarVisible(bool visible) 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch COMPtr<IWebUIDelegate> delegate = uiDelegate(); 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!delegate) 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delegate->setMenuBarVisible(m_webView, visible); 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebChromeClient::menubarVisible() 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch COMPtr<IWebUIDelegate> delegate = uiDelegate(); 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!delegate) 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL result = true; 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delegate->isMenuBarVisible(m_webView, &result); 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::setResizable(bool resizable) 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IWebUIDelegate* uiDelegate = 0; 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->setResizable(m_webView, resizable); 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->Release(); 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebChromeClient::addMessageToConsole(MessageSource source, MessageType type, MessageLevel level, const String& message, unsigned line, const String& url) 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project COMPtr<IWebUIDelegate> uiDelegate; 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project COMPtr<IWebUIDelegatePrivate> uiPrivate; 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(uiDelegate->QueryInterface(IID_IWebUIDelegatePrivate, (void**)&uiPrivate))) 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiPrivate->webViewAddMessageToConsole(m_webView, BString(message), line, BString(url), true); 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebChromeClient::canRunBeforeUnloadConfirmPanel() 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IWebUIDelegate* ui; 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&ui)) && ui) { 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ui->Release(); 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebChromeClient::runBeforeUnloadConfirmPanel(const String& message, Frame* frame) 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL result = TRUE; 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IWebUIDelegate* ui; 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&ui)) && ui) { 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebFrame* webFrame = kit(frame); 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ui->runBeforeUnloadConfirmPanelWithMessage(m_webView, BString(message), webFrame, &result); 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ui->Release(); 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return !!result; 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::closeWindowSoon() 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We need to remove the parent WebView from WebViewSets here, before it actually 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // closes, to make sure that JavaScript code that executes before it closes 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // can't find it. Otherwise, window.open will select a closed WebView instead of 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // opening a new one <rdar://problem/3572585>. 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We also need to stop the load to prevent further parsing or JavaScript execution 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // after the window has torn down <rdar://problem/4161660>. 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: This code assumes that the UI delegate will respond to a webViewClose 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // message by actually closing the WebView. Safari guarantees this behavior, but other apps might not. 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This approach is an inherent limitation of not making a close execute immediately 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // after a call to window.close. 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webView->setGroupName(0); 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webView->stopLoading(0); 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webView->closeWindowSoon(); 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::runJavaScriptAlert(Frame*, const String& message) 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project COMPtr<IWebUIDelegate> ui; 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&ui))) 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ui->runJavaScriptAlertPanelWithMessage(m_webView, BString(message)); 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebChromeClient::runJavaScriptConfirm(Frame*, const String& message) 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL result = FALSE; 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project COMPtr<IWebUIDelegate> ui; 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&ui))) 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ui->runJavaScriptConfirmPanelWithMessage(m_webView, BString(message), &result); 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return !!result; 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebChromeClient::runJavaScriptPrompt(Frame*, const String& message, const String& defaultValue, String& result) 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project COMPtr<IWebUIDelegate> ui; 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (FAILED(m_webView->uiDelegate(&ui))) 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TimerBase::fireTimersInNestedEventLoop(); 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BSTR resultBSTR = 0; 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (FAILED(ui->runJavaScriptTextInputPanelWithPrompt(m_webView, BString(message), BString(defaultValue), &resultBSTR))) 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (resultBSTR) { 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = String(resultBSTR, SysStringLen(resultBSTR)); 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SysFreeString(resultBSTR); 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::setStatusbarText(const String& statusText) 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project COMPtr<IWebUIDelegate> uiDelegate; 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->setStatusText(m_webView, BString(statusText)); 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebChromeClient::shouldInterruptJavaScript() 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project COMPtr<IWebUIDelegate> uiDelegate; 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project COMPtr<IWebUIDelegatePrivate> uiPrivate; 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(uiDelegate->QueryInterface(IID_IWebUIDelegatePrivate, (void**)&uiPrivate))) { 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL result; 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(uiPrivate->webViewShouldInterruptJavaScript(m_webView, &result))) 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return !!result; 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 45181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochKeyboardUIMode WebChromeClient::keyboardUIMode() 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL enabled = FALSE; 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IWebPreferences* preferences; 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->preferences(&preferences))) 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project preferences->tabsToLinks(&enabled); 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 45881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return enabled ? KeyboardAccessTabsToLinks : KeyboardAccessDefault; 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect WebChromeClient::windowResizerRect() const 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 463231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return IntRect(); 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 466dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebChromeClient::invalidateWindow(const IntRect& windowRect, bool immediate) 467dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 468dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(core(m_webView->topLevelFrame())); 469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_webView->repaint(windowRect, false /*contentChanged*/, immediate, false /*repaintContentOnly*/); 470dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 471dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 472dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebChromeClient::invalidateContentsAndWindow(const IntRect& windowRect, bool immediate) 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(core(m_webView->topLevelFrame())); 475dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_webView->repaint(windowRect, true /*contentChanged*/, immediate /*immediate*/, false /*repaintContentOnly*/); 476dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 477dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 478dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebChromeClient::invalidateContentsForSlowScroll(const IntRect& windowRect, bool immediate) 479dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 480dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(core(m_webView->topLevelFrame())); 481dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_webView->repaint(windowRect, true /*contentChanged*/, immediate, true /*repaintContentOnly*/); 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::scroll(const IntSize& delta, const IntRect& scrollViewRect, const IntRect& clipRect) 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(core(m_webView->topLevelFrame())); 4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webView->scrollBackingStore(core(m_webView->topLevelFrame())->view(), delta.width(), delta.height(), scrollViewRect, clipRect); 4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect WebChromeClient::windowToScreen(const IntRect& rect) const 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HWND viewWindow; 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (FAILED(m_webView->viewWindow(reinterpret_cast<OLE_HANDLE*>(&viewWindow)))) 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return rect; 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Find the top left corner of the Widget's containing window in screen coords, 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // and adjust the result rect's position by this amount. 4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project POINT topLeft = {0, 0}; 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect result = rect; 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::ClientToScreen(viewWindow, &topLeft); 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result.move(topLeft.x, topLeft.y); 5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntPoint WebChromeClient::screenToWindow(const IntPoint& point) const 5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project POINT result = point; 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HWND viewWindow; 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (FAILED(m_webView->viewWindow(reinterpret_cast<OLE_HANDLE*>(&viewWindow)))) 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return point; 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ::ScreenToClient(viewWindow, &result); 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 520231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockPlatformPageClient WebChromeClient::platformPageClient() const 5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HWND viewWindow; 5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (FAILED(m_webView->viewWindow(reinterpret_cast<OLE_HANDLE*>(&viewWindow)))) 5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return viewWindow; 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 528635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid WebChromeClient::contentsSizeChanged(Frame*, const IntSize&) const 529635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 530635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project notImplemented(); 531635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 532635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::mouseDidMoveOverElement(const HitTestResult& result, unsigned modifierFlags) 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project COMPtr<IWebUIDelegate> uiDelegate; 5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (FAILED(m_webView->uiDelegate(&uiDelegate))) 5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project COMPtr<WebElementPropertyBag> element; 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project element.adoptRef(WebElementPropertyBag::createInstance(result)); 5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uiDelegate->mouseDidMoveOverElement(m_webView, element.get(), modifierFlags); 5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 545e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkebool WebChromeClient::shouldMissingPluginMessageBeButton() const 546e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{ 547e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke COMPtr<IWebUIDelegate> uiDelegate; 548e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (FAILED(m_webView->uiDelegate(&uiDelegate))) 549e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return false; 550e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 551e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // If the UI delegate implements IWebUIDelegatePrivate3, 552e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // which contains didPressMissingPluginButton, then the message should be a button. 553e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke COMPtr<IWebUIDelegatePrivate3> uiDelegatePrivate3(Query, uiDelegate); 554e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return uiDelegatePrivate3; 555e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke} 556e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 557ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid WebChromeClient::missingPluginButtonClicked(Element* element) const 558ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{ 559ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block COMPtr<IWebUIDelegate> uiDelegate; 560ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (FAILED(m_webView->uiDelegate(&uiDelegate))) 561ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return; 562ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 563ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block COMPtr<IWebUIDelegatePrivate3> uiDelegatePrivate3(Query, uiDelegate); 564ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (!uiDelegatePrivate3) 565ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return; 566ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 567ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block COMPtr<IDOMElement> e(AdoptCOM, DOMElement::createInstance(element)); 568ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block uiDelegatePrivate3->didPressMissingPluginButton(e.get()); 569ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block} 570ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 5710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebChromeClient::setToolTip(const String& toolTip, TextDirection) 5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webView->setToolTip(toolTip); 5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::print(Frame* frame) 5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project COMPtr<IWebUIDelegate> uiDelegate; 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) 5800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch uiDelegate->printFrame(m_webView, kit(frame)); 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5838ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#if ENABLE(DATABASE) 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::exceededDatabaseQuota(Frame* frame, const String& databaseIdentifier) 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project COMPtr<WebSecurityOrigin> origin(AdoptCOM, WebSecurityOrigin::createInstance(frame->document()->securityOrigin())); 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project COMPtr<IWebUIDelegate> uiDelegate; 5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { 5890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch COMPtr<IWebUIDelegatePrivate> uiDelegatePrivate(Query, uiDelegate); 5900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (uiDelegatePrivate) 5910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch uiDelegatePrivate->exceededDatabaseQuota(m_webView, kit(frame), origin.get(), BString(databaseIdentifier)); 5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: remove this workaround once shipping Safari has the necessary delegate implemented. 5942bde8e466a4451c7319e3a072d118917957d6554Steve Block WCHAR path[MAX_PATH]; 5952bde8e466a4451c7319e3a072d118917957d6554Steve Block HMODULE safariHandle = GetModuleHandleW(L"Safari.exe"); 5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!safariHandle) 5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 59828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu GetModuleFileName(safariHandle, path, WTF_ARRAY_LENGTH(path)); 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DWORD handle; 6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DWORD versionSize = GetFileVersionInfoSize(path, &handle); 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!versionSize) 6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<char> data(versionSize); 6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!GetFileVersionInfo(path, 0, versionSize, data.data())) 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LPCTSTR productVersion; 6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UINT productVersionLength; 6092bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!VerQueryValueW(data.data(), L"\\StringFileInfo\\040904b0\\ProductVersion", (void**)&productVersion, &productVersionLength)) 6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 6112bde8e466a4451c7319e3a072d118917957d6554Steve Block if (wcsncmp(L"3.1", productVersion, productVersionLength) > 0) { 6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const unsigned long long defaultQuota = 5 * 1024 * 1024; // 5 megabytes should hopefully be enough to test storage support. 6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project origin->setQuota(defaultQuota); 6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6188ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#endif 6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 620c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu#if ENABLE(OFFLINE_WEB_APPLICATIONS) 621c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu#include "ApplicationCacheStorage.h" 622c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescuvoid WebChromeClient::reachedMaxAppCacheSize(int64_t spaceNeeded) 623c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu{ 624c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu // FIXME: Free some space. 625c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu notImplemented(); 626c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu} 627db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 628db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid WebChromeClient::reachedApplicationCacheOriginQuota(SecurityOrigin*) 629db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 630db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block notImplemented(); 631db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 632c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu#endif 633c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::populateVisitedLinks() 6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 636cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block COMPtr<IWebHistoryDelegate> historyDelegate; 637cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_webView->historyDelegate(&historyDelegate); 638cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (historyDelegate) { 639cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block historyDelegate->populateVisitedLinksForWebView(m_webView); 640cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return; 641cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 642cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebHistory* history = WebHistory::sharedHistory(); 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!history) 6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project history->addVisitedLinksToPageGroup(m_webView->page()->group()); 6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebChromeClient::paintCustomScrollbar(GraphicsContext* context, const FloatRect& rect, ScrollbarControlSize size, 6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ScrollbarControlState state, ScrollbarPart pressedPart, bool vertical, 6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float value, float proportion, ScrollbarControlPartMask parts) 6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (context->paintingDisabled()) 6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch COMPtr<IWebUIDelegate> delegate = uiDelegate(); 6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!delegate) 6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebScrollbarControlPartMask webParts = WebNoScrollPart; 6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (parts & BackButtonStartPart) // FIXME: Hyatt, what about BackButtonEndPart? 6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webParts |= WebBackButtonPart; 6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (parts & BackTrackPart) 6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webParts |= WebBackTrackPart; 6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (parts & ThumbPart) 6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webParts |= WebThumbPart; 6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (parts & ForwardTrackPart) 6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webParts |= WebForwardTrackPart; 6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (parts & ForwardButtonStartPart) // FIXME: Hyatt, what about ForwardButtonEndPart? 6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webParts |= WebForwardButtonPart; 6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebScrollbarControlPart webPressedPart = WebNoScrollPart; 6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (pressedPart) { 6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BackButtonStartPart: // FIXME: Hyatt, what about BackButtonEndPart? 6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webPressedPart = WebBackButtonPart; 6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case BackTrackPart: 6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webPressedPart = WebBackTrackPart; 6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ThumbPart: 6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webPressedPart = WebThumbPart; 6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ForwardTrackPart: 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webPressedPart = WebForwardTrackPart; 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ForwardButtonStartPart: // FIXME: Hyatt, what about ForwardButtonEndPart? 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webPressedPart = WebForwardButtonPart; 6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebScrollBarControlSize webSize; 6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (size) { 6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case SmallScrollbar: 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webSize = WebSmallScrollbar; 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case RegularScrollbar: 6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webSize = WebRegularScrollbar; 7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebScrollbarControlState webState = 0; 7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (state & ActiveScrollbarState) 7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webState |= WebActiveScrollbarState; 7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (state & EnabledScrollbarState) 7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webState |= WebEnabledScrollbarState; 7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (state & PressedScrollbarState) 7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project webState |= WebPressedScrollbarState; 7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RECT webRect = enclosingIntRect(rect); 7115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick LocalWindowsContext windowsContext(context, webRect); 7125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick HRESULT hr = delegate->paintCustomScrollbar(m_webView, windowsContext.hdc(), webRect, webSize, webState, webPressedPart, 7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project vertical, value, proportion, webParts); 7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SUCCEEDED(hr); 7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebChromeClient::paintCustomScrollCorner(GraphicsContext* context, const FloatRect& rect) 7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (context->paintingDisabled()) 7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch COMPtr<IWebUIDelegate> delegate = uiDelegate(); 7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!delegate) 7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RECT webRect = enclosingIntRect(rect); 7275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick LocalWindowsContext windowsContext(context, webRect); 7285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick HRESULT hr = delegate->paintCustomScrollCorner(m_webView, windowsContext.hdc(), webRect); 7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SUCCEEDED(hr); 7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebChromeClient::runOpenPanel(Frame*, PassRefPtr<FileChooser> prpFileChooser) 7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<FileChooser> fileChooser = prpFileChooser; 7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HWND viewWindow; 7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (FAILED(m_webView->viewWindow(reinterpret_cast<OLE_HANDLE*>(&viewWindow)))) 7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool multiFile = fileChooser->allowsMultipleFiles(); 7412bde8e466a4451c7319e3a072d118917957d6554Steve Block Vector<WCHAR> fileBuf(multiFile ? maxFilePathsListSize : MAX_PATH); 7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OPENFILENAME ofn; 7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project memset(&ofn, 0, sizeof(ofn)); 7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Need to zero out the first char of fileBuf so GetOpenFileName doesn't think it's an initialization string 7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fileBuf[0] = '\0'; 7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ofn.lStructSize = sizeof(ofn); 7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ofn.hwndOwner = viewWindow; 7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String allFiles = allFilesText(); 7532bde8e466a4451c7319e3a072d118917957d6554Steve Block allFiles.append(L"\0*.*\0\0", 6); 7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ofn.lpstrFilter = allFiles.charactersWithNullTermination(); 7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ofn.lpstrFile = fileBuf.data(); 7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ofn.nMaxFile = fileBuf.size(); 7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String dialogTitle = uploadFileText(); 7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ofn.lpstrTitle = dialogTitle.charactersWithNullTermination(); 7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ofn.Flags = OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_EXPLORER; 7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (multiFile) 7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ofn.Flags = ofn.Flags | OFN_ALLOWMULTISELECT; 7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (GetOpenFileName(&ofn)) { 7642bde8e466a4451c7319e3a072d118917957d6554Steve Block WCHAR* files = fileBuf.data(); 7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<String> fileList; 7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String file(files); 7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (multiFile) { 7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (!file.isEmpty()) { 7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // When using the OFN_EXPLORER flag, the file list is null delimited. 7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // When you create a String from a ptr to this list, it will use strlen to look for the null character. 7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Then we find the next file path string by using the length of the string we just created. 7722bde8e466a4451c7319e3a072d118917957d6554Steve Block WCHAR* nextFilePtr = files + file.length() + 1; 7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String nextFile(nextFilePtr); 7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If multiple files are selected, there will be a directory name first, which we don't want to add to the vector. 7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We know a single file was selected if there is only one filename in the list. 7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // In that case, we don't want to skip adding the first (and only) name. 7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (files != fileBuf.data() || nextFile.isEmpty()) 7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fileList.append(file); 7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project files = nextFilePtr; 7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project file = nextFile; 7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fileList.append(file); 7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(fileList.size()); 7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fileChooser->chooseFiles(fileList); 7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Show some sort of error if too many files are selected and the buffer is too small. For now, this will fail silently. 7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 790dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid WebChromeClient::chooseIconForFiles(const Vector<WTF::String>& filenames, WebCore::FileChooser* chooser) 791692e5dbf12901edacf14812a6fae25462920af42Steve Block{ 792dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block chooser->iconLoaded(Icon::createIconForFiles(filenames)); 793692e5dbf12901edacf14812a6fae25462920af42Steve Block} 794692e5dbf12901edacf14812a6fae25462920af42Steve Block 795967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid WebChromeClient::setCursor(const Cursor& cursor) 7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 797967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch HCURSOR platformCursor = cursor.platformCursor()->nativeCursor(); 798967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (!platformCursor) 799967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return; 8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 801f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool shouldSetCursor = true; 8020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (COMPtr<IWebUIDelegate> delegate = uiDelegate()) { 8030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch COMPtr<IWebUIDelegatePrivate> delegatePrivate(Query, delegate); 8040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (delegatePrivate) { 805967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (SUCCEEDED(delegatePrivate->webViewSetCursor(m_webView, reinterpret_cast<OLE_HANDLE>(platformCursor)))) 806f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldSetCursor = false; 8070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 8080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 8090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 810f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (shouldSetCursor) 811f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ::SetCursor(platformCursor); 812f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 813f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch setLastSetCursorToCurrentCursor(); 814967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch} 815967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 816967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid WebChromeClient::setLastSetCursorToCurrentCursor() 817967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{ 818967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch m_webView->setLastCursor(::GetCursor()); 8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 821643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if USE(ACCELERATED_COMPOSITING) 822643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebChromeClient::attachRootGraphicsLayer(Frame* frame, GraphicsLayer* graphicsLayer) 823643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 82465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_webView->setRootChildLayer(graphicsLayer); 825643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 826643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 827643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebChromeClient::scheduleCompositingLayerSync() 828643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 829ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch m_webView->flushPendingGraphicsLayerChangesSoon(); 830643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 831643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 832643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 833643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 8340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochCOMPtr<IWebUIDelegate> WebChromeClient::uiDelegate() 8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch COMPtr<IWebUIDelegate> delegate; 8370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_webView->uiDelegate(&delegate); 8380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return delegate; 8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 840d0825bca7fe65beaee391d30da42e937db621564Steve Block 841d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(VIDEO) 842d0825bca7fe65beaee391d30da42e937db621564Steve Block 843d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool WebChromeClient::supportsFullscreenForNode(const Node* node) 844d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 845d0825bca7fe65beaee391d30da42e937db621564Steve Block return node->hasTagName(HTMLNames::videoTag); 846d0825bca7fe65beaee391d30da42e937db621564Steve Block} 847d0825bca7fe65beaee391d30da42e937db621564Steve Block 848d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid WebChromeClient::enterFullscreenForNode(Node* node) 849d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 850d0825bca7fe65beaee391d30da42e937db621564Steve Block m_webView->enterFullscreenForNode(node); 851d0825bca7fe65beaee391d30da42e937db621564Steve Block} 852d0825bca7fe65beaee391d30da42e937db621564Steve Block 853d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid WebChromeClient::exitFullscreenForNode(Node*) 854d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 855d0825bca7fe65beaee391d30da42e937db621564Steve Block m_webView->exitFullscreen(); 856d0825bca7fe65beaee391d30da42e937db621564Steve Block} 857d0825bca7fe65beaee391d30da42e937db621564Steve Block 858d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 859d0825bca7fe65beaee391d30da42e937db621564Steve Block 860db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockbool WebChromeClient::selectItemWritingDirectionIsNatural() 861db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 862db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block return true; 863db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 864db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 8652fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool WebChromeClient::selectItemAlignmentFollowsMenuWritingDirection() 8662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 8672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return false; 8682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 8692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 870db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockPassRefPtr<PopupMenu> WebChromeClient::createPopupMenu(PopupMenuClient* client) const 871db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 872db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block return adoptRef(new PopupMenuWin(client)); 873db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 874db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 875db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockPassRefPtr<SearchPopupMenu> WebChromeClient::createSearchPopupMenu(PopupMenuClient* client) const 876db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 877db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block return adoptRef(new SearchPopupMenuWin(client)); 878db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 879db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 880