ChromeClientAndroid.cpp revision ba01ca1ef2bfe8916fafb72fee4a594a0cb2e302
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
163298a7d84b96ade73c6b170671711a8f2792ae59Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER 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"
326172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch#include "DatabaseTracker.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatRect.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoader.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h"
39fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block#include "Geolocation.h"
40797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include "GraphicsLayerAndroid.h"
412c993a2e09dd5636c3c0b8113749ae3acabb575aSteve Block#include "Icon.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h"
439e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block#include "PopupMenuAndroid.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ScriptController.h"
459e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block#include "SearchPopupMenuAndroid.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreFrameBridge.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreViewBridge.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebViewCore.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WindowFeatures.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h"
51ff80790be406da04e7afbd8aea7bb0e26f1f08f0Kristian Monsen#include "UserGestureIndicator.h"
5279768700a853c40c66ff0b0591957958667fdd9eSteve Block#include <wtf/text/CString.h>
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android {
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch#if ENABLE(DATABASE)
57fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdochstatic unsigned long long tryToReclaimDatabaseQuota(SecurityOrigin* originNeedingQuota);
58fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch#endif
59fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
60797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#if USE(ACCELERATED_COMPOSITING)
61797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
626d43b9ceb777071c088fe12ee94af80e34816bcfGrace KlobaWebCore::GraphicsLayer* ChromeClientAndroid::layersSync()
63797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{
646d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (m_rootGraphicsLayer && m_needsLayerSync && m_webFrame) {
656d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        if (FrameView* frameView = m_webFrame->page()->mainFrame()->view())
666d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba            frameView->syncCompositingStateRecursive();
67797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard    }
686d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    m_needsLayerSync = false;
696d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return m_rootGraphicsLayer;
70797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard}
71797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
72797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roardvoid ChromeClientAndroid::scheduleCompositingLayerSync()
73797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{
7482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    if (m_needsLayerSync)
7582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott        return;
7682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    m_needsLayerSync = true;
7782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_webFrame->page()->mainFrame()->view());
7882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    if (webViewCore)
7982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott        webViewCore->layersDraw();
80797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard}
81797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
82797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roardvoid ChromeClientAndroid::setNeedsOneShotDrawingSynchronization()
83797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{
84797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard    // This should not be needed
85797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard}
86797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
876d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid ChromeClientAndroid::attachRootGraphicsLayer(WebCore::Frame*, WebCore::GraphicsLayer* layer)
88797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{
896d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    // frame is not used in Android as we should only get root graphics layer for the main frame
90797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard    m_rootGraphicsLayer = layer;
916d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!layer)
92797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard        return;
934175d59b46f96005f0c64978b1a94e3fe60f1e8eNicolas Roard    scheduleCompositingLayerSync();
94797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard}
95797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
96797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#endif
97797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setWebFrame(android::WebFrame* webframe)
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Release(m_webFrame);
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame = webframe;
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Retain(m_webFrame);
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::chromeDestroyed()
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Release(m_webFrame);
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete this;
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setWindowRect(const FloatRect&) { notImplemented(); }
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFloatRect ChromeClientAndroid::windowRect() {
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_webFrame);
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_webFrame)
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return FloatRect();
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameView* frameView = m_webFrame->page()->mainFrame()->view();
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!frameView)
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return FloatRect();
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const WebCoreViewBridge* bridge = frameView->platformWidget();
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const IntRect& rect = bridge->getWindowBounds();
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FloatRect fRect(rect.x(), rect.y(), rect.width(), rect.height());
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return fRect;
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFloatRect ChromeClientAndroid::pageRect() { notImplemented(); return FloatRect(); }
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfloat ChromeClientAndroid::scaleFactor()
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1309652d6b88e01f27d69c804ac6bc56b527b33c219Grace Kloba    ASSERT(m_webFrame);
1319652d6b88e01f27d69c804ac6bc56b527b33c219Grace Kloba    return m_webFrame->density();
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
134ff80790be406da04e7afbd8aea7bb0e26f1f08f0Kristian Monsenvoid ChromeClientAndroid::focus()
135ff80790be406da04e7afbd8aea7bb0e26f1f08f0Kristian Monsen{
136ff80790be406da04e7afbd8aea7bb0e26f1f08f0Kristian Monsen    ASSERT(m_webFrame);
137ff80790be406da04e7afbd8aea7bb0e26f1f08f0Kristian Monsen    bool isUserGesture = UserGestureIndicator::processingUserGesture();
138bbe299e200c3fe5dbfd0696096de121f9057eb0dKristian Monsen
139ff80790be406da04e7afbd8aea7bb0e26f1f08f0Kristian Monsen    // Ask the application to focus this WebView if the action is intiated by the user
140ff80790be406da04e7afbd8aea7bb0e26f1f08f0Kristian Monsen    if (isUserGesture)
14127e40b2407e7e39b8fde83728baee90aae279760Patrick Scott        m_webFrame->requestFocus();
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::unfocus() { notImplemented(); }
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::canTakeFocus(FocusDirection) { notImplemented(); return false; }
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::takeFocus(FocusDirection) { notImplemented(); }
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
148ba01ca1ef2bfe8916fafb72fee4a594a0cb2e302Leon Scrogginsvoid ChromeClientAndroid::focusedNodeChanged(Node* node)
149ba01ca1ef2bfe8916fafb72fee4a594a0cb2e302Leon Scroggins{
150ba01ca1ef2bfe8916fafb72fee4a594a0cb2e302Leon Scroggins    android::WebViewCore::getWebViewCore(m_webFrame->page()->mainFrame()->view())->focusNodeChanged(node);
151ba01ca1ef2bfe8916fafb72fee4a594a0cb2e302Leon Scroggins}
152ba01ca1ef2bfe8916fafb72fee4a594a0cb2e302Leon Scroggins
15397349b6656c58e631c13b8552b077870a6a32ebaTeng-Hui Zhuvoid ChromeClientAndroid::focusedFrameChanged(Frame*) { notImplemented(); }
154d5340bbd847b3fabb04f28f1aa8425f1874b0bb3Steve Block
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPage* ChromeClientAndroid::createWindow(Frame* frame, const FrameLoadRequest&,
156f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck        const WindowFeatures& features, const NavigationAction&)
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(frame);
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_MULTIPLE_WINDOWS
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (frame->settings() && !(frame->settings()->supportMultipleWindows()))
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If the client doesn't support multiple windows, just return the current page
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return frame->page();
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
165299511d537b620ede57a2bff60a8f27d3c935815Grace Kloba    const WebCoreViewBridge* bridge = frame->view()->platformWidget();
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool dialog = features.dialog || !features.resizable
167299511d537b620ede57a2bff60a8f27d3c935815Grace Kloba            || (features.heightSet && features.height < bridge->height()
168299511d537b620ede57a2bff60a8f27d3c935815Grace Kloba                    && features.widthSet && features.width < bridge->width())
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            || (!features.menuBarVisible && !features.statusBarVisible
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    && !features.toolBarVisible && !features.locationBarVisible
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    && !features.scrollbarsVisible);
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // fullscreen definitely means no dialog
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (features.fullscreen)
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dialog = false;
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::Frame* newFrame = m_webFrame->createWindow(dialog,
176e3235d1e747128c0e8ad4d2164a9cfde6c873409Iain Merrick            ScriptController::processingUserGesture());
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (newFrame) {
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebCore::Page* page = newFrame->page();
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        page->setGroupName(frame->page()->groupName());
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return page;
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NULL;
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::show() { notImplemented(); }
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::canRunModal() { notImplemented(); return false; }
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::runModal() { notImplemented(); }
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setToolbarsVisible(bool) { notImplemented(); }
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::toolbarsVisible() { notImplemented(); return false; }
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setStatusbarVisible(bool) { notImplemented(); }
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::statusbarVisible() { notImplemented(); return false; }
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setScrollbarsVisible(bool) { notImplemented(); }
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::scrollbarsVisible() { notImplemented(); return false; }
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setMenubarVisible(bool) { notImplemented(); }
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::menubarVisible() { notImplemented(); return false; }
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setResizable(bool) { notImplemented(); }
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20402f88d26cf0763bd684a752045695aaf902844bcTeng-Hui Zhu#if ENABLE(CONTEXT_MENUS)
20502f88d26cf0763bd684a752045695aaf902844bcTeng-Hui Zhuvoid ChromeClientAndroid::showContextMenu() { notImplemented(); }
20602f88d26cf0763bd684a752045695aaf902844bcTeng-Hui Zhu#endif
20702f88d26cf0763bd684a752045695aaf902844bcTeng-Hui Zhu
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called by the JavaScript bindings to print usually an error to
209bf22f208d6fb755dd4ddebbde1a1a3b23e597990Ben Murdoch// a message console. Pass the message to the java side so that the client can
210bf22f208d6fb755dd4ddebbde1a1a3b23e597990Ben Murdoch// handle it as it sees fit.
211edfe3a5175efb80966f71463612aaa1a169074a4Ben Murdochvoid ChromeClientAndroid::addMessageToConsole(MessageSource, MessageType, MessageLevel msgLevel, const String& message, unsigned int lineNumber, const String& sourceID) {
212edfe3a5175efb80966f71463612aaa1a169074a4Ben Murdoch    android::WebViewCore::getWebViewCore(m_webFrame->page()->mainFrame()->view())->addMessageToConsole(message, lineNumber, sourceID, msgLevel);
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
215192a29b13c95d88f942791ab92ebb0efb9fe369cLeon Scrogginsvoid ChromeClientAndroid::formDidBlur(const WebCore::Node* node)
216192a29b13c95d88f942791ab92ebb0efb9fe369cLeon Scroggins{
217192a29b13c95d88f942791ab92ebb0efb9fe369cLeon Scroggins    android::WebViewCore::getWebViewCore(m_webFrame->page()->mainFrame()->view())->formDidBlur(node);
218192a29b13c95d88f942791ab92ebb0efb9fe369cLeon Scroggins}
219192a29b13c95d88f942791ab92ebb0efb9fe369cLeon Scroggins
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::canRunBeforeUnloadConfirmPanel() { return true; }
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::runBeforeUnloadConfirmPanel(const String& message, Frame* frame) {
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String url = frame->document()->documentURI();
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return android::WebViewCore::getWebViewCore(frame->view())->jsUnload(url, message);
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::closeWindowSoon()
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_webFrame);
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Page* page = m_webFrame->page();
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* mainFrame = page->mainFrame();
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This will prevent javascript cross-scripting during unload
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    page->setGroupName(String());
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Stop loading but do not send the unload event
234d867a0e9b483e848580a3a98f73a8352884eac2bSteve Block    mainFrame->loader()->stopLoading(UnloadEventPolicyNone);
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cancel all pending loaders
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mainFrame->loader()->stopAllLoaders();
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Remove all event listeners so that no javascript can execute as a result
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // of mouse/keyboard events.
2395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    mainFrame->document()->removeAllEventListeners();
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Close the window.
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->closeWindow(android::WebViewCore::getWebViewCore(mainFrame->view()));
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::runJavaScriptAlert(Frame* frame, const String& message)
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String url = frame->document()->documentURI();
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    android::WebViewCore::getWebViewCore(frame->view())->jsAlert(url, message);
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::runJavaScriptConfirm(Frame* frame, const String& message)
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String url = frame->document()->documentURI();
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return android::WebViewCore::getWebViewCore(frame->view())->jsConfirm(url, message);
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* This function is called for the javascript method Window.prompt(). A dialog should be shown on
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the screen with an input put box. First param is the text, the second is the default value for
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the input box, third is return param. If the function returns true, the value set in the third parameter
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * is provided to javascript, else null is returned to the script.
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::runJavaScriptPrompt(Frame* frame, const String& message, const String& defaultValue, String& result)
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String url = frame->document()->documentURI();
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return android::WebViewCore::getWebViewCore(frame->view())->jsPrompt(url, message, defaultValue, result);
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setStatusbarText(const String&) { notImplemented(); }
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is called by the JavaScript interpreter when a script has been running for a long
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// time. A dialog should be shown to the user asking them if they would like to cancel the
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Javascript. If true is returned, the script is cancelled.
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// To make a device more responsive, we default to return true to disallow long running script.
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This implies that some of scripts will not be completed.
275d15fb80564c4e30b088ca87fa21a03d67675c662Guang Zhubool ChromeClientAndroid::shouldInterruptJavaScript() {
276d15fb80564c4e30b088ca87fa21a03d67675c662Guang Zhu  FrameView* frameView = m_webFrame->page()->mainFrame()->view();
277d15fb80564c4e30b088ca87fa21a03d67675c662Guang Zhu  return android::WebViewCore::getWebViewCore(frameView)->jsInterrupt();
278d15fb80564c4e30b088ca87fa21a03d67675c662Guang Zhu}
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::tabsToLinks() const { return false; }
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect ChromeClientAndroid::windowResizerRect() const { return IntRect(0, 0, 0, 0); }
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28401eb58e0c8da43223275f0eb2a1e4691125405d1Steve Blockvoid ChromeClientAndroid::invalidateWindow(const IntRect&, bool)
28501eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block{
28601eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block    notImplemented();
28701eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block}
28801eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block
28901eb58e0c8da43223275f0eb2a1e4691125405d1Steve Blockvoid ChromeClientAndroid::invalidateContentsAndWindow(const IntRect& updateRect, bool /*immediate*/)
29001eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block{
29101eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block    notImplemented();
29201eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block}
29301eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block
29401eb58e0c8da43223275f0eb2a1e4691125405d1Steve Blockvoid ChromeClientAndroid::invalidateContentsForSlowScroll(const IntRect& updateRect, bool immediate)
29501eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block{
29601eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block    notImplemented();
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// new to change 38068 (Nov 6, 2008)
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::scroll(const IntSize& scrollDelta,
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const IntRect& rectToScroll, const IntRect& clipRect) {
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// new to change 38068 (Nov 6, 2008)
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntPoint ChromeClientAndroid::screenToWindow(const IntPoint&) const {
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return IntPoint();
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// new to change 38068 (Nov 6, 2008)
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect ChromeClientAndroid::windowToScreen(const IntRect&) const {
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return IntRect();
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
317d060767c4de6a275194ee9a58f151b82b17013bfSteve BlockPlatformPageClient ChromeClientAndroid::platformPageClient() const {
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Page* page = m_webFrame->page();
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* mainFrame = page->mainFrame();
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameView* view = mainFrame->view();
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PlatformWidget viewBridge = view->platformWidget();
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return viewBridge;
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
325635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ChromeClientAndroid::contentsSizeChanged(Frame*, const IntSize&) const
326635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
327635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
328635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
329635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ChromeClientAndroid::scrollRectIntoView(const IntRect&, const ScrollView*) const
3315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
3325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    notImplemented();
3335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
3345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
335635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ChromeClientAndroid::formStateDidChange(const Node*)
336635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
337635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
338635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
339635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
340f08b6f6172b9dd1defce51b868f951bcbf6c61c7Steve Blockvoid ChromeClientAndroid::scrollbarsModeDidChange() const
341f08b6f6172b9dd1defce51b868f951bcbf6c61c7Steve Block{
342f08b6f6172b9dd1defce51b868f951bcbf6c61c7Steve Block    notImplemented();
343f08b6f6172b9dd1defce51b868f951bcbf6c61c7Steve Block}
344f08b6f6172b9dd1defce51b868f951bcbf6c61c7Steve Block
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::mouseDidMoveOverElement(const HitTestResult&, unsigned int) {}
3462eef744339814ace28e6835115e7e389fb8b7962Andrei Popescuvoid ChromeClientAndroid::setToolTip(const String&, TextDirection) {}
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::print(Frame*) {}
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3496172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch/*
3506172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * This function is called on the main (webcore) thread by SQLTransaction::deliverQuotaIncreaseCallback.
3516172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * The way that the callback mechanism is designed inside SQLTransaction means that there must be a new quota
3526172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * (which may be equal to the old quota if the user did not allow more quota) when this function returns. As
3536172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * we call into the browser thread to ask what to do with the quota, we block here and get woken up when the
3546172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * browser calls the native WebViewCore::SetDatabaseQuota method with the new quota value.
3556172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch */
3568ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#if ENABLE(DATABASE)
3576172bff036b26f8ea852196733426c6ff608ed8aBen Murdochvoid ChromeClientAndroid::exceededDatabaseQuota(Frame* frame, const String& name)
3586172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch{
3596172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    SecurityOrigin* origin = frame->document()->securityOrigin();
360fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    DatabaseTracker& tracker = WebCore::DatabaseTracker::tracker();
3616172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch
362cd942b3786cfce15a858784fb072c40e713c54cbAndrei 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.
363cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    m_newQuota = -1;
3646172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch
365cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // This origin is being tracked and has exceeded it's quota. Call into
366cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // the Java side of things to inform the user.
367cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    unsigned long long currentQuota = 0;
368fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    if (tracker.hasEntryForOrigin(origin))
369fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        currentQuota = tracker.quotaForOrigin(origin);
3704dc5706791f76d14261e27a58f50fcf305fcf1b0Ben Murdoch
371fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    unsigned long long estimatedSize = 0;
372fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
373fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    // Only update estimatedSize if we are trying to create a a new database, i.e. the usage for the database is 0.
374fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    if (tracker.usageForDatabase(name, origin) == 0)
375fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        estimatedSize = tracker.detailsForNameAndOrigin(name, origin).expectedUsage();
3764dc5706791f76d14261e27a58f50fcf305fcf1b0Ben Murdoch
3774dc5706791f76d14261e27a58f50fcf305fcf1b0Ben Murdoch    android::WebViewCore::getWebViewCore(frame->view())->exceededDatabaseQuota(frame->document()->documentURI(), name, currentQuota, estimatedSize);
378cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu
379cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // We've sent notification to the browser so now wait for it to come back.
380cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    m_quotaThreadLock.lock();
381cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    while (m_newQuota == -1) {
382cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu        m_quotaThreadCondition.wait(m_quotaThreadLock);
3836172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    }
384cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    m_quotaThreadLock.unlock();
385cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu
386fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    // If new quota is unavailable, we may be able to resolve the situation by shrinking the quota of an origin that asked for a lot but is only using a little.
387fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    // If we find such a site, shrink it's quota and ask Java to try again.
388fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
38987962ce00229855c098ba12cee8d5c015a835289Cary Clark    if ((unsigned long long) m_newQuota == currentQuota && !m_triedToReclaimDBQuota) {
390fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        m_triedToReclaimDBQuota = true; // we should only try this once per quota overflow.
391fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        unsigned long long reclaimedQuotaBytes = tryToReclaimDatabaseQuota(origin);
392fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
393fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        // If we were able to free up enough space, try asking Java again.
394fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        // Otherwise, give up and deny the new database. :(
395fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        if (reclaimedQuotaBytes >= estimatedSize) {
396fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            exceededDatabaseQuota(frame, name);
397fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            return;
398fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        }
399fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    }
400fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
401cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // Update the DatabaseTracker with the new quota value (if the user declined
402cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // new quota, this may equal the old quota)
403fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    tracker.setQuota(origin, m_newQuota);
404fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    m_triedToReclaimDBQuota = false;
405fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch}
406fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
407fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdochstatic unsigned long long tryToReclaimDatabaseQuota(SecurityOrigin* originNeedingQuota) {
408fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    DatabaseTracker& tracker = WebCore::DatabaseTracker::tracker();
409fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    Vector<RefPtr<SecurityOrigin> > origins;
410fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    tracker.origins(origins);
411fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    unsigned long long reclaimedQuotaBytes = 0;
41287962ce00229855c098ba12cee8d5c015a835289Cary Clark    for (unsigned i = 0; i < origins.size(); i++) {
413fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        SecurityOrigin* originToReclaimFrom = origins[i].get();
414fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
415fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        // Don't try to reclaim from the origin that has exceeded its quota.
416fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        if (originToReclaimFrom->equal(originNeedingQuota))
417fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            continue;
418fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
419fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        unsigned long long originUsage = tracker.usageForOrigin(originToReclaimFrom);
420fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        unsigned long long originQuota = tracker.quotaForOrigin(originToReclaimFrom);
421fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        // If the origin has a quota that is more than it's current usage +1MB, shrink it.
422fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        static const int ONE_MB = 1 * 1024 * 1024;
423fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        if (originUsage + ONE_MB < originQuota) {
424fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            unsigned long long newQuota = originUsage + ONE_MB;
425fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            tracker.setQuota(originToReclaimFrom, newQuota);
426fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            reclaimedQuotaBytes += originQuota - newQuota;
427fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        }
428fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    }
429fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    return reclaimedQuotaBytes;
4306172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch}
4318ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#endif
432fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
433c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu#if ENABLE(OFFLINE_WEB_APPLICATIONS)
434c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescuvoid ChromeClientAndroid::reachedMaxAppCacheSize(int64_t spaceNeeded)
435c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu{
4366ec93df1269320cc37facebf7fa3e07a620ee185Andrei Popescu    // Set m_newQuota before calling into the Java side. If we do this after,
4376ec93df1269320cc37facebf7fa3e07a620ee185Andrei Popescu    // we could overwrite the result passed from the Java side and deadlock in the
4386ec93df1269320cc37facebf7fa3e07a620ee185Andrei Popescu    // wait call below.
4396ec93df1269320cc37facebf7fa3e07a620ee185Andrei Popescu    m_newQuota = -1;
440cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    Page* page = m_webFrame->page();
441cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    Frame* mainFrame = page->mainFrame();
442cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    FrameView* view = mainFrame->view();
443cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    android::WebViewCore::getWebViewCore(view)->reachedMaxAppCacheSize(spaceNeeded);
444cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu
445cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // We've sent notification to the browser so now wait for it to come back.
446cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    m_quotaThreadLock.lock();
447cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    while (m_newQuota == -1) {
448cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu       m_quotaThreadCondition.wait(m_quotaThreadLock);
449cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    }
450cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    m_quotaThreadLock.unlock();
451cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    if (m_newQuota > 0) {
452cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu        WebCore::cacheStorage().setMaximumSize(m_newQuota);
453cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu        // Now the app cache will retry the saving the previously failed cache.
454cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    }
455c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu}
456c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu#endif
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4587e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarkevoid ChromeClientAndroid::populateVisitedLinks()
4597e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke{
4607e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke    Page* page = m_webFrame->page();
4617e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke    Frame* mainFrame = page->mainFrame();
4627e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke    FrameView* view = mainFrame->view();
4637e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke    android::WebViewCore::getWebViewCore(view)->populateVisitedLinks(&page->group());
4647e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke}
4657e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke
466fe55045391147883a38ed161b0c80f4e356bd9e0Steve Blockvoid ChromeClientAndroid::requestGeolocationPermissionForFrame(Frame* frame, Geolocation* geolocation)
467fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block{
468fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    ASSERT(geolocation);
469fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    if (!m_geolocationPermissions) {
470fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block        m_geolocationPermissions = new GeolocationPermissions(android::WebViewCore::getWebViewCore(frame->view()),
471fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block                                                              m_webFrame->page()->mainFrame());
472fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    }
473fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    m_geolocationPermissions->queryPermissionState(frame);
474fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block}
475fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block
476937c3ffe48bb0798ca15e3db31ece787450bcd4dSteve Blockvoid ChromeClientAndroid::cancelGeolocationPermissionRequestForFrame(Frame* frame, WebCore::Geolocation*)
4773429efc308249172d26d6c9edb5e2d36c1c5855aSteve Block{
4783429efc308249172d26d6c9edb5e2d36c1c5855aSteve Block    if (m_geolocationPermissions)
4793429efc308249172d26d6c9edb5e2d36c1c5855aSteve Block        m_geolocationPermissions->cancelPermissionStateQuery(frame);
4803429efc308249172d26d6c9edb5e2d36c1c5855aSteve Block}
4813429efc308249172d26d6c9edb5e2d36c1c5855aSteve Block
482fe55045391147883a38ed161b0c80f4e356bd9e0Steve Blockvoid ChromeClientAndroid::provideGeolocationPermissions(const String &origin, bool allow, bool remember)
483fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block{
484fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    ASSERT(m_geolocationPermissions);
485fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    m_geolocationPermissions->providePermissionState(origin, allow, remember);
486fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block}
487fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block
488e7430864058b3c222b4b0468cf8812a9a733818bSteve Blockvoid ChromeClientAndroid::storeGeolocationPermissions()
489e7430864058b3c222b4b0468cf8812a9a733818bSteve Block{
490e7430864058b3c222b4b0468cf8812a9a733818bSteve Block    GeolocationPermissions::maybeStorePermanentPermissions();
491e7430864058b3c222b4b0468cf8812a9a733818bSteve Block}
492e7430864058b3c222b4b0468cf8812a9a733818bSteve Block
493fe55045391147883a38ed161b0c80f4e356bd9e0Steve Blockvoid ChromeClientAndroid::onMainFrameLoadStarted()
494fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block{
495fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    if (m_geolocationPermissions.get())
496fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block        m_geolocationPermissions->resetTemporaryPermissionStates();
497fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block}
498fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block
499bf280393189a33efa29a33c0d96c84710484f2f7Leon Scrogginsvoid ChromeClientAndroid::runOpenPanel(Frame* frame,
500bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins        PassRefPtr<FileChooser> chooser)
501bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins{
502bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins    android::WebViewCore* core = android::WebViewCore::getWebViewCore(
503bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins            frame->view());
504bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins    core->openFileChooser(chooser);
505bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins}
506bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins
50745b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdochvoid ChromeClientAndroid::chooseIconForFiles(const Vector<WTF::String>&, FileChooser*)
508e55806d9d9fe6be5bb3ee076392f2803ff0179f9Steve Block{
509e55806d9d9fe6be5bb3ee076392f2803ff0179f9Steve Block    notImplemented();
510e55806d9d9fe6be5bb3ee076392f2803ff0179f9Steve Block}
511e55806d9d9fe6be5bb3ee076392f2803ff0179f9Steve Block
5126c58635db69329cd8c46dc17dd670bdcbf1a889aBen Murdochvoid ChromeClientAndroid::setCursor(const Cursor&)
5135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
5145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    notImplemented();
5155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5176172bff036b26f8ea852196733426c6ff608ed8aBen Murdochvoid ChromeClientAndroid::wakeUpMainThreadWithNewQuota(long newQuota) {
5186172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    MutexLocker locker(m_quotaThreadLock);
5196172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    m_newQuota = newQuota;
5206172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    m_quotaThreadCondition.signal();
5216172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch}
5226172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch
523f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch#if ENABLE(TOUCH_EVENTS)
524d1919980a4bbb7f3aa73a6a83110fbec0c220e59Ben Murdochvoid ChromeClientAndroid::needTouchEvents(bool needTouchEvents)
525f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch{
526f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch    FrameView* frameView = m_webFrame->page()->mainFrame()->view();
527f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch    android::WebViewCore* core = android::WebViewCore::getWebViewCore(frameView);
528f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch    if (core)
529d1919980a4bbb7f3aa73a6a83110fbec0c220e59Ben Murdoch        core->needTouchEvents(needTouchEvents);
530f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch}
531f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch#endif
532f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch
5339e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Blockbool ChromeClientAndroid::selectItemWritingDirectionIsNatural()
5349e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block{
5359e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block    return false;
5369e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block}
5379e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block
5381caed8e3c0af63e20009e74642e2574e1185c38eLeon ScrogginsPassRefPtr<PopupMenu> ChromeClientAndroid::createPopupMenu(PopupMenuClient* client) const
5399e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block{
5401caed8e3c0af63e20009e74642e2574e1185c38eLeon Scroggins    return adoptRef(new PopupMenuAndroid(client));
5419e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block}
5429e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block
5439e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve BlockPassRefPtr<SearchPopupMenu> ChromeClientAndroid::createSearchPopupMenu(PopupMenuClient*) const
5449e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block{
5459e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block    return adoptRef(new SearchPopupMenuAndroid);
5469e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block}
5479e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block
548c4daefab2bd7617afd2562dad5353da63d239428Steve Blockvoid ChromeClientAndroid::reachedApplicationCacheOriginQuota(SecurityOrigin*)
549c4daefab2bd7617afd2562dad5353da63d239428Steve Block{
550c4daefab2bd7617afd2562dad5353da63d239428Steve Block    notImplemented();
551c4daefab2bd7617afd2562dad5353da63d239428Steve Block}
552c4daefab2bd7617afd2562dad5353da63d239428Steve Block
55360950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch#if ENABLE(ANDROID_INSTALLABLE_WEB_APPS)
55460950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdochvoid ChromeClientAndroid::webAppCanBeInstalled()
55560950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch{
55660950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch    FrameView* frameView = m_webFrame->page()->mainFrame()->view();
55760950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch    android::WebViewCore* core = android::WebViewCore::getWebViewCore(frameView);
55860950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch    if (core)
55960950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch        core->notifyWebAppCanBeInstalled();
56060950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch}
56160950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch#endif
56260950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
564