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