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)
98494de5e407849a3533d56bc3dddc1ca3a8c6f704Chris Craik        webViewCore->contentDraw();
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
164a7151f16f5233a27b2e2ea837ed801e8ac85ccfdJohn Reckbool ChromeClientAndroid::canTakeFocus(FocusDirection direction)
165a7151f16f5233a27b2e2ea837ed801e8ac85ccfdJohn Reck{
166a7151f16f5233a27b2e2ea837ed801e8ac85ccfdJohn Reck    return android::WebViewCore::getWebViewCore(m_webFrame->page()->mainFrame()->view())->chromeCanTakeFocus(direction);
167a7151f16f5233a27b2e2ea837ed801e8ac85ccfdJohn Reck}
168a7151f16f5233a27b2e2ea837ed801e8ac85ccfdJohn Reck
169a7151f16f5233a27b2e2ea837ed801e8ac85ccfdJohn Reckvoid ChromeClientAndroid::takeFocus(FocusDirection direction)
170a7151f16f5233a27b2e2ea837ed801e8ac85ccfdJohn Reck{
171a7151f16f5233a27b2e2ea837ed801e8ac85ccfdJohn Reck    android::WebViewCore::getWebViewCore(m_webFrame->page()->mainFrame()->view())->chromeTakeFocus(direction);
172a7151f16f5233a27b2e2ea837ed801e8ac85ccfdJohn Reck}
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
174ba01ca1ef2bfe8916fafb72fee4a594a0cb2e302Leon Scrogginsvoid ChromeClientAndroid::focusedNodeChanged(Node* node)
175ba01ca1ef2bfe8916fafb72fee4a594a0cb2e302Leon Scroggins{
176ba01ca1ef2bfe8916fafb72fee4a594a0cb2e302Leon Scroggins    android::WebViewCore::getWebViewCore(m_webFrame->page()->mainFrame()->view())->focusNodeChanged(node);
177ba01ca1ef2bfe8916fafb72fee4a594a0cb2e302Leon Scroggins}
178ba01ca1ef2bfe8916fafb72fee4a594a0cb2e302Leon Scroggins
17997349b6656c58e631c13b8552b077870a6a32ebaTeng-Hui Zhuvoid ChromeClientAndroid::focusedFrameChanged(Frame*) { notImplemented(); }
180d5340bbd847b3fabb04f28f1aa8425f1874b0bb3Steve Block
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPage* ChromeClientAndroid::createWindow(Frame* frame, const FrameLoadRequest&,
182f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck        const WindowFeatures& features, const NavigationAction&)
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(frame);
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_MULTIPLE_WINDOWS
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (frame->settings() && !(frame->settings()->supportMultipleWindows()))
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If the client doesn't support multiple windows, just return the current page
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return frame->page();
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1914f8aa4f0ecca0a22c3907ae810301b48b3370f95John Reck    FloatRect window = windowRect();
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool dialog = features.dialog || !features.resizable
1934f8aa4f0ecca0a22c3907ae810301b48b3370f95John Reck            || (features.heightSet && features.height < window.height()
1944f8aa4f0ecca0a22c3907ae810301b48b3370f95John Reck                    && features.widthSet && features.width < window.width())
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            || (!features.menuBarVisible && !features.statusBarVisible
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    && !features.toolBarVisible && !features.locationBarVisible
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    && !features.scrollbarsVisible);
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // fullscreen definitely means no dialog
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (features.fullscreen)
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dialog = false;
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::Frame* newFrame = m_webFrame->createWindow(dialog,
202e3235d1e747128c0e8ad4d2164a9cfde6c873409Iain Merrick            ScriptController::processingUserGesture());
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (newFrame) {
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebCore::Page* page = newFrame->page();
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        page->setGroupName(frame->page()->groupName());
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return page;
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NULL;
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::show() { notImplemented(); }
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::canRunModal() { notImplemented(); return false; }
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::runModal() { notImplemented(); }
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setToolbarsVisible(bool) { notImplemented(); }
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::toolbarsVisible() { notImplemented(); return false; }
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setStatusbarVisible(bool) { notImplemented(); }
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::statusbarVisible() { notImplemented(); return false; }
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setScrollbarsVisible(bool) { notImplemented(); }
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::scrollbarsVisible() { notImplemented(); return false; }
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setMenubarVisible(bool) { notImplemented(); }
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::menubarVisible() { notImplemented(); return false; }
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setResizable(bool) { notImplemented(); }
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23002f88d26cf0763bd684a752045695aaf902844bcTeng-Hui Zhu#if ENABLE(CONTEXT_MENUS)
23102f88d26cf0763bd684a752045695aaf902844bcTeng-Hui Zhuvoid ChromeClientAndroid::showContextMenu() { notImplemented(); }
23202f88d26cf0763bd684a752045695aaf902844bcTeng-Hui Zhu#endif
23302f88d26cf0763bd684a752045695aaf902844bcTeng-Hui Zhu
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called by the JavaScript bindings to print usually an error to
235bf22f208d6fb755dd4ddebbde1a1a3b23e597990Ben Murdoch// a message console. Pass the message to the java side so that the client can
236bf22f208d6fb755dd4ddebbde1a1a3b23e597990Ben Murdoch// handle it as it sees fit.
237edfe3a5175efb80966f71463612aaa1a169074a4Ben Murdochvoid ChromeClientAndroid::addMessageToConsole(MessageSource, MessageType, MessageLevel msgLevel, const String& message, unsigned int lineNumber, const String& sourceID) {
238edfe3a5175efb80966f71463612aaa1a169074a4Ben Murdoch    android::WebViewCore::getWebViewCore(m_webFrame->page()->mainFrame()->view())->addMessageToConsole(message, lineNumber, sourceID, msgLevel);
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
241b872967b3009769a7980ecac8c7f2a2626fd9a88George Mountvoid ChromeClientAndroid::formDidBlur(const WebCore::Node* node) { notImplemented(); }
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::canRunBeforeUnloadConfirmPanel() { return true; }
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::runBeforeUnloadConfirmPanel(const String& message, Frame* frame) {
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String url = frame->document()->documentURI();
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return android::WebViewCore::getWebViewCore(frame->view())->jsUnload(url, message);
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::closeWindowSoon()
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_webFrame);
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Page* page = m_webFrame->page();
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* mainFrame = page->mainFrame();
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This will prevent javascript cross-scripting during unload
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    page->setGroupName(String());
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Stop loading but do not send the unload event
256d867a0e9b483e848580a3a98f73a8352884eac2bSteve Block    mainFrame->loader()->stopLoading(UnloadEventPolicyNone);
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cancel all pending loaders
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mainFrame->loader()->stopAllLoaders();
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Remove all event listeners so that no javascript can execute as a result
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // of mouse/keyboard events.
2615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    mainFrame->document()->removeAllEventListeners();
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Close the window.
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->closeWindow(android::WebViewCore::getWebViewCore(mainFrame->view()));
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::runJavaScriptAlert(Frame* frame, const String& message)
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String url = frame->document()->documentURI();
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    android::WebViewCore::getWebViewCore(frame->view())->jsAlert(url, message);
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::runJavaScriptConfirm(Frame* frame, const String& message)
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String url = frame->document()->documentURI();
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return android::WebViewCore::getWebViewCore(frame->view())->jsConfirm(url, message);
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* This function is called for the javascript method Window.prompt(). A dialog should be shown on
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the screen with an input put box. First param is the text, the second is the default value for
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the input box, third is return param. If the function returns true, the value set in the third parameter
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * is provided to javascript, else null is returned to the script.
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ChromeClientAndroid::runJavaScriptPrompt(Frame* frame, const String& message, const String& defaultValue, String& result)
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String url = frame->document()->documentURI();
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return android::WebViewCore::getWebViewCore(frame->view())->jsPrompt(url, message, defaultValue, result);
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::setStatusbarText(const String&) { notImplemented(); }
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is called by the JavaScript interpreter when a script has been running for a long
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// time. A dialog should be shown to the user asking them if they would like to cancel the
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Javascript. If true is returned, the script is cancelled.
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// To make a device more responsive, we default to return true to disallow long running script.
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This implies that some of scripts will not be completed.
297d15fb80564c4e30b088ca87fa21a03d67675c662Guang Zhubool ChromeClientAndroid::shouldInterruptJavaScript() {
298d15fb80564c4e30b088ca87fa21a03d67675c662Guang Zhu  FrameView* frameView = m_webFrame->page()->mainFrame()->view();
299d15fb80564c4e30b088ca87fa21a03d67675c662Guang Zhu  return android::WebViewCore::getWebViewCore(frameView)->jsInterrupt();
300d15fb80564c4e30b088ca87fa21a03d67675c662Guang Zhu}
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
302fe73b6358fa742d943e85ba9a90544a7b6ba8d9dBen MurdochKeyboardUIMode ChromeClientAndroid::keyboardUIMode()
303fe73b6358fa742d943e85ba9a90544a7b6ba8d9dBen Murdoch{
304ceeeab6161d7d8bf970ecf98affa4f4966df6f01John Reck    return KeyboardAccessTabsToLinks;
305fe73b6358fa742d943e85ba9a90544a7b6ba8d9dBen Murdoch}
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect ChromeClientAndroid::windowResizerRect() const { return IntRect(0, 0, 0, 0); }
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30901eb58e0c8da43223275f0eb2a1e4691125405d1Steve Blockvoid ChromeClientAndroid::invalidateWindow(const IntRect&, bool)
31001eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block{
31101eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block    notImplemented();
31201eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block}
31301eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block
31401eb58e0c8da43223275f0eb2a1e4691125405d1Steve Blockvoid ChromeClientAndroid::invalidateContentsAndWindow(const IntRect& updateRect, bool /*immediate*/)
31501eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block{
31601eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block    notImplemented();
31701eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block}
31801eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block
31901eb58e0c8da43223275f0eb2a1e4691125405d1Steve Blockvoid ChromeClientAndroid::invalidateContentsForSlowScroll(const IntRect& updateRect, bool immediate)
32001eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block{
32101eb58e0c8da43223275f0eb2a1e4691125405d1Steve Block    notImplemented();
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// new to change 38068 (Nov 6, 2008)
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::scroll(const IntSize& scrollDelta,
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const IntRect& rectToScroll, const IntRect& clipRect) {
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// new to change 38068 (Nov 6, 2008)
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntPoint ChromeClientAndroid::screenToWindow(const IntPoint&) const {
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return IntPoint();
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// new to change 38068 (Nov 6, 2008)
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect ChromeClientAndroid::windowToScreen(const IntRect&) const {
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return IntRect();
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
342d060767c4de6a275194ee9a58f151b82b17013bfSteve BlockPlatformPageClient ChromeClientAndroid::platformPageClient() const {
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Page* page = m_webFrame->page();
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* mainFrame = page->mainFrame();
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameView* view = mainFrame->view();
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PlatformWidget viewBridge = view->platformWidget();
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return viewBridge;
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ChromeClientAndroid::contentsSizeChanged(Frame*, const IntSize&) const
351635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
352635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
354635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ChromeClientAndroid::scrollRectIntoView(const IntRect&, const ScrollView*) const
3565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
3575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    notImplemented();
3585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
3595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
360635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ChromeClientAndroid::formStateDidChange(const Node*)
361635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
362635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
363635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
364635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
365f08b6f6172b9dd1defce51b868f951bcbf6c61c7Steve Blockvoid ChromeClientAndroid::scrollbarsModeDidChange() const
366f08b6f6172b9dd1defce51b868f951bcbf6c61c7Steve Block{
367f08b6f6172b9dd1defce51b868f951bcbf6c61c7Steve Block    notImplemented();
368f08b6f6172b9dd1defce51b868f951bcbf6c61c7Steve Block}
369f08b6f6172b9dd1defce51b868f951bcbf6c61c7Steve Block
3708db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wangvoid ChromeClientAndroid::dispatchViewportDataDidChange(const ViewportArguments& input) const {
3718db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang#ifdef ANDROID_META_SUPPORT
3728db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang    const ViewportArguments emptyArgument;
3738db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang    if (input == emptyArgument) {
3748db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang        // Empty Argument is for a page with no viewport meta tag; so reset everything.
3758db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang        m_webFrame->page()->settings()->resetMetadataSettings();
3768db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang    }
3778db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang    Document* doc = m_webFrame->page()->mainFrame()->document();
3788db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang    if (!doc->ownerElement()) {
3798db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang        FrameView* view = doc->view();
3808db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang        if (view)
3818db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang            PlatformBridge::updateViewport(view);
3828db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang    }
3838db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang#endif
3848db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang}
3858db9f9e9e78973e25adf06722ce8f9126e92c60bShimeng (Simon) Wang
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::mouseDidMoveOverElement(const HitTestResult&, unsigned int) {}
3872eef744339814ace28e6835115e7e389fb8b7962Andrei Popescuvoid ChromeClientAndroid::setToolTip(const String&, TextDirection) {}
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ChromeClientAndroid::print(Frame*) {}
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3906172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch/*
3916172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * This function is called on the main (webcore) thread by SQLTransaction::deliverQuotaIncreaseCallback.
3926172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * The way that the callback mechanism is designed inside SQLTransaction means that there must be a new quota
3936172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * (which may be equal to the old quota if the user did not allow more quota) when this function returns. As
3946172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * we call into the browser thread to ask what to do with the quota, we block here and get woken up when the
3956172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch * browser calls the native WebViewCore::SetDatabaseQuota method with the new quota value.
3966172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch */
3978ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#if ENABLE(DATABASE)
3986172bff036b26f8ea852196733426c6ff608ed8aBen Murdochvoid ChromeClientAndroid::exceededDatabaseQuota(Frame* frame, const String& name)
3996172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch{
4006172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    SecurityOrigin* origin = frame->document()->securityOrigin();
401fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    DatabaseTracker& tracker = WebCore::DatabaseTracker::tracker();
4026172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch
40363da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    m_isNewQuotaSet = false;
4046172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch
405cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // This origin is being tracked and has exceeded it's quota. Call into
406cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // the Java side of things to inform the user.
407cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    unsigned long long currentQuota = 0;
408fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    if (tracker.hasEntryForOrigin(origin))
409fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        currentQuota = tracker.quotaForOrigin(origin);
4104dc5706791f76d14261e27a58f50fcf305fcf1b0Ben Murdoch
411fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    unsigned long long estimatedSize = 0;
412fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
413fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    // Only update estimatedSize if we are trying to create a a new database, i.e. the usage for the database is 0.
414fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    if (tracker.usageForDatabase(name, origin) == 0)
415fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        estimatedSize = tracker.detailsForNameAndOrigin(name, origin).expectedUsage();
4164dc5706791f76d14261e27a58f50fcf305fcf1b0Ben Murdoch
417b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (android::WebViewCore::getWebViewCore(frame->view())->exceededDatabaseQuota(frame->document()->documentURI(), name, currentQuota, estimatedSize)) {
418b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        // We've sent notification to the browser so now wait for it to come back.
419b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        m_quotaThreadLock.lock();
420b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        while (!m_isNewQuotaSet) {
421b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block            m_quotaThreadCondition.wait(m_quotaThreadLock);
422b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        }
423b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        m_quotaThreadLock.unlock();
424b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    } else {
425b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        // We failed to send the message to the UI thread to request a new quota,
426b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        // so just use the current quota as a default.
427b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        m_newQuota = currentQuota;
4286172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    }
429cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu
43063da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    if (m_newQuota < currentQuota)
43163da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block        m_newQuota = currentQuota;
432fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
43363da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    // If new quota is unavailable, we may be able to resolve the situation by
43463da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    // shrinking the quota of an origin that asked for a lot but is only using a
43563da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    // little. If we find such a site, shrink it's quota and ask Java to try
43663da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    // again.
43763da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    if (m_newQuota == currentQuota && !m_triedToReclaimDBQuota) {
438fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        m_triedToReclaimDBQuota = true; // we should only try this once per quota overflow.
439fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        unsigned long long reclaimedQuotaBytes = tryToReclaimDatabaseQuota(origin);
440fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
441fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        // If we were able to free up enough space, try asking Java again.
442fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        // Otherwise, give up and deny the new database. :(
443fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        if (reclaimedQuotaBytes >= estimatedSize) {
444fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            exceededDatabaseQuota(frame, name);
445fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            return;
446fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        }
447fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    }
448fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
449cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // Update the DatabaseTracker with the new quota value (if the user declined
450cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // new quota, this may equal the old quota)
451fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    tracker.setQuota(origin, m_newQuota);
452fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    m_triedToReclaimDBQuota = false;
453fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch}
454fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
455fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdochstatic unsigned long long tryToReclaimDatabaseQuota(SecurityOrigin* originNeedingQuota) {
456fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    DatabaseTracker& tracker = WebCore::DatabaseTracker::tracker();
457fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    Vector<RefPtr<SecurityOrigin> > origins;
458fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    tracker.origins(origins);
459fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    unsigned long long reclaimedQuotaBytes = 0;
46087962ce00229855c098ba12cee8d5c015a835289Cary Clark    for (unsigned i = 0; i < origins.size(); i++) {
461fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        SecurityOrigin* originToReclaimFrom = origins[i].get();
462fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
463fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        // Don't try to reclaim from the origin that has exceeded its quota.
464fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        if (originToReclaimFrom->equal(originNeedingQuota))
465fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            continue;
466fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
467fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        unsigned long long originUsage = tracker.usageForOrigin(originToReclaimFrom);
468fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        unsigned long long originQuota = tracker.quotaForOrigin(originToReclaimFrom);
469fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        // If the origin has a quota that is more than it's current usage +1MB, shrink it.
470fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        static const int ONE_MB = 1 * 1024 * 1024;
471fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        if (originUsage + ONE_MB < originQuota) {
472fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            unsigned long long newQuota = originUsage + ONE_MB;
473fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            tracker.setQuota(originToReclaimFrom, newQuota);
474fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch            reclaimedQuotaBytes += originQuota - newQuota;
475fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch        }
476fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    }
477fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch    return reclaimedQuotaBytes;
4786172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch}
4798ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#endif
480fd1655b631e1deeaf68e31673486b66e707b6f36Ben Murdoch
481c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu#if ENABLE(OFFLINE_WEB_APPLICATIONS)
482c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescuvoid ChromeClientAndroid::reachedMaxAppCacheSize(int64_t spaceNeeded)
483c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu{
48463da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    m_isNewQuotaSet = false;
485cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    Page* page = m_webFrame->page();
486cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    Frame* mainFrame = page->mainFrame();
487cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    FrameView* view = mainFrame->view();
488b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block
489b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    // If we fail to send the message to the UI thread to request a new quota,
490b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    // there's nothing to do.
491b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!android::WebViewCore::getWebViewCore(view)->reachedMaxAppCacheSize(spaceNeeded))
492b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
493cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu
494cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    // We've sent notification to the browser so now wait for it to come back.
495cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    m_quotaThreadLock.lock();
49663da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    while (!m_isNewQuotaSet) {
497cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu       m_quotaThreadCondition.wait(m_quotaThreadLock);
498cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    }
499cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    m_quotaThreadLock.unlock();
500cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    if (m_newQuota > 0) {
501cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu        WebCore::cacheStorage().setMaximumSize(m_newQuota);
502cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu        // Now the app cache will retry the saving the previously failed cache.
503cd942b3786cfce15a858784fb072c40e713c54cbAndrei Popescu    }
504c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu}
505c60802dd50f86c37e0596d41c3ef6fc2c8804da4Andrei Popescu#endif
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5077e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarkevoid ChromeClientAndroid::populateVisitedLinks()
5087e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke{
5097e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke    Page* page = m_webFrame->page();
5107e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke    Frame* mainFrame = page->mainFrame();
5117e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke    FrameView* view = mainFrame->view();
5127e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke    android::WebViewCore::getWebViewCore(view)->populateVisitedLinks(&page->group());
5137e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke}
5147e7a0fd96b7d18fa3562af3b2bb4c7516fe9babeLeon Clarke
515bf280393189a33efa29a33c0d96c84710484f2f7Leon Scrogginsvoid ChromeClientAndroid::runOpenPanel(Frame* frame,
516bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins        PassRefPtr<FileChooser> chooser)
517bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins{
518bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins    android::WebViewCore* core = android::WebViewCore::getWebViewCore(
519bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins            frame->view());
520bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins    core->openFileChooser(chooser);
521bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins}
522bf280393189a33efa29a33c0d96c84710484f2f7Leon Scroggins
52345b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdochvoid ChromeClientAndroid::chooseIconForFiles(const Vector<WTF::String>&, FileChooser*)
524e55806d9d9fe6be5bb3ee076392f2803ff0179f9Steve Block{
525e55806d9d9fe6be5bb3ee076392f2803ff0179f9Steve Block    notImplemented();
526e55806d9d9fe6be5bb3ee076392f2803ff0179f9Steve Block}
527e55806d9d9fe6be5bb3ee076392f2803ff0179f9Steve Block
5286c58635db69329cd8c46dc17dd670bdcbf1a889aBen Murdochvoid ChromeClientAndroid::setCursor(const Cursor&)
5295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
5305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    notImplemented();
5315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
53363da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Blockvoid ChromeClientAndroid::wakeUpMainThreadWithNewQuota(long long newQuota) {
5346172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    MutexLocker locker(m_quotaThreadLock);
53563da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    m_newQuota = newQuota < 0 ? 0 : newQuota;
53663da3f053ab8a3590e4dcd4a51056cb2d277a7d8Steve Block    m_isNewQuotaSet = true;
5376172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch    m_quotaThreadCondition.signal();
5386172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch}
5396172bff036b26f8ea852196733426c6ff608ed8aBen Murdoch
540f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch#if ENABLE(TOUCH_EVENTS)
541d1919980a4bbb7f3aa73a6a83110fbec0c220e59Ben Murdochvoid ChromeClientAndroid::needTouchEvents(bool needTouchEvents)
542f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch{
543f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch    FrameView* frameView = m_webFrame->page()->mainFrame()->view();
544f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch    android::WebViewCore* core = android::WebViewCore::getWebViewCore(frameView);
545f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch    if (core)
546d1919980a4bbb7f3aa73a6a83110fbec0c220e59Ben Murdoch        core->needTouchEvents(needTouchEvents);
547f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch}
548f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch#endif
549f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch
5509e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Blockbool ChromeClientAndroid::selectItemWritingDirectionIsNatural()
5519e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block{
5529e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block    return false;
5539e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block}
5549e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block
55589ff5bedced41f7901101fa36064aa99b78aa3f4Steve Blockbool ChromeClientAndroid::selectItemAlignmentFollowsMenuWritingDirection()
55689ff5bedced41f7901101fa36064aa99b78aa3f4Steve Block{
55789ff5bedced41f7901101fa36064aa99b78aa3f4Steve Block    return false;
55889ff5bedced41f7901101fa36064aa99b78aa3f4Steve Block}
55989ff5bedced41f7901101fa36064aa99b78aa3f4Steve Block
5601caed8e3c0af63e20009e74642e2574e1185c38eLeon ScrogginsPassRefPtr<PopupMenu> ChromeClientAndroid::createPopupMenu(PopupMenuClient* client) const
5619e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block{
56282160d9cd33152498ed3f4e701e713c15e50d7e5Leon Scroggins    return adoptRef(new PopupMenuAndroid(static_cast<ListPopupMenuClient*>(client)));
5639e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block}
5649e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block
5659e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve BlockPassRefPtr<SearchPopupMenu> ChromeClientAndroid::createSearchPopupMenu(PopupMenuClient*) const
5669e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block{
5679e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block    return adoptRef(new SearchPopupMenuAndroid);
5689e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block}
5699e4593fcc93d1bf0b5d5aa00b17ed2177c8eed06Steve Block
570c4daefab2bd7617afd2562dad5353da63d239428Steve Blockvoid ChromeClientAndroid::reachedApplicationCacheOriginQuota(SecurityOrigin*)
571c4daefab2bd7617afd2562dad5353da63d239428Steve Block{
572c4daefab2bd7617afd2562dad5353da63d239428Steve Block    notImplemented();
573c4daefab2bd7617afd2562dad5353da63d239428Steve Block}
574c4daefab2bd7617afd2562dad5353da63d239428Steve Block
575cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard#if ENABLE(VIDEO)
576cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roardbool ChromeClientAndroid::supportsFullscreenForNode(const Node* node)
577cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard{
578cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard      return node->hasTagName(HTMLNames::videoTag);
579cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard}
580cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard
581cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roardvoid ChromeClientAndroid::enterFullscreenForNode(Node* node)
582cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard{
583cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard      if (!node->hasTagName(HTMLNames::videoTag))
584cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard          return;
585cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard
586cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard      HTMLMediaElement* videoElement = static_cast<HTMLMediaElement*>(node);
587cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard
588cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard      FrameView* frameView = m_webFrame->page()->mainFrame()->view();
589cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard      android::WebViewCore* core = android::WebViewCore::getWebViewCore(frameView);
590cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard      if (core)
5910675e22b46a05cdd3f6e20133a94bb8448231dfaTeng-Hui Zhu          core->enterFullscreenForVideoLayer();
5920675e22b46a05cdd3f6e20133a94bb8448231dfaTeng-Hui Zhu
5930675e22b46a05cdd3f6e20133a94bb8448231dfaTeng-Hui Zhu      MediaPlayer* player = videoElement->player();
5940675e22b46a05cdd3f6e20133a94bb8448231dfaTeng-Hui Zhu      if (player) {
5950675e22b46a05cdd3f6e20133a94bb8448231dfaTeng-Hui Zhu          // We need to use the same document object as the
5960675e22b46a05cdd3f6e20133a94bb8448231dfaTeng-Hui Zhu          // MediaPlayerPrivateAndroid::onStopFullscreen().
5970675e22b46a05cdd3f6e20133a94bb8448231dfaTeng-Hui Zhu          Document* doc = player->mediaPlayerClient()->mediaPlayerOwningDocument();
5980675e22b46a05cdd3f6e20133a94bb8448231dfaTeng-Hui Zhu          if (doc)
5990675e22b46a05cdd3f6e20133a94bb8448231dfaTeng-Hui Zhu              doc->webkitWillEnterFullScreenForElement(videoElement);
6000675e22b46a05cdd3f6e20133a94bb8448231dfaTeng-Hui Zhu          // Now the player is responsible to trigger to the java side for
6010675e22b46a05cdd3f6e20133a94bb8448231dfaTeng-Hui Zhu          // entering full screen mode.
6020675e22b46a05cdd3f6e20133a94bb8448231dfaTeng-Hui Zhu          player->enterFullscreenMode();
6030675e22b46a05cdd3f6e20133a94bb8448231dfaTeng-Hui Zhu      }
604cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard}
605cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard
606cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roardvoid ChromeClientAndroid::exitFullscreenForNode(Node* node)
607cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard{
60895740c40dc0b78f1342ec0c257664b4300a07e6bTeng-Hui Zhu    FrameView* frameView = m_webFrame->page()->mainFrame()->view();
60995740c40dc0b78f1342ec0c257664b4300a07e6bTeng-Hui Zhu    android::WebViewCore* core = android::WebViewCore::getWebViewCore(frameView);
61095740c40dc0b78f1342ec0c257664b4300a07e6bTeng-Hui Zhu    if (core)
61195740c40dc0b78f1342ec0c257664b4300a07e6bTeng-Hui Zhu        core->exitFullscreenVideo();
61295740c40dc0b78f1342ec0c257664b4300a07e6bTeng-Hui Zhu    return;
613cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard}
614cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard#endif
615cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard
616bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu#if ENABLE(FULLSCREEN_API)
617bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhuvoid ChromeClientAndroid::exitFullScreenForElement(Element* element)
618bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu{
619bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu    if (!element)
620bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu        return;
621bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu
622bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu    HTMLMediaElement* videoElement = static_cast<HTMLMediaElement*>(element);
623bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu    videoElement->exitFullscreen();
624bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu}
625bb6c037d4178a0b35e964651e09323c8d714f435Teng-Hui Zhu#endif
626cc2679391d89b57997f78365d54d99c9ae062db3Nicolas Roard
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
628