ChromeClientAndroid.cpp revision d867a0e9b483e848580a3a98f73a8352884eac2b
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright 2007, The Android Open Source Project
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  * Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  * Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_TAG "WebCore"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu#include "ApplicationCacheStorage.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ChromeClientAndroid.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CString.h"
336172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch#include "DatabaseTracker.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatRect.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoader.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h"
40fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block#include "Geolocation.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Screen.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ScriptController.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreFrameBridge.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreViewBridge.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebViewCore.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WindowFeatures.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android {
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setWebFrame(android::WebFrame* webframe)
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Release(m_webFrame);
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame = webframe;
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Retain(m_webFrame);
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::chromeDestroyed()
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Release(m_webFrame);
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete this;
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setWindowRect(const FloatRect&) { notImplemented(); }
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFloatRect ChromeClientAndroid::windowRect() {
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_webFrame);
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_webFrame)
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return FloatRect();
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameView* frameView = m_webFrame->page()->mainFrame()->view();
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!frameView)
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return FloatRect();
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const WebCoreViewBridge* bridge = frameView->platformWidget();
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const IntRect& rect = bridge->getWindowBounds();
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FloatRect fRect(rect.x(), rect.y(), rect.width(), rect.height());
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return fRect;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFloatRect ChromeClientAndroid::pageRect() { notImplemented(); return FloatRect(); }
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfloat ChromeClientAndroid::scaleFactor()
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8452958546b410557c1b7abb46560fb7f2cd219d6fMike Reed    /*  Conceptually, we should return the density of the device's screen,
8552958546b410557c1b7abb46560fb7f2cd219d6fMike Reed        except that we don't really model webkit's notion of drawing. Webkit
8652958546b410557c1b7abb46560fb7f2cd219d6fMike Reed        expects the drawing context's matrix (plus scale-factor) to reflect the
8752958546b410557c1b7abb46560fb7f2cd219d6fMike Reed        actually transformation to the pixels, and thus it uses scaleFactor to
8852958546b410557c1b7abb46560fb7f2cd219d6fMike Reed        perform some pre-rounding in a few places (e.g. HTMLCanvasElement).
8952958546b410557c1b7abb46560fb7f2cd219d6fMike Reed
9052958546b410557c1b7abb46560fb7f2cd219d6fMike Reed        ASSERT(m_webFrame);
9152958546b410557c1b7abb46560fb7f2cd219d6fMike Reed        return m_webFrame->density();
9252958546b410557c1b7abb46560fb7f2cd219d6fMike Reed
9352958546b410557c1b7abb46560fb7f2cd219d6fMike Reed        However, in Android we capture the drawing into a displayList, and then
9452958546b410557c1b7abb46560fb7f2cd219d6fMike Reed        replay that list at various scale factors (sometimes zoomed out, other
9552958546b410557c1b7abb46560fb7f2cd219d6fMike Reed        times zoomed in for "normal" reading, yet other times at arbitrary
9652958546b410557c1b7abb46560fb7f2cd219d6fMike Reed        zoom values based on the user's choice). In all of these cases, we do
9752958546b410557c1b7abb46560fb7f2cd219d6fMike Reed        not re-record the displayList, hence it is usually harmful to perform
9852958546b410557c1b7abb46560fb7f2cd219d6fMike Reed        any pre-rounding, since we just don't know the actual drawing resolution
9952958546b410557c1b7abb46560fb7f2cd219d6fMike Reed        at record time.
10052958546b410557c1b7abb46560fb7f2cd219d6fMike Reed
10152958546b410557c1b7abb46560fb7f2cd219d6fMike Reed        Given Android's device-independent drawing model, we always return 1.0
10252958546b410557c1b7abb46560fb7f2cd219d6fMike Reed        for this function, and we implement roundToDevicePixels() to be a no-op
10352958546b410557c1b7abb46560fb7f2cd219d6fMike Reed        so that we don't introduce pre-rounding artifacts during record.
10452958546b410557c1b7abb46560fb7f2cd219d6fMike Reed     */
10552958546b410557c1b7abb46560fb7f2cd219d6fMike Reed    return 1.0f;
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::focus() {
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_webFrame);
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Ask the application to focus this WebView.
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->requestFocus();
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::unfocus() { notImplemented(); }
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::canTakeFocus(FocusDirection) { notImplemented(); return false; }
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::takeFocus(FocusDirection) { notImplemented(); }
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPage* ChromeClientAndroid::createWindow(Frame* frame, const FrameLoadRequest&,
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const WindowFeatures& features)
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(frame);
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_MULTIPLE_WINDOWS
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (frame->settings() && !(frame->settings()->supportMultipleWindows()))
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If the client doesn't support multiple windows, just return the current page
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return frame->page();
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WTF::PassRefPtr<WebCore::Screen> screen = WebCore::Screen::create(frame);
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool dialog = features.dialog || !features.resizable
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            || (features.heightSet && features.height < screen.get()->height()
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    && features.widthSet && features.width < screen.get()->width())
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            || (!features.menuBarVisible && !features.statusBarVisible
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    && !features.toolBarVisible && !features.locationBarVisible
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    && !features.scrollbarsVisible);
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // fullscreen definitely means no dialog
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (features.fullscreen)
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dialog = false;
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::Frame* newFrame = m_webFrame->createWindow(dialog,
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            frame->script()->processingUserGesture());
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (newFrame) {
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebCore::Page* page = newFrame->page();
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        page->setGroupName(frame->page()->groupName());
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return page;
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NULL;
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::show() { notImplemented(); }
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::canRunModal() { notImplemented(); return false; }
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::runModal() { notImplemented(); }
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setToolbarsVisible(bool) { notImplemented(); }
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::toolbarsVisible() { notImplemented(); return false; }
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setStatusbarVisible(bool) { notImplemented(); }
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::statusbarVisible() { notImplemented(); return false; }
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setScrollbarsVisible(bool) { notImplemented(); }
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::scrollbarsVisible() { notImplemented(); return false; }
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setMenubarVisible(bool) { notImplemented(); }
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::menubarVisible() { notImplemented(); return false; }
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setResizable(bool) { notImplemented(); }
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called by the JavaScript bindings to print usually an error to
168bf22f208d6fb755dd4ddebbde1a1a3b23e597990Ben Murdoch// a message console. Pass the message to the java side so that the client can
169bf22f208d6fb755dd4ddebbde1a1a3b23e597990Ben Murdoch// handle it as it sees fit.
1702eef744339814ace28e6835115e7e389fb8b7962Andrei Popescuvoid ChromeClientAndroid::addMessageToConsole(MessageSource, MessageType, MessageLevel, const String& message, unsigned int lineNumber, const String& sourceID) {
171bf22f208d6fb755dd4ddebbde1a1a3b23e597990Ben Murdoch    android::WebViewCore::getWebViewCore(m_webFrame->page()->mainFrame()->view())->addMessageToConsole(message, lineNumber, sourceID);
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::canRunBeforeUnloadConfirmPanel() { return true; }
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::runBeforeUnloadConfirmPanel(const String& message, Frame* frame) {
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String url = frame->document()->documentURI();
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return android::WebViewCore::getWebViewCore(frame->view())->jsUnload(url, message);
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::closeWindowSoon()
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_webFrame);
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Page* page = m_webFrame->page();
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* mainFrame = page->mainFrame();
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This will prevent javascript cross-scripting during unload
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    page->setGroupName(String());
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Stop loading but do not send the unload event
188d867a0e9b483e848580a3a98f73a8352884eac2bSteve Block    mainFrame->loader()->stopLoading(UnloadEventPolicyNone);
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cancel all pending loaders
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mainFrame->loader()->stopAllLoaders();
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Remove all event listeners so that no javascript can execute as a result
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // of mouse/keyboard events.
1935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    mainFrame->document()->removeAllEventListeners();
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Close the window.
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->closeWindow(android::WebViewCore::getWebViewCore(mainFrame->view()));
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::runJavaScriptAlert(Frame* frame, const String& message)
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String url = frame->document()->documentURI();
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    android::WebViewCore::getWebViewCore(frame->view())->jsAlert(url, message);
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::runJavaScriptConfirm(Frame* frame, const String& message)
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String url = frame->document()->documentURI();
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return android::WebViewCore::getWebViewCore(frame->view())->jsConfirm(url, message);
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* This function is called for the javascript method Window.prompt(). A dialog should be shown on
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the screen with an input put box. First param is the text, the second is the default value for
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the input box, third is return param. If the function returns true, the value set in the third parameter
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * is provided to javascript, else null is returned to the script.
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::runJavaScriptPrompt(Frame* frame, const String& message, const String& defaultValue, String& result)
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String url = frame->document()->documentURI();
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return android::WebViewCore::getWebViewCore(frame->view())->jsPrompt(url, message, defaultValue, result);
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setStatusbarText(const String&) { notImplemented(); }
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is called by the JavaScript interpreter when a script has been running for a long
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// time. A dialog should be shown to the user asking them if they would like to cancel the
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Javascript. If true is returned, the script is cancelled.
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// To make a device more responsive, we default to return true to disallow long running script.
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This implies that some of scripts will not be completed.
229d15fb80564c4e30b088ca87fa21a03d67675c662Guang Zhubool ChromeClientAndroid::shouldInterruptJavaScript() {
230d15fb80564c4e30b088ca87fa21a03d67675c662Guang Zhu  FrameView* frameView = m_webFrame->page()->mainFrame()->view();
231d15fb80564c4e30b088ca87fa21a03d67675c662Guang Zhu  return android::WebViewCore::getWebViewCore(frameView)->jsInterrupt();
232d15fb80564c4e30b088ca87fa21a03d67675c662Guang Zhu}
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::tabsToLinks() const { return false; }
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect ChromeClientAndroid::windowResizerRect() const { return IntRect(0, 0, 0, 0); }
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// new to change 38068 (Nov 6, 2008)
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::repaint(const IntRect& rect, bool contentChanged,
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool immediate, bool repaintContentOnly) {
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// was in ScrollViewAndroid::update() : needs to be something like:
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//    android::WebViewCore::getWebViewCore(this)->contentInvalidate(rect);
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// new to change 38068 (Nov 6, 2008)
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::scroll(const IntSize& scrollDelta,
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const IntRect& rectToScroll, const IntRect& clipRect) {
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// new to change 38068 (Nov 6, 2008)
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntPoint ChromeClientAndroid::screenToWindow(const IntPoint&) const {
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return IntPoint();
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// new to change 38068 (Nov 6, 2008)
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect ChromeClientAndroid::windowToScreen(const IntRect&) const {
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return IntRect();
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// new to change 38068 (Nov 6, 2008)
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// in place of view()->containingWindow(), webkit now uses view()->hostWindow()->platformWindow()
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPlatformWidget ChromeClientAndroid::platformWindow() const {
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Page* page = m_webFrame->page();
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* mainFrame = page->mainFrame();
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameView* view = mainFrame->view();
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PlatformWidget viewBridge = view->platformWidget();
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return viewBridge;
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ChromeClientAndroid::contentsSizeChanged(Frame*, const IntSize&) const
275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
278635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ChromeClientAndroid::scrollRectIntoView(const IntRect&, const ScrollView*) const
2805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
2815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    notImplemented();
2825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
2835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
284635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ChromeClientAndroid::formStateDidChange(const Node*)
285635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
286635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
287635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
288635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::mouseDidMoveOverElement(const HitTestResult&, unsigned int) {}
2902eef744339814ace28e6835115e7e389fb8b7962Andrei Popescuvoid ChromeClientAndroid::setToolTip(const String&, TextDirection) {}
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::print(Frame*) {}
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2936172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch/*
2946172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * This function is called on the main (webcore) thread by SQLTransaction::deliverQuotaIncreaseCallback.
2956172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * The way that the callback mechanism is designed inside SQLTransaction means that there must be a new quota
2966172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * (which may be equal to the old quota if the user did not allow more quota) when this function returns. As
2976172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * we call into the browser thread to ask what to do with the quota, we block here and get woken up when the
2986172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * browser calls the native WebViewCore::SetDatabaseQuota method with the new quota value.
2996172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch */
3008ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#if ENABLE(DATABASE)
3016172bff036b26f8ea852196733426c6ff608ed8aBen Murdochvoid ChromeClientAndroid::exceededDatabaseQuota(Frame* frame, const String& name)
3026172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch{
3036172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    SecurityOrigin* origin = frame->document()->securityOrigin();
3046172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch
305cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // We want to wait on a new quota from the UI thread. Reset the m_newQuota variable to represent we haven't received a new quota.
306cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    m_newQuota = -1;
3076172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch
308cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // This origin is being tracked and has exceeded it's quota. Call into
309cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // the Java side of things to inform the user.
310cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    unsigned long long currentQuota = 0;
3116172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    if (WebCore::DatabaseTracker::tracker().hasEntryForOrigin(origin)) {
312cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu        currentQuota = WebCore::DatabaseTracker::tracker().quotaForOrigin(origin);
313cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    }
3144dc5706791f76d14261e27a58f50fcf305fcf1b0Ben Murdoch
3154dc5706791f76d14261e27a58f50fcf305fcf1b0Ben Murdoch    unsigned long long estimatedSize = WebCore::DatabaseTracker::tracker().detailsForNameAndOrigin(name, origin).expectedUsage();
3164dc5706791f76d14261e27a58f50fcf305fcf1b0Ben Murdoch
3174dc5706791f76d14261e27a58f50fcf305fcf1b0Ben Murdoch    android::WebViewCore::getWebViewCore(frame->view())->exceededDatabaseQuota(frame->document()->documentURI(), name, currentQuota, estimatedSize);
318cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu
319cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // We've sent notification to the browser so now wait for it to come back.
320cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    m_quotaThreadLock.lock();
321cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    while (m_newQuota == -1) {
322cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu        m_quotaThreadCondition.wait(m_quotaThreadLock);
3236172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    }
324cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    m_quotaThreadLock.unlock();
325cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu
326cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // Update the DatabaseTracker with the new quota value (if the user declined
327cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // new quota, this may equal the old quota)
328cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    DatabaseTracker::tracker().setQuota(origin, m_newQuota);
3296172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch}
3308ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#endif
331c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu#if ENABLE(OFFLINE_WEB_APPLICATIONS)
332c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescuvoid ChromeClientAndroid::reachedMaxAppCacheSize(int64_t spaceNeeded)
333c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu{
3346ec93df1269320cc37facebf7fa3e07a620ee185Andrei Popescu    // Set m_newQuota before calling into the Java side. If we do this after,
3356ec93df1269320cc37facebf7fa3e07a620ee185Andrei Popescu    // we could overwrite the result passed from the Java side and deadlock in the
3366ec93df1269320cc37facebf7fa3e07a620ee185Andrei Popescu    // wait call below.
3376ec93df1269320cc37facebf7fa3e07a620ee185Andrei Popescu    m_newQuota = -1;
338cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    Page* page = m_webFrame->page();
339cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    Frame* mainFrame = page->mainFrame();
340cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    FrameView* view = mainFrame->view();
341cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    android::WebViewCore::getWebViewCore(view)->reachedMaxAppCacheSize(spaceNeeded);
342cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu
343cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // We've sent notification to the browser so now wait for it to come back.
344cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    m_quotaThreadLock.lock();
345cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    while (m_newQuota == -1) {
346cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu       m_quotaThreadCondition.wait(m_quotaThreadLock);
347cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    }
348cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    m_quotaThreadLock.unlock();
349cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    if (m_newQuota > 0) {
350cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu        WebCore::cacheStorage().setMaximumSize(m_newQuota);
351cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu        // Now the app cache will retry the saving the previously failed cache.
352cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    }
353c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu}
354c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu#endif
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3567e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarkevoid ChromeClientAndroid::populateVisitedLinks()
3577e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke{
3587e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke    Page* page = m_webFrame->page();
3597e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke    Frame* mainFrame = page->mainFrame();
3607e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke    FrameView* view = mainFrame->view();
3617e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke    android::WebViewCore::getWebViewCore(view)->populateVisitedLinks(&page->group());
3627e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke}
3637e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke
364fe55045391147883a38ed161b0c80f4e356bd9e0Steve Blockvoid ChromeClientAndroid::requestGeolocationPermissionForFrame(Frame* frame, Geolocation* geolocation)
365fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block{
366fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    ASSERT(geolocation);
367fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    if (!m_geolocationPermissions) {
368fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block        m_geolocationPermissions = new GeolocationPermissions(android::WebViewCore::getWebViewCore(frame->view()),
369fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block                                                              m_webFrame->page()->mainFrame());
370fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    }
371fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    m_geolocationPermissions->queryPermissionState(frame);
372fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block}
373fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block
374fe55045391147883a38ed161b0c80f4e356bd9e0Steve Blockvoid ChromeClientAndroid::provideGeolocationPermissions(const String &origin, bool allow, bool remember)
375fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block{
376fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    ASSERT(m_geolocationPermissions);
377fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    m_geolocationPermissions->providePermissionState(origin, allow, remember);
378fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block}
379fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block
380e7430864058b3c222b4b0468cf8812a9a733818bSteve Blockvoid ChromeClientAndroid::storeGeolocationPermissions()
381e7430864058b3c222b4b0468cf8812a9a733818bSteve Block{
382e7430864058b3c222b4b0468cf8812a9a733818bSteve Block    GeolocationPermissions::maybeStorePermanentPermissions();
383e7430864058b3c222b4b0468cf8812a9a733818bSteve Block}
384e7430864058b3c222b4b0468cf8812a9a733818bSteve Block
385fe55045391147883a38ed161b0c80f4e356bd9e0Steve Blockvoid ChromeClientAndroid::onMainFrameLoadStarted()
386fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block{
387fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    if (m_geolocationPermissions.get())
388fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block        m_geolocationPermissions->resetTemporaryPermissionStates();
389fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block}
390fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block
391bf280393189a33efa29a33c0d96c84710484f2f7Leon Scrogginsvoid ChromeClientAndroid::runOpenPanel(Frame* frame,
392bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins        PassRefPtr<FileChooser> chooser)
393bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins{
394bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins    android::WebViewCore* core = android::WebViewCore::getWebViewCore(
395bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins            frame->view());
396bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins    core->openFileChooser(chooser);
397bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins}
398bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins
3995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool ChromeClientAndroid::setCursor(PlatformCursorHandle)
4005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
4015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    notImplemented();
4025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return false;
4035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4056172bff036b26f8ea852196733426c6ff608ed8aBen Murdochvoid ChromeClientAndroid::wakeUpMainThreadWithNewQuota(long newQuota) {
4066172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    MutexLocker locker(m_quotaThreadLock);
4076172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    m_newQuota = newQuota;
4086172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    m_quotaThreadCondition.signal();
4096172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch}
4106172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
412