ChromeClientAndroid.cpp revision 95740c40dc0b78f1342ec0c257664b4300a07e6b
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"
40adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard#include "GraphicsLayerAndroid.h"
41cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard#include "HTMLMediaElement.h"
42cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard#include "HTMLNames.h"
432c993a2e09dd5636c3c0b8113749ae3acabb575aSteve Block#include "Icon.h"
44cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard#include "LayerAndroid.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h"
469e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block#include "PopupMenuAndroid.h"
47adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard#include "RenderLayer.h"
48adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard#include "RenderLayerCompositor.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ScriptController.h"
509e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block#include "SearchPopupMenuAndroid.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreFrameBridge.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreViewBridge.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebViewCore.h"
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WindowFeatures.h"
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h"
56ff80790be406da04e7afbd8aea7bb0e26f1f08f0Kristian Monsen#include "UserGestureIndicator.h"
5779768700a853c40c66ff0b0591957958667fdd9eSteve Block#include <wtf/text/CString.h>
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android {
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
61fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch#if ENABLE(DATABASE)
62fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdochstatic unsigned long long tryToReclaimDatabaseQuota(SecurityOrigin* originNeedingQuota);
63fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch#endif
64fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
65797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#if USE(ACCELERATED_COMPOSITING)
66797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
676d43b9ceb777071c088fe12ee94af80e34816bcfGrace KlobaWebCore::GraphicsLayer* ChromeClientAndroid::layersSync()
68797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{
696d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (m_rootGraphicsLayer && m_needsLayerSync && m_webFrame) {
70adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard        // We may have more than one frame, so let's first update all of them
71adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard        // (webkit may want to update the GraphicsLayer tree, and we do *not* want
72adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard        // to find this out when we are painting, as it means we could be summarily
73adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard        // deallocated while painting...)
74adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard        GraphicsLayerAndroid* rootLayer = static_cast<GraphicsLayerAndroid*>(m_rootGraphicsLayer);
75adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard        Vector<const RenderLayer*> listRootLayers;
76adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard        rootLayer->gatherRootLayers(listRootLayers);
77adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard
78adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard        for (unsigned int i = 0; i < listRootLayers.size(); i++) {
79adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard            RenderLayer* layer = const_cast<RenderLayer*>(listRootLayers[i]);
80adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard            layer->compositor()->updateCompositingLayers();
81adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard        }
82adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard
83adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard        Frame* frame = m_webFrame->page()->mainFrame();
84adf365552d1a6b55782fa3b3c722f5ea914deb40Nicolas Roard        if (FrameView* frameView = frame->view())
853fbf8910ec513d0a9c19e991c840c5a8242d73d0Ben Murdoch            frameView->syncCompositingStateIncludingSubframes();
86797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard    }
876d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    m_needsLayerSync = false;
886d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return m_rootGraphicsLayer;
89797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard}
90797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
91797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roardvoid ChromeClientAndroid::scheduleCompositingLayerSync()
92797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{
9382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    if (m_needsLayerSync)
9482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott        return;
9582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    m_needsLayerSync = true;
9682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_webFrame->page()->mainFrame()->view());
9782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    if (webViewCore)
9882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott        webViewCore->layersDraw();
99797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard}
100797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
101797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roardvoid ChromeClientAndroid::setNeedsOneShotDrawingSynchronization()
102797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{
103797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard    // This should not be needed
104797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard}
105797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
1066d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid ChromeClientAndroid::attachRootGraphicsLayer(WebCore::Frame*, WebCore::GraphicsLayer* layer)
107797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{
1086d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    // frame is not used in Android as we should only get root graphics layer for the main frame
109797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard    m_rootGraphicsLayer = layer;
110918bdcc55fdfcb50735949b3ed397392a84e0393Shimeng (Simon) Wang    if (!layer)
111918bdcc55fdfcb50735949b3ed397392a84e0393Shimeng (Simon) Wang        return;
1124175d59b46f96005f0c64978b1a94e3fe60f1e8eNicolas Roard    scheduleCompositingLayerSync();
113797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard}
114797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
115797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#endif
116797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setWebFrame(android::WebFrame* webframe)
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Release(m_webFrame);
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame = webframe;
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Retain(m_webFrame);
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::chromeDestroyed()
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Release(m_webFrame);
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete this;
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setWindowRect(const FloatRect&) { notImplemented(); }
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFloatRect ChromeClientAndroid::windowRect() {
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_webFrame);
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_webFrame)
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return FloatRect();
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameView* frameView = m_webFrame->page()->mainFrame()->view();
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!frameView)
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return FloatRect();
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const WebCoreViewBridge* bridge = frameView->platformWidget();
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const IntRect& rect = bridge->getWindowBounds();
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FloatRect fRect(rect.x(), rect.y(), rect.width(), rect.height());
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return fRect;
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFloatRect ChromeClientAndroid::pageRect() { notImplemented(); return FloatRect(); }
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfloat ChromeClientAndroid::scaleFactor()
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1499652d6b88e01f27d69c804ac6bc56b527b33c219Grace Kloba    ASSERT(m_webFrame);
1509652d6b88e01f27d69c804ac6bc56b527b33c219Grace Kloba    return m_webFrame->density();
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
153ff80790be406da04e7afbd8aea7bb0e26f1f08f0Kristian Monsenvoid ChromeClientAndroid::focus()
154ff80790be406da04e7afbd8aea7bb0e26f1f08f0Kristian Monsen{
155ff80790be406da04e7afbd8aea7bb0e26f1f08f0Kristian Monsen    ASSERT(m_webFrame);
156ff80790be406da04e7afbd8aea7bb0e26f1f08f0Kristian Monsen    bool isUserGesture = UserGestureIndicator::processingUserGesture();
157bbe299e200c3fe5dbfd0696096de121f9057eb0dKristian Monsen
158ff80790be406da04e7afbd8aea7bb0e26f1f08f0Kristian Monsen    // Ask the application to focus this WebView if the action is intiated by the user
159ff80790be406da04e7afbd8aea7bb0e26f1f08f0Kristian Monsen    if (isUserGesture)
16027e40b2407e7e39b8fde83728baee90aae279760Patrick Scott        m_webFrame->requestFocus();
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::unfocus() { notImplemented(); }
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::canTakeFocus(FocusDirection) { notImplemented(); return false; }
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::takeFocus(FocusDirection) { notImplemented(); }
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
167ba01ca1ef2bfe8916fafb72fee4a594a0cb2e302Leon Scrogginsvoid ChromeClientAndroid::focusedNodeChanged(Node* node)
168ba01ca1ef2bfe8916fafb72fee4a594a0cb2e302Leon Scroggins{
169ba01ca1ef2bfe8916fafb72fee4a594a0cb2e302Leon Scroggins    android::WebViewCore::getWebViewCore(m_webFrame->page()->mainFrame()->view())->focusNodeChanged(node);
170ba01ca1ef2bfe8916fafb72fee4a594a0cb2e302Leon Scroggins}
171ba01ca1ef2bfe8916fafb72fee4a594a0cb2e302Leon Scroggins
17297349b6656c58e631c13b8552b077870a6a32ebaTeng-Hui Zhuvoid ChromeClientAndroid::focusedFrameChanged(Frame*) { notImplemented(); }
173d5340bbd847b3fabb04f28f1aa8425f1874b0bb3Steve Block
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPage* ChromeClientAndroid::createWindow(Frame* frame, const FrameLoadRequest&,
175f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck        const WindowFeatures& features, const NavigationAction&)
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(frame);
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_MULTIPLE_WINDOWS
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (frame->settings() && !(frame->settings()->supportMultipleWindows()))
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If the client doesn't support multiple windows, just return the current page
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return frame->page();
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
184299511d537b620ede57a2bff60a8f27d3c935815Grace Kloba    const WebCoreViewBridge* bridge = frame->view()->platformWidget();
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool dialog = features.dialog || !features.resizable
186299511d537b620ede57a2bff60a8f27d3c935815Grace Kloba            || (features.heightSet && features.height < bridge->height()
187299511d537b620ede57a2bff60a8f27d3c935815Grace Kloba                    && features.widthSet && features.width < bridge->width())
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            || (!features.menuBarVisible && !features.statusBarVisible
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    && !features.toolBarVisible && !features.locationBarVisible
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    && !features.scrollbarsVisible);
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // fullscreen definitely means no dialog
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (features.fullscreen)
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dialog = false;
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::Frame* newFrame = m_webFrame->createWindow(dialog,
195e3235d1e747128c0e8ad4d2164a9cfde6c873409Iain Merrick            ScriptController::processingUserGesture());
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (newFrame) {
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebCore::Page* page = newFrame->page();
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        page->setGroupName(frame->page()->groupName());
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return page;
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NULL;
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::show() { notImplemented(); }
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::canRunModal() { notImplemented(); return false; }
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::runModal() { notImplemented(); }
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setToolbarsVisible(bool) { notImplemented(); }
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::toolbarsVisible() { notImplemented(); return false; }
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setStatusbarVisible(bool) { notImplemented(); }
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::statusbarVisible() { notImplemented(); return false; }
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setScrollbarsVisible(bool) { notImplemented(); }
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::scrollbarsVisible() { notImplemented(); return false; }
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setMenubarVisible(bool) { notImplemented(); }
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::menubarVisible() { notImplemented(); return false; }
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setResizable(bool) { notImplemented(); }
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22302f88d26cf0763bd684a752045695aaf902844bcTeng-Hui Zhu#if ENABLE(CONTEXT_MENUS)
22402f88d26cf0763bd684a752045695aaf902844bcTeng-Hui Zhuvoid ChromeClientAndroid::showContextMenu() { notImplemented(); }
22502f88d26cf0763bd684a752045695aaf902844bcTeng-Hui Zhu#endif
22602f88d26cf0763bd684a752045695aaf902844bcTeng-Hui Zhu
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called by the JavaScript bindings to print usually an error to
228bf22f208d6fb755dd4ddebbde1a1a3b23e597990Ben Murdoch// a message console. Pass the message to the java side so that the client can
229bf22f208d6fb755dd4ddebbde1a1a3b23e597990Ben Murdoch// handle it as it sees fit.
230edfe3a5175efb80966f71463612aaa1a169074a4Ben Murdochvoid ChromeClientAndroid::addMessageToConsole(MessageSource, MessageType, MessageLevel msgLevel, const String& message, unsigned int lineNumber, const String& sourceID) {
231edfe3a5175efb80966f71463612aaa1a169074a4Ben Murdoch    android::WebViewCore::getWebViewCore(m_webFrame->page()->mainFrame()->view())->addMessageToConsole(message, lineNumber, sourceID, msgLevel);
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
234192a29b13c95d88f942791ab92ebb0efb9fe369cLeon Scrogginsvoid ChromeClientAndroid::formDidBlur(const WebCore::Node* node)
235192a29b13c95d88f942791ab92ebb0efb9fe369cLeon Scroggins{
236192a29b13c95d88f942791ab92ebb0efb9fe369cLeon Scroggins    android::WebViewCore::getWebViewCore(m_webFrame->page()->mainFrame()->view())->formDidBlur(node);
237192a29b13c95d88f942791ab92ebb0efb9fe369cLeon Scroggins}
238192a29b13c95d88f942791ab92ebb0efb9fe369cLeon Scroggins
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::canRunBeforeUnloadConfirmPanel() { return true; }
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::runBeforeUnloadConfirmPanel(const String& message, Frame* frame) {
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String url = frame->document()->documentURI();
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return android::WebViewCore::getWebViewCore(frame->view())->jsUnload(url, message);
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::closeWindowSoon()
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_webFrame);
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Page* page = m_webFrame->page();
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* mainFrame = page->mainFrame();
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This will prevent javascript cross-scripting during unload
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    page->setGroupName(String());
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Stop loading but do not send the unload event
253d867a0e9b483e848580a3a98f73a8352884eac2bSteve Block    mainFrame->loader()->stopLoading(UnloadEventPolicyNone);
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cancel all pending loaders
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mainFrame->loader()->stopAllLoaders();
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Remove all event listeners so that no javascript can execute as a result
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // of mouse/keyboard events.
2585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    mainFrame->document()->removeAllEventListeners();
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Close the window.
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->closeWindow(android::WebViewCore::getWebViewCore(mainFrame->view()));
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::runJavaScriptAlert(Frame* frame, const String& message)
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String url = frame->document()->documentURI();
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    android::WebViewCore::getWebViewCore(frame->view())->jsAlert(url, message);
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::runJavaScriptConfirm(Frame* frame, const String& message)
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String url = frame->document()->documentURI();
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return android::WebViewCore::getWebViewCore(frame->view())->jsConfirm(url, message);
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* This function is called for the javascript method Window.prompt(). A dialog should be shown on
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the screen with an input put box. First param is the text, the second is the default value for
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the input box, third is return param. If the function returns true, the value set in the third parameter
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * is provided to javascript, else null is returned to the script.
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::runJavaScriptPrompt(Frame* frame, const String& message, const String& defaultValue, String& result)
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String url = frame->document()->documentURI();
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return android::WebViewCore::getWebViewCore(frame->view())->jsPrompt(url, message, defaultValue, result);
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setStatusbarText(const String&) { notImplemented(); }
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is called by the JavaScript interpreter when a script has been running for a long
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// time. A dialog should be shown to the user asking them if they would like to cancel the
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Javascript. If true is returned, the script is cancelled.
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// To make a device more responsive, we default to return true to disallow long running script.
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This implies that some of scripts will not be completed.
294d15fb80564c4e30b088ca87fa21a03d67675c662Guang Zhubool ChromeClientAndroid::shouldInterruptJavaScript() {
295d15fb80564c4e30b088ca87fa21a03d67675c662Guang Zhu  FrameView* frameView = m_webFrame->page()->mainFrame()->view();
296d15fb80564c4e30b088ca87fa21a03d67675c662Guang Zhu  return android::WebViewCore::getWebViewCore(frameView)->jsInterrupt();
297d15fb80564c4e30b088ca87fa21a03d67675c662Guang Zhu}
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
299fe73b6358fa742d943e85ba9a90544a7b6ba8d9dBen MurdochKeyboardUIMode ChromeClientAndroid::keyboardUIMode()
300fe73b6358fa742d943e85ba9a90544a7b6ba8d9dBen Murdoch{
301fe73b6358fa742d943e85ba9a90544a7b6ba8d9dBen Murdoch    return KeyboardAccessDefault;
302fe73b6358fa742d943e85ba9a90544a7b6ba8d9dBen Murdoch}
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect ChromeClientAndroid::windowResizerRect() const { return IntRect(0, 0, 0, 0); }
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30601eb58e0c8da43223275f0eb2a1e4691125405d1Steve Blockvoid ChromeClientAndroid::invalidateWindow(const IntRect&, bool)
30701eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block{
30801eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block    notImplemented();
30901eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block}
31001eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block
31101eb58e0c8da43223275f0eb2a1e4691125405d1Steve Blockvoid ChromeClientAndroid::invalidateContentsAndWindow(const IntRect& updateRect, bool /*immediate*/)
31201eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block{
31301eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block    notImplemented();
31401eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block}
31501eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block
31601eb58e0c8da43223275f0eb2a1e4691125405d1Steve Blockvoid ChromeClientAndroid::invalidateContentsForSlowScroll(const IntRect& updateRect, bool immediate)
31701eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block{
31801eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block    notImplemented();
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// new to change 38068 (Nov 6, 2008)
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::scroll(const IntSize& scrollDelta,
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const IntRect& rectToScroll, const IntRect& clipRect) {
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// new to change 38068 (Nov 6, 2008)
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntPoint ChromeClientAndroid::screenToWindow(const IntPoint&) const {
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return IntPoint();
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// new to change 38068 (Nov 6, 2008)
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect ChromeClientAndroid::windowToScreen(const IntRect&) const {
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return IntRect();
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
339d060767c4de6a275194ee9a58f151b82b17013bfSteve BlockPlatformPageClient ChromeClientAndroid::platformPageClient() const {
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Page* page = m_webFrame->page();
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* mainFrame = page->mainFrame();
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameView* view = mainFrame->view();
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PlatformWidget viewBridge = view->platformWidget();
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return viewBridge;
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
347635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ChromeClientAndroid::contentsSizeChanged(Frame*, const IntSize&) const
348635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
349635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
351635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ChromeClientAndroid::scrollRectIntoView(const IntRect&, const ScrollView*) const
3535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
3545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    notImplemented();
3555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
3565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
357635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ChromeClientAndroid::formStateDidChange(const Node*)
358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
359635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
360635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
361635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
362f08b6f6172b9dd1defce51b868f951bcbf6c61c7Steve Blockvoid ChromeClientAndroid::scrollbarsModeDidChange() const
363f08b6f6172b9dd1defce51b868f951bcbf6c61c7Steve Block{
364f08b6f6172b9dd1defce51b868f951bcbf6c61c7Steve Block    notImplemented();
365f08b6f6172b9dd1defce51b868f951bcbf6c61c7Steve Block}
366f08b6f6172b9dd1defce51b868f951bcbf6c61c7Steve Block
3678db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wangvoid ChromeClientAndroid::dispatchViewportDataDidChange(const ViewportArguments& input) const {
3688db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang#ifdef ANDROID_META_SUPPORT
3698db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang    const ViewportArguments emptyArgument;
3708db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang    if (input == emptyArgument) {
3718db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang        // Empty Argument is for a page with no viewport meta tag; so reset everything.
3728db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang        m_webFrame->page()->settings()->resetMetadataSettings();
3738db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang    }
3748db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang    Document* doc = m_webFrame->page()->mainFrame()->document();
3758db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang    if (!doc->ownerElement()) {
3768db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang        FrameView* view = doc->view();
3778db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang        if (view)
3788db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang            PlatformBridge::updateViewport(view);
3798db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang    }
3808db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang#endif
3818db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang}
3828db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::mouseDidMoveOverElement(const HitTestResult&, unsigned int) {}
3842eef744339814ace28e6835115e7e389fb8b7962Andrei Popescuvoid ChromeClientAndroid::setToolTip(const String&, TextDirection) {}
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::print(Frame*) {}
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3876172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch/*
3886172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * This function is called on the main (webcore) thread by SQLTransaction::deliverQuotaIncreaseCallback.
3896172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * The way that the callback mechanism is designed inside SQLTransaction means that there must be a new quota
3906172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * (which may be equal to the old quota if the user did not allow more quota) when this function returns. As
3916172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * we call into the browser thread to ask what to do with the quota, we block here and get woken up when the
3926172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * browser calls the native WebViewCore::SetDatabaseQuota method with the new quota value.
3936172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch */
3948ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#if ENABLE(DATABASE)
3956172bff036b26f8ea852196733426c6ff608ed8aBen Murdochvoid ChromeClientAndroid::exceededDatabaseQuota(Frame* frame, const String& name)
3966172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch{
3976172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    SecurityOrigin* origin = frame->document()->securityOrigin();
398fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    DatabaseTracker& tracker = WebCore::DatabaseTracker::tracker();
3996172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch
40063da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    m_isNewQuotaSet = false;
4016172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch
402cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // This origin is being tracked and has exceeded it's quota. Call into
403cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // the Java side of things to inform the user.
404cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    unsigned long long currentQuota = 0;
405fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    if (tracker.hasEntryForOrigin(origin))
406fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        currentQuota = tracker.quotaForOrigin(origin);
4074dc5706791f76d14261e27a58f50fcf305fcf1b0Ben Murdoch
408fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    unsigned long long estimatedSize = 0;
409fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
410fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    // Only update estimatedSize if we are trying to create a a new database, i.e. the usage for the database is 0.
411fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    if (tracker.usageForDatabase(name, origin) == 0)
412fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        estimatedSize = tracker.detailsForNameAndOrigin(name, origin).expectedUsage();
4134dc5706791f76d14261e27a58f50fcf305fcf1b0Ben Murdoch
414b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (android::WebViewCore::getWebViewCore(frame->view())->exceededDatabaseQuota(frame->document()->documentURI(), name, currentQuota, estimatedSize)) {
415b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        // We've sent notification to the browser so now wait for it to come back.
416b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        m_quotaThreadLock.lock();
417b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        while (!m_isNewQuotaSet) {
418b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block            m_quotaThreadCondition.wait(m_quotaThreadLock);
419b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        }
420b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        m_quotaThreadLock.unlock();
421b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    } else {
422b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        // We failed to send the message to the UI thread to request a new quota,
423b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        // so just use the current quota as a default.
424b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        m_newQuota = currentQuota;
4256172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    }
426cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu
42763da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    if (m_newQuota < currentQuota)
42863da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block        m_newQuota = currentQuota;
429fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
43063da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    // If new quota is unavailable, we may be able to resolve the situation by
43163da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    // shrinking the quota of an origin that asked for a lot but is only using a
43263da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    // little. If we find such a site, shrink it's quota and ask Java to try
43363da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    // again.
43463da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    if (m_newQuota == currentQuota && !m_triedToReclaimDBQuota) {
435fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        m_triedToReclaimDBQuota = true; // we should only try this once per quota overflow.
436fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        unsigned long long reclaimedQuotaBytes = tryToReclaimDatabaseQuota(origin);
437fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
438fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        // If we were able to free up enough space, try asking Java again.
439fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        // Otherwise, give up and deny the new database. :(
440fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        if (reclaimedQuotaBytes >= estimatedSize) {
441fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            exceededDatabaseQuota(frame, name);
442fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            return;
443fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        }
444fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    }
445fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
446cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // Update the DatabaseTracker with the new quota value (if the user declined
447cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // new quota, this may equal the old quota)
448fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    tracker.setQuota(origin, m_newQuota);
449fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    m_triedToReclaimDBQuota = false;
450fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch}
451fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
452fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdochstatic unsigned long long tryToReclaimDatabaseQuota(SecurityOrigin* originNeedingQuota) {
453fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    DatabaseTracker& tracker = WebCore::DatabaseTracker::tracker();
454fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    Vector<RefPtr<SecurityOrigin> > origins;
455fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    tracker.origins(origins);
456fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    unsigned long long reclaimedQuotaBytes = 0;
45787962ce00229855c098ba12cee8d5c015a835289Cary Clark    for (unsigned i = 0; i < origins.size(); i++) {
458fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        SecurityOrigin* originToReclaimFrom = origins[i].get();
459fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
460fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        // Don't try to reclaim from the origin that has exceeded its quota.
461fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        if (originToReclaimFrom->equal(originNeedingQuota))
462fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            continue;
463fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
464fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        unsigned long long originUsage = tracker.usageForOrigin(originToReclaimFrom);
465fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        unsigned long long originQuota = tracker.quotaForOrigin(originToReclaimFrom);
466fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        // If the origin has a quota that is more than it's current usage +1MB, shrink it.
467fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        static const int ONE_MB = 1 * 1024 * 1024;
468fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        if (originUsage + ONE_MB < originQuota) {
469fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            unsigned long long newQuota = originUsage + ONE_MB;
470fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            tracker.setQuota(originToReclaimFrom, newQuota);
471fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            reclaimedQuotaBytes += originQuota - newQuota;
472fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        }
473fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    }
474fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    return reclaimedQuotaBytes;
4756172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch}
4768ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#endif
477fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
478c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu#if ENABLE(OFFLINE_WEB_APPLICATIONS)
479c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescuvoid ChromeClientAndroid::reachedMaxAppCacheSize(int64_t spaceNeeded)
480c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu{
48163da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    m_isNewQuotaSet = false;
482cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    Page* page = m_webFrame->page();
483cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    Frame* mainFrame = page->mainFrame();
484cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    FrameView* view = mainFrame->view();
485b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block
486b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    // If we fail to send the message to the UI thread to request a new quota,
487b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    // there's nothing to do.
488b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!android::WebViewCore::getWebViewCore(view)->reachedMaxAppCacheSize(spaceNeeded))
489b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
490cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu
491cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // We've sent notification to the browser so now wait for it to come back.
492cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    m_quotaThreadLock.lock();
49363da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    while (!m_isNewQuotaSet) {
494cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu       m_quotaThreadCondition.wait(m_quotaThreadLock);
495cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    }
496cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    m_quotaThreadLock.unlock();
497cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    if (m_newQuota > 0) {
498cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu        WebCore::cacheStorage().setMaximumSize(m_newQuota);
499cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu        // Now the app cache will retry the saving the previously failed cache.
500cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    }
501c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu}
502c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu#endif
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5047e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarkevoid ChromeClientAndroid::populateVisitedLinks()
5057e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke{
5067e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke    Page* page = m_webFrame->page();
5077e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke    Frame* mainFrame = page->mainFrame();
5087e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke    FrameView* view = mainFrame->view();
5097e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke    android::WebViewCore::getWebViewCore(view)->populateVisitedLinks(&page->group());
5107e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke}
5117e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke
512fe55045391147883a38ed161b0c80f4e356bd9e0Steve Blockvoid ChromeClientAndroid::requestGeolocationPermissionForFrame(Frame* frame, Geolocation* geolocation)
513fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block{
514fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    ASSERT(geolocation);
515fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    if (!m_geolocationPermissions) {
516fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block        m_geolocationPermissions = new GeolocationPermissions(android::WebViewCore::getWebViewCore(frame->view()),
517fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block                                                              m_webFrame->page()->mainFrame());
518fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    }
519fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    m_geolocationPermissions->queryPermissionState(frame);
520fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block}
521fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block
522937c3ffe48bb0798ca15e3db31ece787450bcd4dSteve Blockvoid ChromeClientAndroid::cancelGeolocationPermissionRequestForFrame(Frame* frame, WebCore::Geolocation*)
5233429efc308249172d26d6c9edb5e2d36c1c5855aSteve Block{
5243429efc308249172d26d6c9edb5e2d36c1c5855aSteve Block    if (m_geolocationPermissions)
5253429efc308249172d26d6c9edb5e2d36c1c5855aSteve Block        m_geolocationPermissions->cancelPermissionStateQuery(frame);
5263429efc308249172d26d6c9edb5e2d36c1c5855aSteve Block}
5273429efc308249172d26d6c9edb5e2d36c1c5855aSteve Block
528fe55045391147883a38ed161b0c80f4e356bd9e0Steve Blockvoid ChromeClientAndroid::provideGeolocationPermissions(const String &origin, bool allow, bool remember)
529fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block{
530fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    ASSERT(m_geolocationPermissions);
531fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    m_geolocationPermissions->providePermissionState(origin, allow, remember);
532fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block}
533fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block
534e7430864058b3c222b4b0468cf8812a9a733818bSteve Blockvoid ChromeClientAndroid::storeGeolocationPermissions()
535e7430864058b3c222b4b0468cf8812a9a733818bSteve Block{
536e7430864058b3c222b4b0468cf8812a9a733818bSteve Block    GeolocationPermissions::maybeStorePermanentPermissions();
537e7430864058b3c222b4b0468cf8812a9a733818bSteve Block}
538e7430864058b3c222b4b0468cf8812a9a733818bSteve Block
539fe55045391147883a38ed161b0c80f4e356bd9e0Steve Blockvoid ChromeClientAndroid::onMainFrameLoadStarted()
540fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block{
541fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block    if (m_geolocationPermissions.get())
542fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block        m_geolocationPermissions->resetTemporaryPermissionStates();
543fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block}
544fe55045391147883a38ed161b0c80f4e356bd9e0Steve Block
545bf280393189a33efa29a33c0d96c84710484f2f7Leon Scrogginsvoid ChromeClientAndroid::runOpenPanel(Frame* frame,
546bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins        PassRefPtr<FileChooser> chooser)
547bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins{
548bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins    android::WebViewCore* core = android::WebViewCore::getWebViewCore(
549bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins            frame->view());
550bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins    core->openFileChooser(chooser);
551bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins}
552bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins
55345b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdochvoid ChromeClientAndroid::chooseIconForFiles(const Vector<WTF::String>&, FileChooser*)
554e55806d9d9fe6be5bb3ee076392f2803ff0179f9Steve Block{
555e55806d9d9fe6be5bb3ee076392f2803ff0179f9Steve Block    notImplemented();
556e55806d9d9fe6be5bb3ee076392f2803ff0179f9Steve Block}
557e55806d9d9fe6be5bb3ee076392f2803ff0179f9Steve Block
5586c58635db69329cd8c46dc17dd670bdcbf1a889aBen Murdochvoid ChromeClientAndroid::setCursor(const Cursor&)
5595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
5605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    notImplemented();
5615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56363da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Blockvoid ChromeClientAndroid::wakeUpMainThreadWithNewQuota(long long newQuota) {
5646172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    MutexLocker locker(m_quotaThreadLock);
56563da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    m_newQuota = newQuota < 0 ? 0 : newQuota;
56663da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    m_isNewQuotaSet = true;
5676172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    m_quotaThreadCondition.signal();
5686172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch}
5696172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch
570f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch#if ENABLE(TOUCH_EVENTS)
571d1919980a4bbb7f3aa73a6a83110fbec0c220e59Ben Murdochvoid ChromeClientAndroid::needTouchEvents(bool needTouchEvents)
572f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch{
573f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch    FrameView* frameView = m_webFrame->page()->mainFrame()->view();
574f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch    android::WebViewCore* core = android::WebViewCore::getWebViewCore(frameView);
575f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch    if (core)
576d1919980a4bbb7f3aa73a6a83110fbec0c220e59Ben Murdoch        core->needTouchEvents(needTouchEvents);
577f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch}
578f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch#endif
579f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch
5809e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Blockbool ChromeClientAndroid::selectItemWritingDirectionIsNatural()
5819e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block{
5829e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block    return false;
5839e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block}
5849e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block
58589ff5bedced41f7901101fa36064aa99b78aa3f4Steve Blockbool ChromeClientAndroid::selectItemAlignmentFollowsMenuWritingDirection()
58689ff5bedced41f7901101fa36064aa99b78aa3f4Steve Block{
58789ff5bedced41f7901101fa36064aa99b78aa3f4Steve Block    return false;
58889ff5bedced41f7901101fa36064aa99b78aa3f4Steve Block}
58989ff5bedced41f7901101fa36064aa99b78aa3f4Steve Block
5901caed8e3c0af63e20009e74642e2574e1185c38eLeon ScrogginsPassRefPtr<PopupMenu> ChromeClientAndroid::createPopupMenu(PopupMenuClient* client) const
5919e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block{
59282160d9cd33152498ed3f4e701e713c15e50d7e5Leon Scroggins    return adoptRef(new PopupMenuAndroid(static_cast<ListPopupMenuClient*>(client)));
5939e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block}
5949e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block
5959e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve BlockPassRefPtr<SearchPopupMenu> ChromeClientAndroid::createSearchPopupMenu(PopupMenuClient*) const
5969e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block{
5979e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block    return adoptRef(new SearchPopupMenuAndroid);
5989e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block}
5999e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block
600c4daefab2bd7617afd2562dad5353da63d239428Steve Blockvoid ChromeClientAndroid::reachedApplicationCacheOriginQuota(SecurityOrigin*)
601c4daefab2bd7617afd2562dad5353da63d239428Steve Block{
602c4daefab2bd7617afd2562dad5353da63d239428Steve Block    notImplemented();
603c4daefab2bd7617afd2562dad5353da63d239428Steve Block}
604c4daefab2bd7617afd2562dad5353da63d239428Steve Block
60560950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch#if ENABLE(ANDROID_INSTALLABLE_WEB_APPS)
60660950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdochvoid ChromeClientAndroid::webAppCanBeInstalled()
60760950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch{
60860950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch    FrameView* frameView = m_webFrame->page()->mainFrame()->view();
60960950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch    android::WebViewCore* core = android::WebViewCore::getWebViewCore(frameView);
61060950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch    if (core)
61160950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch        core->notifyWebAppCanBeInstalled();
61260950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch}
61360950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch#endif
61460950638e3cf833c59b11f87d2cf170bfb8e169bBen Murdoch
615cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard#if ENABLE(VIDEO)
616cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roardbool ChromeClientAndroid::supportsFullscreenForNode(const Node* node)
617cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard{
618cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard      return node->hasTagName(HTMLNames::videoTag);
619cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard}
620cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard
621cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roardvoid ChromeClientAndroid::enterFullscreenForNode(Node* node)
622cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard{
623cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard      if (!node->hasTagName(HTMLNames::videoTag))
624cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard          return;
625cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard
626cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard      HTMLMediaElement* videoElement = static_cast<HTMLMediaElement*>(node);
6278e1d10880da3108f7eb53ae81682a7c4192a2e3fTeng-Hui Zhu      String url = videoElement->currentSrc();
628cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard      LayerAndroid* layer = videoElement->platformLayer();
629cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard      if (!layer)
630cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard          return;
631cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard
632cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard      FrameView* frameView = m_webFrame->page()->mainFrame()->view();
633cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard      android::WebViewCore* core = android::WebViewCore::getWebViewCore(frameView);
634bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu      m_webFrame->page()->mainFrame()->document()->webkitWillEnterFullScreenForElement(videoElement);
635cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard      if (core)
6368e1d10880da3108f7eb53ae81682a7c4192a2e3fTeng-Hui Zhu          core->enterFullscreenForVideoLayer(layer->uniqueId(), url);
637cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard}
638cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard
639cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roardvoid ChromeClientAndroid::exitFullscreenForNode(Node* node)
640cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard{
64195740c40dc0b78f1342ec0c257664b4300a07e6bTeng-Hui Zhu    FrameView* frameView = m_webFrame->page()->mainFrame()->view();
64295740c40dc0b78f1342ec0c257664b4300a07e6bTeng-Hui Zhu    android::WebViewCore* core = android::WebViewCore::getWebViewCore(frameView);
64395740c40dc0b78f1342ec0c257664b4300a07e6bTeng-Hui Zhu    if (core)
64495740c40dc0b78f1342ec0c257664b4300a07e6bTeng-Hui Zhu        core->exitFullscreenVideo();
64595740c40dc0b78f1342ec0c257664b4300a07e6bTeng-Hui Zhu    return;
646cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard}
647cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard#endif
648cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard
649bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu#if ENABLE(FULLSCREEN_API)
650bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhuvoid ChromeClientAndroid::exitFullScreenForElement(Element* element)
651bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu{
652bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu    if (!element)
653bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu        return;
654bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu
655bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu    HTMLMediaElement* videoElement = static_cast<HTMLMediaElement*>(element);
656bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu    videoElement->exitFullscreen();
657bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu}
658bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu#endif
659cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
661