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