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