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