FrameLoaderClientAndroid.cpp revision 211634993282bd9d5c18b26d70e7909aa4a3cfdc
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 */ 253298a7d84b96ade73c6b170671711a8f2792ae59Steve Block 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_TAG "WebCore" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 2977dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "FrameLoaderClientAndroid.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3177dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "BackForwardList.h" 328ec4217018562da37ecf4144e582fa848b807263Grace Kloba#include "CachedFrame.h" 338ec4217018562da37ecf4144e582fa848b807263Grace Kloba#include "CachedFramePlatformDataAndroid.h" 345b71639dd156f6224bbb25ed257ac70374641f6bSteve Block#include "Chrome.h" 355b71639dd156f6224bbb25ed257ac70374641f6bSteve Block#include "ChromeClientAndroid.h" 36b20ea4938e919d82254b11885220c8564546d1caPatrick Scott#include "DOMImplementation.h" 3777dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "Document.h" 3877dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "DocumentLoader.h" 3995a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch#include "EditorClientAndroid.h" 40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Frame.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoader.h" 425ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain Merrick#include "FrameNetworkingContextAndroid.h" 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameTree.h" 4477dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "FrameView.h" 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h" 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLFrameOwnerElement.h" 478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "HTMLPlugInElement.h" 4877dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "HistoryItem.h" 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IconDatabase.h" 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MIMETypeRegistry.h" 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NotImplemented.h" 523bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen#include "PackageNotifier.h" 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h" 54334e51bc2ff9bf7fc55fa67dc8a6d9257501a32eLeon Scroggins#include "PlatformBridge.h" 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformGraphicsContext.h" 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h" 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginDatabase.h" 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginView.h" 59585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch#include "PluginViewBase.h" 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ProgressTracker.h" 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderPart.h" 629dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott#include "RenderView.h" 639dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott#include "RenderWidget.h" 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceError.h" 6577dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "ResourceHandle.h" 6677dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "ResourceHandleInternal.h" 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectionController.h" 6877dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "Settings.h" 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkCanvas.h" 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkRect.h" 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextEncoding.h" 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreFrameBridge.h" 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreResourceLoader.h" 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebHistory.h" 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebIconDatabase.h" 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebFrameView.h" 771f9212cd9a5e957562b12e8c3294b7f357fa1f85Huahui Wu#include "WebViewClientError.h" 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebViewCore.h" 7995a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch#include "autofill/WebAutoFill.h" 8077dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "android_graphics.h" 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <utils/AssetManager.h> 8379768700a853c40c66ff0b0591957958667fdd9eSteve Block#include <wtf/text/CString.h> 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern android::AssetManager* globalAssetManager(); 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android { 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const int EXTRA_LAYOUT_DELAY = 1000; 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoaderClientAndroid::FrameLoaderClientAndroid(WebFrame* webframe) 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_frame(NULL) 933e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott , m_webFrame(webframe) 943e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott , m_manualLoader(NULL) 959dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott , m_hasSentResponseToPlugin(false) 969dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott , m_onDemandPluginsEnabled(false) { 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Retain(m_webFrame); 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoaderClientAndroid* FrameLoaderClientAndroid::get(const WebCore::Frame* frame) 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return static_cast<FrameLoaderClientAndroid*> (frame->loader()->client()); 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::frameLoaderDestroyed() { 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project registerForIconNotification(false); 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame = 0; 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Release(m_webFrame); 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete this; 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::hasWebView() const { 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME, 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // there is one web view per page, or top frame. 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // as android's view is created from Java side, it is always there. 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::makeRepresentation(DocumentLoader*) { 1209dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott m_onDemandPluginsEnabled = false; 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // don't use representation 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verifiedOk(); 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::forceLayout() { 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 1278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->view()->forceLayout(); 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME, should we adjust view size here? 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->view()->adjustViewSize(); 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::forceLayoutForNonHTML() { 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setCopiesOnScroll() { 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this is a hint about whether we need to force redraws, or can 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // just copy the scrolled content. Since we always force a redraw 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // anyways, we can ignore this call. 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verifiedOk(); 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::detachedFromParent2() { 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME, ready to detach frame from view 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::detachedFromParent3() { 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME, ready to release view 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is responsible for associating the "id" with a given 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// subresource load. The following functions that accept an "id" are 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// called for each subresource, so they should not be dispatched to the m_frame. 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::assignIdentifierToInitialRequest(unsigned long id, 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader*, const ResourceRequest&) { 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lowPriority_notImplemented(); 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillSendRequest(DocumentLoader*, unsigned long id, 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest&, const ResourceResponse&) { 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lowPriority_notImplemented(); 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 165635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool FrameLoaderClientAndroid::shouldUseCredentialStorage(DocumentLoader*, unsigned long identifier) 166635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project notImplemented(); 168635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return false; 169635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 170635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveAuthenticationChallenge(DocumentLoader*, 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long id, const AuthenticationChallenge&) { 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lowPriority_notImplemented(); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCancelAuthenticationChallenge(DocumentLoader*, 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long id, const AuthenticationChallenge&) { 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lowPriority_notImplemented(); 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveResponse(DocumentLoader*, 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long id, const ResourceResponse&) { 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lowPriority_notImplemented(); 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveContentLength(DocumentLoader*, 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long id, int lengthReceived) { 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lowPriority_notImplemented(); 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishLoading(DocumentLoader*, 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long id) { 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lowPriority_notImplemented(); 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailLoading(DocumentLoader* docLoader, 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long id, const ResourceError&) { 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lowPriority_notImplemented(); 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::dispatchDidLoadResourceFromMemoryCache(DocumentLoader*, 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceRequest&, const ResourceResponse&, int length) { 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidHandleOnloadEvents() { 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveServerRedirectForProvisionalLoad() { 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Tell the load it was a redirect. 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->loadStarted(m_frame); 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCancelClientRedirect() { 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillPerformClientRedirect(const KURL&, 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double interval, double fireDate) { 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidChangeLocationWithinPage() { 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2296a011ab807deb276b9924d501a4219542092958cSteve Blockvoid FrameLoaderClientAndroid::dispatchDidPushStateWithinPage() 2306a011ab807deb276b9924d501a4219542092958cSteve Block{ 2316a011ab807deb276b9924d501a4219542092958cSteve Block notImplemented(); 2326a011ab807deb276b9924d501a4219542092958cSteve Block} 2336a011ab807deb276b9924d501a4219542092958cSteve Block 2346a011ab807deb276b9924d501a4219542092958cSteve Blockvoid FrameLoaderClientAndroid::dispatchDidReplaceStateWithinPage() 2356a011ab807deb276b9924d501a4219542092958cSteve Block{ 2366a011ab807deb276b9924d501a4219542092958cSteve Block notImplemented(); 2376a011ab807deb276b9924d501a4219542092958cSteve Block} 2386a011ab807deb276b9924d501a4219542092958cSteve Block 2396a011ab807deb276b9924d501a4219542092958cSteve Blockvoid FrameLoaderClientAndroid::dispatchDidPopStateWithinPage() 2406a011ab807deb276b9924d501a4219542092958cSteve Block{ 2416a011ab807deb276b9924d501a4219542092958cSteve Block notImplemented(); 2426a011ab807deb276b9924d501a4219542092958cSteve Block} 2436a011ab807deb276b9924d501a4219542092958cSteve Block 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillClose() { 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveIcon() { 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->tree() && m_frame->tree()->parent()) 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 25245b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch WTF::String url(m_frame->loader()->url().string()); 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Try to obtain the icon image. 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::Image* icon = WebCore::iconDatabase()->iconForPageURL( 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url, WebCore::IntSize(16, 16)); 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the request fails, try the original request url. 2575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!icon) { 2585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian DocumentLoader* docLoader = m_frame->loader()->activeDocumentLoader(); 2595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian KURL originalURL = docLoader->originalRequest().url(); 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project icon = WebCore::iconDatabase()->iconForPageURL( 2615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian originalURL, WebCore::IntSize(16, 16)); 2625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // There is a bug in webkit where cancelling an icon load is treated as a 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // failure. When this is fixed, we can ASSERT again that we have an icon. 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (icon) { 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOGV("Received icon (%p) for %s", icon, 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url.utf8().data()); 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->didReceiveIcon(icon); 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOGV("Icon data for %s unavailable, registering for notification...", 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url.utf8().data()); 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project registerForIconNotification(); 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 276c6fbc06882c120f5f51090203775eb0421550d13Patrick Scottvoid FrameLoaderClientAndroid::dispatchDidReceiveTouchIconURL(const String& url, bool precomposed) { 277f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott ASSERT(m_frame); 278f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott // Do not report sub frame touch icons 279f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott if (m_frame->tree() && m_frame->tree()->parent()) 280f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott return; 281c6fbc06882c120f5f51090203775eb0421550d13Patrick Scott m_webFrame->didReceiveTouchIconURL(url, precomposed); 282f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott} 283f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidStartProvisionalLoad() { 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveTitle(const String& title) { 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Used to check for FrameLoadTypeStandard but we only want to send the title for 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the top frame and not sub-frames. 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->tree() || !m_frame->tree()->parent()) { 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->setTitle(title); 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCommitLoad() { 29895a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch#if ENABLE(WEB_AUTOFILL) 29995a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch if (m_frame == m_frame->page()->mainFrame()) { 30095a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch EditorClientAndroid* editorC = static_cast<EditorClientAndroid*>(m_frame->page()->editorClient()); 30195a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch WebAutoFill* autoFill = editorC->getAutoFill(); 30295a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch autoFill->reset(); 30395a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch } 30495a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch#endif 30546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark verifiedOk(); 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void loadDataIntoFrame(Frame* frame, KURL baseUrl, const String& url, 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const String& data) { 310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (baseUrl.isEmpty()) { 311635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project baseUrl = blankURL(); 312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 313635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ResourceRequest request(baseUrl); 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CString cstr = data.utf8(); 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<WebCore::SharedBuffer> buf = WebCore::SharedBuffer::create(cstr.data(), cstr.length()); 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SubstituteData subData(buf, String("text/html"), String("utf-8"), 317635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project KURL(KURL(), url)); 318635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project frame->loader()->load(request, subData, false); 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailProvisionalLoad(const ResourceError& error) { 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Ignore ErrorInterrupted since it is due to a policy interruption. This 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // is caused by a decision to download the main resource rather than 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // display it. 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (error.errorCode() == InternalErrorInterrupted 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project || error.errorCode() == InternalErrorCancelled) { 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we decided to download the main resource or if the user cancelled 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // it, make sure we report that the load is done. 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project didFinishLoad(); 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project AssetManager* am = globalAssetManager(); 33559d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check to see if the error code was not generated internally 337334e51bc2ff9bf7fc55fa67dc8a6d9257501a32eLeon Scroggins WebCore::PlatformBridge::rawResId id = WebCore::PlatformBridge::NoDomain; 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ((error.errorCode() == ErrorFile || 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project error.errorCode() == ErrorFileNotFound) && 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (!error.localizedDescription().isEmpty())) { 341334e51bc2ff9bf7fc55fa67dc8a6d9257501a32eLeon Scroggins id = WebCore::PlatformBridge::LoadError; 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String filename = m_webFrame->getRawResourceFilename(id); 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (filename.isEmpty()) 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Grab the error page from the asset manager 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Asset* a = am->openNonAsset( 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project filename.utf8().data(), Asset::ACCESS_BUFFER); 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!a) 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Take the failing url and encode html entities so javascript urls are not 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // executed. 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CString failingUrl = error.failingURL().utf8(); 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WTF::Vector<char> url; 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int len = failingUrl.length(); 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const char* data = failingUrl.data(); 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (int i = 0; i < len; i++) { 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char c = data[i]; 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project || (c >= '0' && c <= '9')) 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url.append(c); 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char buf[16]; 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int res = sprintf(buf, "&#%d;", c); 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project buf[res] = 0; 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url.append(buf, res); 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Replace all occurances of %s with the failing url. 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String s = UTF8Encoding().decode((const char*)a->getBuffer(false), a->getLength()); 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s = s.replace("%s", String(url.data(), url.size())); 37559d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Replace all occurances of %e with the error text 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s = s.replace("%e", error.localizedDescription()); 378ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create the request and the substitute data and tell the FrameLoader to 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // load with the replacement data. 381ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project // use KURL(const char*) as KURL(const String& url) can trigger ASSERT for 382ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project // invalidate URL string. 383e372b0aa0721bf108058f04c43ad1365058369b2Steve Block loadDataIntoFrame(m_frame, KURL(ParsedURLString, data), error.failingURL(), s); 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Delete the asset. 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete a; 38785248e3a39ad1010d9df785fc0d82162fe7d2d27Leon Scroggins III 38885248e3a39ad1010d9df785fc0d82162fe7d2d27Leon Scroggins III // Report that the load is finished, since it failed. 38985248e3a39ad1010d9df785fc0d82162fe7d2d27Leon Scroggins III didFinishLoad(); 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailLoad(const ResourceError&) { 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // called when page is completed with error 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project didFinishLoad(); 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishDocumentLoad() { 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // called when finishedParsing 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lowPriority_notImplemented(); 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishLoad() { 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project didFinishLoad(); 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFirstLayout() { 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 4088b2ec69eaf97dd8a817342ca54044d74da6b4b19Grace Kloba // set EXTRA_LAYOUT_DELAY if the loader is not completed yet 4098b2ec69eaf97dd8a817342ca54044d74da6b4b19Grace Kloba if (!m_frame->loader()->isComplete()) 4108b2ec69eaf97dd8a817342ca54044d74da6b4b19Grace Kloba m_frame->document()->setExtraLayoutDelay(EXTRA_LAYOUT_DELAY); 411635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // we need to do this here instead of dispatchDidFirstVisuallyNonEmptyLayout 412635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // so that about:blank will update the screen. 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->tree()->parent()) { 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Only need to notify Java side for the top frame 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebViewCore::getWebViewCore(m_frame->view())->didFirstLayout(); 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 419635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFirstVisuallyNonEmptyLayout() 420635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 421635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project notImplemented(); 422635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 423635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 424f1f796b0c3a725a520ac41959a0db7855480e9deJohn ReckFrame* FrameLoaderClientAndroid::dispatchCreatePage(const NavigationAction&) { 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_MULTIPLE_WINDOWS 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->settings() && m_frame->settings()->supportMultipleWindows()) 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Always a user gesture since window.open maps to 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // ChromeClientAndroid::createWindow 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_webFrame->createWindow(false, true); 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the client doesn't support multiple windows, just replace the 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // current frame's contents. 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_frame; 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchShow() { 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->view()->invalidate(); 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool TreatAsAttachment(const String& content_disposition) { 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Some broken sites just send 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Content-Disposition: ; filename="file" 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // screen those out here. 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (content_disposition.startsWith(";")) 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (content_disposition.startsWith("inline", false)) 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Some broken sites just send 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Content-Disposition: filename="file" 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // without a disposition token... screen those out. 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (content_disposition.startsWith("filename", false)) 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Also in use is Content-Disposition: name="file" 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (content_disposition.startsWith("name", false)) 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We have a content-disposition of "attachment" or unknown. 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // RFC 2183, section 2.8 says that an unknown disposition 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // value should be treated as "attachment" 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForMIMEType(FramePolicyFunction func, 4717df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott const String& MIMEType, const ResourceRequest& request) { 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(func); 4747df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott if (!func) 4757df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott return; 4761e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott 4771e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott PolicyChecker* policy = m_frame->loader()->policyChecker(); 4781e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott 4797df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott if (request.isNull()) { 4801e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott (policy->*func)(PolicyIgnore); 4817df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott return; 4827df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott } 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Default to Use (display internally). 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PolicyAction action = PolicyUse; 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check if we should Download instead. 4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceResponse& response = m_frame->loader()->activeDocumentLoader()->response(); 4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const String& content_disposition = response.httpHeaderField("Content-Disposition"); 4881e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott if (!content_disposition.isEmpty() && 4891e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott TreatAsAttachment(content_disposition)) { 4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Server wants to override our normal policy. 4911e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott // Check to see if we are a sub frame (main frame has no owner element) 4921e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott if (m_frame->ownerElement() != 0) 4931e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott action = PolicyIgnore; 4941e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott else 4951e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott action = PolicyDownload; 4961e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott (policy->*func)(action); 4971e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott return; 4981e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott } 4991e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott 5001e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott // Ask if it can be handled internally. 5011e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott if (!canShowMIMEType(MIMEType)) { 5021e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott // Check to see if we are a sub frame (main frame has no owner element) 5031e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott if (m_frame->ownerElement() != 0) 5041e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott action = PolicyIgnore; 5051e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott else 5061e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott action = PolicyDownload; 5071e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott (policy->*func)(action); 5081e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott return; 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // A status code of 204 indicates no content change. Ignore the result. 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::DocumentLoader* docLoader = m_frame->loader()->activeDocumentLoader(); 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (docLoader->response().httpStatusCode() == 204) 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project action = PolicyIgnore; 5141e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott (policy->*func)(action); 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForNewWindowAction(FramePolicyFunction func, 518b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch const NavigationAction& action, const ResourceRequest& request, 5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PassRefPtr<FormState> formState, const String& frameName) { 5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 5217df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott ASSERT(func); 5227df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott if (!func) 5237df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott return; 524b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch 5257df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott if (request.isNull()) { 526035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block (m_frame->loader()->policyChecker()->*func)(PolicyIgnore); 5277df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott return; 5287df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott } 529b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch 530b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch if (action.type() == NavigationTypeFormSubmitted || action.type() == NavigationTypeFormResubmitted) 531b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch m_frame->loader()->resetMultipleFormSubmissionProtection(); 532b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we get to this point it means that a link has a target that was not 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // found by the frame tree. Instead of creating a new frame, return the 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // current frame in dispatchCreatePage. 5367df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott if (canHandleRequest(request)) 537035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block (m_frame->loader()->policyChecker()->*func)(PolicyUse); 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 539035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block (m_frame->loader()->policyChecker()->*func)(PolicyIgnore); 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::cancelPolicyCheck() { 5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lowPriority_notImplemented(); 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchUnableToImplementPolicy(const ResourceError&) { 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForNavigationAction(FramePolicyFunction func, 5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const NavigationAction& action, const ResourceRequest& request, 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PassRefPtr<FormState> formState) { 5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(func); 5557df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott if (!func) 5567df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott return; 5577df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott if (request.isNull()) { 558035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block (m_frame->loader()->policyChecker()->*func)(PolicyIgnore); 5597df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott return; 5607df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott } 561b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch 562b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch // Reset multiple form submission protection. If this is a resubmission, we check with the 563b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch // user and reset the protection if they choose to resubmit the form (see WebCoreFrameBridge.cpp) 564b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch if (action.type() == NavigationTypeFormSubmitted) 565b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch m_frame->loader()->resetMultipleFormSubmissionProtection(); 566b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch 5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (action.type() == NavigationTypeFormResubmitted) { 5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->decidePolicyForFormResubmission(func); 5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 570eae4493cc3434169fc14b44b851dac62db492aa5Patrick Scott } else 571035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block (m_frame->loader()->policyChecker()->*func)(PolicyUse); 5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillSubmitForm(FramePolicyFunction func, PassRefPtr<FormState>) { 5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(func); 577035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block (m_frame->loader()->policyChecker()->*func)(PolicyUse); 5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidLoadMainResource(DocumentLoader*) { 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::revertToProvisionalState(DocumentLoader*) { 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setMainDocumentError(DocumentLoader* docLoader, const ResourceError& error) { 5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 5903e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott if (m_manualLoader) { 5913e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_manualLoader->didFail(error); 5923e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_manualLoader = NULL; 5933e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_hasSentResponseToPlugin = false; 5943e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott } else { 5951f9212cd9a5e957562b12e8c3294b7f357fa1f85Huahui Wu if (!error.isNull() && error.errorCode() >= InternalErrorLast && error.errorCode() != ERROR_OK) 5963e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_webFrame->reportError(error.errorCode(), 5973e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott error.localizedDescription(), error.failingURL()); 5983e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott } 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called right before the progress is updated. 6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::willChangeEstimatedProgress() { 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verifiedOk(); 6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called after the progress has been updated. The bad part 6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// about this is that when a page is completed, this function is called after 6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the progress has been reset to 0. 6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didChangeEstimatedProgress() { 6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verifiedOk(); 6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This will give us the initial estimate when the page first starts to load. 6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressStartedNotification() { 6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->page()) 6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->setProgress(m_frame->page()->progress()->estimatedProgress()); 6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This will give us any updated progress including the final progress. 6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressEstimateChangedNotification() { 6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->page()) 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->setProgress(m_frame->page()->progress()->estimatedProgress()); 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is just a notification that the progress has finished. Don't call 6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// setProgress(1) because postProgressEstimateChangedNotification will do so. 6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressFinishedNotification() { 63059d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger WebViewCore* core = WebViewCore::getWebViewCore(m_frame->view()); 6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->tree()->parent()) { 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // only need to notify Java for the top frame 63359d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger core->notifyProgressFinished(); 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 63559d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger // notify plugins that the frame has loaded 63659d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger core->notifyPluginsOnFrameLoad(m_frame); 6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setMainFrameDocumentReady(bool) { 6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this is only interesting once we provide an external API for the DOM 6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::startDownload(const ResourceRequest&) { 6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::willChangeTitle(DocumentLoader*) { 6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verifiedOk(); 6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didChangeTitle(DocumentLoader* loader) { 6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verifiedOk(); 6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::finishedLoading(DocumentLoader* docLoader) { 6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Telling the frame we received some data and passing 0 as the data is our 6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // way to get work done that is normally done when the first bit of data is 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // received, even for the case of a document with no data (like about:blank) 6603e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott if (!m_manualLoader) { 6613e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott committedLoad(docLoader, 0, 0); 6623e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott return; 6633e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott } 6643e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott 6653e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_manualLoader->didFinishLoading(); 6663e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_manualLoader = NULL; 6673e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_hasSentResponseToPlugin = false; 6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 670635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::updateGlobalHistory() { 6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 6726689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins 6736689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins DocumentLoader* docLoader = m_frame->loader()->documentLoader(); 6746689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins ASSERT(docLoader); 6756689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins 6766689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins // Code copied from FrameLoader.cpp:createHistoryItem 6776689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins // Only add this URL to the database if it is a valid page 6786689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins if (docLoader->unreachableURL().isEmpty() 6796689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins && docLoader->response().httpStatusCode() < 400) { 6806689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins m_webFrame->updateVisitedHistory(docLoader->urlForHistory(), false); 68148c46b2d3efc59f2883218d8e713d403b658ff2bPatrick Scott if (!docLoader->serverRedirectSourceForHistory().isNull()) 682e372b0aa0721bf108058f04c43ad1365058369b2Steve Block m_webFrame->updateVisitedHistory(KURL(ParsedURLString, docLoader->serverRedirectDestinationForHistory()), false); 6836689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins } 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoaderClientAndroid::updateGlobalHistoryRedirectLinks() { 687635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Note, do we need to do anything where there is no HistoryItem? If we call 688635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // updateGlobalHistory(), we will add bunch of "data:xxx" urls for gmail.com 689635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // which is not what we want. Opt to do nothing now. 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::shouldGoToHistoryItem(HistoryItem* item) const { 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // hmmm, seems like we might do a more thoughtful check 6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return item != NULL; 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 698b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Blockvoid FrameLoaderClientAndroid::didDisplayInsecureContent() 699b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block{ 700b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block notImplemented(); 701b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block} 702b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block 703b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Blockvoid FrameLoaderClientAndroid::didRunInsecureContent(SecurityOrigin*) 704b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block{ 705b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block notImplemented(); 706b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block} 707b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block 7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::committedLoad(DocumentLoader* loader, const char* data, int length) { 7099abe77efade00cb2e8add0327bd1b1a9cbe3af97Steve Block if (!m_manualLoader) 7109abe77efade00cb2e8add0327bd1b1a9cbe3af97Steve Block loader->commitData(data, length); 7119abe77efade00cb2e8add0327bd1b1a9cbe3af97Steve Block else { 7123e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott if (!m_hasSentResponseToPlugin) { 7133e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_manualLoader->didReceiveResponse(loader->response()); 7143e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott // Failure could cause the main document to have an error causing 7153e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott // the manual loader to be reset. 7163e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott if (!m_manualLoader) 7173e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott return; 7183e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_hasSentResponseToPlugin = true; 7193e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott } 7203e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_manualLoader->didReceiveData(data, length); 7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cancelledError(const ResourceRequest& request) { 725635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return ResourceError(String(), InternalErrorCancelled, request.url(), String()); 7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cannotShowURLError(const ResourceRequest& request) { 729635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return ResourceError(String(), InternalErrorCannotShowUrl, request.url(), String()); 7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::interruptForPolicyChangeError(const ResourceRequest& request) { 733635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return ResourceError(String(), InternalErrorInterrupted, request.url(), String()); 7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cannotShowMIMETypeError(const ResourceResponse& request) { 737635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return ResourceError(String(), InternalErrorCannotShowMimeType, request.url(), String()); 7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::fileDoesNotExistError(const ResourceResponse& request) { 741635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return ResourceError(String(), InternalErrorFileDoesNotExist, request.url(), String()); 7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::pluginWillHandleLoadError(const ResourceResponse& request) { 745635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return ResourceError(String(), InternalErrorPluginWillHandleLoadError, request.url(), String()); 7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::shouldFallBack(const ResourceError&) { 7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canHandleRequest(const ResourceRequest& request) const { 7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Don't allow hijacking of intrapage navigation 75659d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger if (WebCore::equalIgnoringFragmentIdentifier(request.url(), m_frame->loader()->url())) 7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Don't allow hijacking of iframe urls that are http or https 7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (request.url().protocol().startsWith("http", false) && 7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->tree() && m_frame->tree()->parent()) 7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 764cb86952d254446a800421b5804f886f8d87cd875Grace Kloba return m_webFrame->canHandleRequest(request); 7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canShowMIMEType(const String& mimeType) const { 7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: This looks like it has to do with whether or not a type can be 7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // shown "internally" (i.e. inside the browser) regardless of whether 7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // or not the browser is doing the rendering, e.g. a full page plugin. 7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (MIMETypeRegistry::isSupportedImageResourceMIMEType(mimeType) || 7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType) || 7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MIMETypeRegistry::isSupportedJavaScriptMIMEType(mimeType) || 7740981d957132dc87d7cd48ae62a37002cb37c811dGrace Kloba (m_frame && m_frame->settings() 7750981d957132dc87d7cd48ae62a37002cb37c811dGrace Kloba && m_frame->settings()->arePluginsEnabled() 7760981d957132dc87d7cd48ae62a37002cb37c811dGrace Kloba && PluginDatabase::installedPlugins()->isMIMETypeRegistered( 7770981d957132dc87d7cd48ae62a37002cb37c811dGrace Kloba mimeType)) || 7785165094157ce50696d79167abc1125fc4b38b545Patrick Scott (DOMImplementation::isTextMIMEType(mimeType) && 7795165094157ce50696d79167abc1125fc4b38b545Patrick Scott !mimeType.startsWith("text/vnd")) || 780b20ea4938e919d82254b11885220c8564546d1caPatrick Scott DOMImplementation::isXMLMIMEType(mimeType)) 7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7858398c067254e66df9f726716f95aee2a0ca7b39aSteve Blockbool FrameLoaderClientAndroid::canShowMIMETypeAsHTML(const String& mimeType) const { 7868398c067254e66df9f726716f95aee2a0ca7b39aSteve Block return false; 7878398c067254e66df9f726716f95aee2a0ca7b39aSteve Block} 7888398c067254e66df9f726716f95aee2a0ca7b39aSteve Block 7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::representationExistsForURLScheme(const String&) const { 7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // don't use representation 7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verifiedOk(); 7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::generatedMIMETypeForURLScheme(const String& URLScheme) const { 7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME, copy from Apple's port 7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String mimetype("x-apple-web-kit/"); 7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mimetype.append(URLScheme.lower()); 7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return mimetype; 8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::frameLoadCompleted() { 8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // copied from Apple port, without this back with sub-frame will trigger ASSERT 8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::saveViewStateToItem(HistoryItem* item) { 8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(item); 8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // store the current scale (only) for the top frame 8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->tree()->parent()) { 812211634993282bd9d5c18b26d70e7909aa4a3cfdcPatrick Scott // We should have added a bridge when the child item was added to its 813211634993282bd9d5c18b26d70e7909aa4a3cfdcPatrick Scott // parent. 814211634993282bd9d5c18b26d70e7909aa4a3cfdcPatrick Scott AndroidWebHistoryBridge* bridge = item->bridge(); 815211634993282bd9d5c18b26d70e7909aa4a3cfdcPatrick Scott ASSERT(bridge); 816a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view()); 817c4683829d0d4932156a97ce14ea15deed71bf21dShimeng (Simon) Wang bridge->setScale(webViewCore->scale()); 818c4683829d0d4932156a97ce14ea15deed71bf21dShimeng (Simon) Wang bridge->setTextWrapScale(webViewCore->textWrapScale()); 8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::notifyHistoryItemChanged(item); 8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::restoreViewState() { 8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view()); 82667ed0edeb2ad5bb22ec778472b78d41e7eb3b68aSteve Block HistoryItem* item = m_frame->loader()->history()->currentItem(); 827be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch AndroidWebHistoryBridge* bridge = item->bridge(); 8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // restore the scale (only) for the top frame 8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->tree()->parent()) { 830c05b3a990126a5a1de357c025e25e6acd4e4e185Grace Kloba webViewCore->restoreScale(bridge->scale(), bridge->textWrapScale()); 8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 834be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdochvoid FrameLoaderClientAndroid::dispatchDidAddBackForwardItem(HistoryItem* item) const { 8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->addHistoryItem(item); 8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 839be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdochvoid FrameLoaderClientAndroid::dispatchDidRemoveBackForwardItem(HistoryItem* item) const { 8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 841be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch m_webFrame->removeHistoryItem(0); 8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 844be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdochvoid FrameLoaderClientAndroid::dispatchDidChangeBackForwardIndex() const { 8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 846be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch BackForwardList* list = m_frame->page()->backForwardList(); 847be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch ASSERT(list); 8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->updateHistoryIndex(list->backListCount()); 8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::provisionalLoadStarted() { 8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->loadStarted(m_frame); 8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didFinishLoad() { 8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->setExtraLayoutDelay(0); 8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->didFinishLoad(m_frame); 8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::prepareForDataSourceReplacement() { 8635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian verifiedOk(); 8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<DocumentLoader> FrameLoaderClientAndroid::createDocumentLoader( 8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceRequest& request, const SubstituteData& data) { 8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> loader = DocumentLoader::create(request, data); 8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return loader.release(); 8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setTitle(const String& title, const KURL& url) { 8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Not needed. dispatchDidReceiveTitle is called immediately after this. 8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // url is used to update the Apple port history items. 8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verifiedOk(); 8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::userAgent(const KURL& u) { 8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_webFrame->userAgentForURL(&u); 8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8828ec4217018562da37ecf4144e582fa848b807263Grace Klobavoid FrameLoaderClientAndroid::savePlatformDataToCachedFrame(WebCore::CachedFrame* cachedFrame) { 8838ec4217018562da37ecf4144e582fa848b807263Grace Kloba CachedFramePlatformDataAndroid* platformData = new CachedFramePlatformDataAndroid(m_frame->settings()); 8848ec4217018562da37ecf4144e582fa848b807263Grace Kloba cachedFrame->setCachedFramePlatformData(platformData); 885635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 886635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 8878ec4217018562da37ecf4144e582fa848b807263Grace Klobavoid FrameLoaderClientAndroid::transitionToCommittedFromCachedFrame(WebCore::CachedFrame* cachedFrame) { 8888ec4217018562da37ecf4144e582fa848b807263Grace Kloba CachedFramePlatformDataAndroid* platformData = reinterpret_cast<CachedFramePlatformDataAndroid*>(cachedFrame->cachedFramePlatformData()); 8898ec4217018562da37ecf4144e582fa848b807263Grace Kloba#ifdef ANDROID_META_SUPPORT 8908ec4217018562da37ecf4144e582fa848b807263Grace Kloba platformData->restoreMetadata(m_frame->settings()); 8918ec4217018562da37ecf4144e582fa848b807263Grace Kloba#endif 892ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba m_webFrame->transitionToCommitted(m_frame); 893635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 894635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 895635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::transitionToCommittedForNewPage() { 896635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(m_frame); 897cb86952d254446a800421b5804f886f8d87cd875Grace Kloba 898cb86952d254446a800421b5804f886f8d87cd875Grace Kloba#ifdef ANDROID_META_SUPPORT 899cb86952d254446a800421b5804f886f8d87cd875Grace Kloba // reset metadata settings for the main frame as they are not preserved cross page 900cb86952d254446a800421b5804f886f8d87cd875Grace Kloba if (m_frame == m_frame->page()->mainFrame() && m_frame->settings()) 901cb86952d254446a800421b5804f886f8d87cd875Grace Kloba m_frame->settings()->resetMetadataSettings(); 902cb86952d254446a800421b5804f886f8d87cd875Grace Kloba#endif 903cb86952d254446a800421b5804f886f8d87cd875Grace Kloba 9048ec4217018562da37ecf4144e582fa848b807263Grace Kloba // Save the old WebViewCore before creating a new FrameView. There is one 9058ec4217018562da37ecf4144e582fa848b807263Grace Kloba // WebViewCore per page. Each frame, including the main frame and sub frame, 9068ec4217018562da37ecf4144e582fa848b807263Grace Kloba // has a 1:1 FrameView and WebFrameView. 9078ec4217018562da37ecf4144e582fa848b807263Grace Kloba WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view()); 9088ec4217018562da37ecf4144e582fa848b807263Grace Kloba Retain(webViewCore); 9098ec4217018562da37ecf4144e582fa848b807263Grace Kloba 910ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba // Save the old WebFrameView's bounds and apply them to the new WebFrameView 911bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen WebFrameView* oldWebFrameView = static_cast<WebFrameView*> (m_frame->view()->platformWidget()); 912bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen IntRect bounds = oldWebFrameView->getBounds(); 91327d79a6495971cad26199bdf5dc79abcb1ff1c9eGrace Kloba IntRect visBounds = oldWebFrameView->getVisibleBounds(); 914bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen IntRect windowBounds = oldWebFrameView->getWindowBounds(); 915bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen WebCore::FrameView* oldFrameView = oldWebFrameView->view(); 916a0e12fbb7d3eec607b7988fb8ff873305583acc4Steve Block const float oldZoomFactor = oldFrameView->frame()->textZoomFactor(); 91727d79a6495971cad26199bdf5dc79abcb1ff1c9eGrace Kloba m_frame->createView(bounds.size(), oldFrameView->baseBackgroundColor(), oldFrameView->isTransparent(), 91827d79a6495971cad26199bdf5dc79abcb1ff1c9eGrace Kloba oldFrameView->fixedLayoutSize(), oldFrameView->useFixedLayout()); 919a0e12fbb7d3eec607b7988fb8ff873305583acc4Steve Block if (oldZoomFactor != 1.0f && oldZoomFactor != m_frame->textZoomFactor()) { 920a0e12fbb7d3eec607b7988fb8ff873305583acc4Steve Block m_frame->setTextZoomFactor(oldZoomFactor); 9215c54c95ab6356ebcbf2ef44a299c3765d97eed6eShimeng (Simon) Wang } 922bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen 9238ec4217018562da37ecf4144e582fa848b807263Grace Kloba // Create a new WebFrameView for the new FrameView 9248ec4217018562da37ecf4144e582fa848b807263Grace Kloba WebFrameView* newFrameView = new WebFrameView(m_frame->view(), webViewCore); 925ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba newFrameView->setLocation(bounds.x(), bounds.y()); 926ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba newFrameView->setSize(bounds.width(), bounds.height()); 92727d79a6495971cad26199bdf5dc79abcb1ff1c9eGrace Kloba newFrameView->setVisibleSize(visBounds.width(), visBounds.height()); 928ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba newFrameView->setWindowBounds(windowBounds.x(), windowBounds.y(), windowBounds.width(), windowBounds.height()); 9298ec4217018562da37ecf4144e582fa848b807263Grace Kloba // newFrameView attaches itself to FrameView which Retains the reference, so 9308ec4217018562da37ecf4144e582fa848b807263Grace Kloba // call Release for newFrameView 9318ec4217018562da37ecf4144e582fa848b807263Grace Kloba Release(newFrameView); 9328ec4217018562da37ecf4144e582fa848b807263Grace Kloba // WebFrameView Retains webViewCore, so call Release for webViewCore 9338ec4217018562da37ecf4144e582fa848b807263Grace Kloba Release(webViewCore); 934635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 935635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_webFrame->transitionToCommitted(m_frame); 936635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 937635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 938f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reckvoid FrameLoaderClientAndroid::dispatchDidBecomeFrameset(bool) 939f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck{ 940f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck} 941f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck 9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canCachePage() const { 9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::download(ResourceHandle* handle, const ResourceRequest&, 9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceRequest&, const ResourceResponse&) { 9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Get the C++ side of the load listener and tell it to handle the download 94980e68b43c3da64848db8edc7d8e8fe095888e42eAndrei Popescu handle->getInternal()->m_loader->downloadFile(); 9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWTF::PassRefPtr<WebCore::Frame> FrameLoaderClientAndroid::createFrame(const KURL& url, const String& name, 9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTMLFrameOwnerElement* ownerElement, const String& referrer, 9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool allowsScrolling, int marginWidth, int marginHeight) 9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* parent = ownerElement->document()->frame(); 9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoaderClientAndroid* loaderC = new FrameLoaderClientAndroid(m_webFrame); 9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> pFrame = Frame::create(parent->page(), ownerElement, loaderC); 9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* newFrame = pFrame.get(); 9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loaderC->setFrame(newFrame); 9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Append the subframe to the parent and set the name of the subframe. The name must be set after 9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // appending the child so that the name becomes unique. 9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parent->tree()->appendChild(newFrame); 9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newFrame->tree()->setName(name); 9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create a new FrameView and WebFrameView for the child frame to draw into. 9665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian RefPtr<FrameView> frameView = FrameView::create(newFrame); 96759d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger WebFrameView* webFrameView = new WebFrameView(frameView.get(), 9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebViewCore::getWebViewCore(parent->view())); 9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // frameView Retains webFrameView, so call Release for webFrameView 9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Release(webFrameView); 9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Attach the frameView to the newFrame. 9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newFrame->setView(frameView); 9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newFrame->init(); 9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newFrame->selection()->setFocused(true); 9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOGV("::WebCore:: createSubFrame returning %p", newFrame); 9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The creation of the frame may have run arbitrary JavaScript that removed it from the page already. 9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!pFrame->page()) 9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 98059d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger 9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parent->loader()->loadURLIntoChildFrame(url, referrer, pFrame.get()); 9828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // onLoad may cuase the frame to be removed from the document. Allow the RefPtr to delete the child frame. 9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!pFrame->tree()->parent()) 9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NULL; 9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return pFrame.release(); 9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// YouTube flash url path starts with /v/ 9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const char slash_v_slash[] = { '/', 'v', '/' }; 992b2743d4d2391f76c75e6ec82f8fdc185d103b43aKristian Monsenstatic const char slash_e_slash[] = { '/', 'e', '/' }; 9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool isValidYouTubeVideo(const String& path) 9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!charactersAreAllASCII(path.characters(), path.length())) 9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned int len = path.length(); 9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (len <= sizeof(slash_v_slash)) // check for more than just /v/ 10008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CString str = path.lower().utf8(); 10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const char* data = str.data(); 1003b2743d4d2391f76c75e6ec82f8fdc185d103b43aKristian Monsen // Youtube flash url can start with /v/ or /e/ 10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (memcmp(data, slash_v_slash, sizeof(slash_v_slash)) != 0) 1005b2743d4d2391f76c75e6ec82f8fdc185d103b43aKristian Monsen if (memcmp(data, slash_e_slash, sizeof(slash_e_slash)) != 0) 1006b2743d4d2391f76c75e6ec82f8fdc185d103b43aKristian Monsen return false; 10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Start after /v/ 10088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned int i = sizeof(slash_v_slash); i < len; i++) { 10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char c = data[i]; 10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check for alpha-numeric characters only. 1011635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (WTF::isASCIIAlphanumeric(c) || c == '_' || c == '-') 10128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continue; 10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The url can have more parameters such as &hl=en after the video id. 10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Once we start seeing extra parameters we can return true. 10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return c == '&' && i > sizeof(slash_v_slash); 10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool isYouTubeUrl(const KURL& url, const String& mimeType) 10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1022635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project String host = url.host(); 1023635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool youtube = host.endsWith("youtube.com") 1024635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project || host.endsWith("youtube-nocookie.com"); 1025635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return youtube && isValidYouTubeVideo(url.path()) 10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && equalIgnoringCase(mimeType, "application/x-shockwave-flash"); 10278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10293bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsenstatic bool isYouTubeInstalled() { 10303bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen return WebCore::packageNotifier().isPackageInstalled("com.google.android.youtube"); 10313bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen} 10323bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen 1033585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch// Use PluginViewBase rather than an Android specific sub class as we do not require any 1034585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch// Android specific functionality; this just renders a placeholder which will later 1035585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch// activate the real plugin. 1036585ee724ef91cab37349b10b022e608510a7f763Ben Murdochclass PluginToggleWidget : public PluginViewBase { 10378216a0e796895ec6e736aebbeacee9567ae85515Patrick Scottpublic: 10388216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott PluginToggleWidget(Frame* parent, const IntSize& size, 10398216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott HTMLPlugInElement* elem, const KURL& url, 10408216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott const WTF::Vector<String>& paramNames, 10418216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott const WTF::Vector<String>& paramValues, const String& mimeType, 10428216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott bool loadManually) 1043585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch : PluginViewBase(0) 1044585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch , m_parent(parent) 10458216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott , m_size(size) 10468216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott , m_element(elem) 10478216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott , m_url(url) 10488216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott , m_paramNames(paramNames) 10498216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott , m_paramValues(paramValues) 10508216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott , m_mimeType(mimeType) 10518216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott , m_loadManually(loadManually) 10528216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott { 10538216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott resize(size); 10548216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott } 10558216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 10568216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott virtual void paint(GraphicsContext* ctx, const IntRect& rect) 10578216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott { 10588216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // Most of this code is copied from PluginView::paintMissingPluginIcon 10598216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // with slight modification. 10608216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 10618216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott static RefPtr<Image> image; 10621c95c29b31ed45a394643094162e01796c0c5122Patrick Scott if (!image) { 10638216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott image = Image::loadPlatformResource("togglePlugin"); 10648216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott } 10658216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 10668216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott IntRect imageRect(x(), y(), image->width(), image->height()); 10678216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 10688216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott int xOffset = (width() - imageRect.width()) >> 1; 10698216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott int yOffset = (height() - imageRect.height()) >> 1; 10708216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 10718216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott imageRect.move(xOffset, yOffset); 10728216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 10738216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott if (!rect.intersects(imageRect)) 10748216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott return; 10758216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 10768216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // FIXME: We need to clip similarly to paintMissingPluginIcon but it is 10778216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // way screwed up right now. It has something to do with how we tell 10788216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // webkit the scroll position and it causes the placeholder to get 10798216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // clipped very badly. http://b/issue?id=2533303 10808216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 10818216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott ctx->save(); 10828216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott ctx->clip(frameRect()); 10831c95c29b31ed45a394643094162e01796c0c5122Patrick Scott 1084b73606ba44efcb32effeb03603d2eaa402455062Ben Murdoch ctx->setFillColor(Color::white, ColorSpaceDeviceRGB); 10850e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang ctx->fillRect(frameRect()); 10860e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang if (frameRect().contains(imageRect)) { 10870e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang // Leave a 2 pixel padding. 10880e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang const int pixelWidth = 2; 10890e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang IntRect innerRect = frameRect(); 10900e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang innerRect.inflate(-pixelWidth); 10910e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang // Draw a 2 pixel light gray border. 1092b73606ba44efcb32effeb03603d2eaa402455062Ben Murdoch ctx->setStrokeColor(Color::lightGray, ColorSpaceDeviceRGB); 10930e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang ctx->strokeRect(innerRect, pixelWidth); 10940e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang } 10951c95c29b31ed45a394643094162e01796c0c5122Patrick Scott 10961c95c29b31ed45a394643094162e01796c0c5122Patrick Scott // Draw the image in the center 1097b73606ba44efcb32effeb03603d2eaa402455062Ben Murdoch ctx->drawImage(image.get(), ColorSpaceDeviceRGB, imageRect.location()); 10988216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott ctx->restore(); 10998216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott } 11008216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 11018216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott virtual void handleEvent(Event* event) 11028216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott { 11038216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott if (event->type() != eventNames().clickEvent) 11048216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott return; 11058216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 11069dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott Frame* frame = m_parent->page()->mainFrame(); 11079dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott while (frame) { 11089dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott RenderView* view = frame->contentRenderer(); 11099dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott const HashSet<RenderWidget*> widgets = view->widgets(); 11109dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott HashSet<RenderWidget*>::const_iterator it = widgets.begin(); 11119dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott HashSet<RenderWidget*>::const_iterator end = widgets.end(); 11129dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott for (; it != end; ++it) { 11139dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott Widget* widget = (*it)->widget(); 11149dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott // PluginWidget is used only with PluginToggleWidget 1115585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch if (widget->isPluginViewBase()) { 11169dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott PluginToggleWidget* ptw = 11179dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott static_cast<PluginToggleWidget*>(widget); 11189dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott ptw->swapPlugin(*it); 11199dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott } 11209dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott } 11219dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott frame = frame->tree()->traverseNext(); 11229dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott } 11239dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott } 11249dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott 11259dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott void swapPlugin(RenderWidget* renderer) { 11269dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott typedef FrameLoaderClientAndroid FLCA; 11279dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott FLCA* client = static_cast<FLCA*>(m_parent->loader()->client()); 11289dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott client->enableOnDemandPlugins(); 11298216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott WTF::PassRefPtr<PluginView> prpWidget = 11308216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott PluginView::create(m_parent.get(), 11318216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott m_size, 11328216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott m_element, 11338216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott m_url, 11348216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott m_paramNames, 11358216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott m_paramValues, 11368216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott m_mimeType, 11378216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott m_loadManually); 11388216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott RefPtr<Widget> myProtector(this); 11398216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott prpWidget->focusPluginElement(); 11408216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott renderer->setWidget(prpWidget); 11418216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott } 11428216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 11438216a0e796895ec6e736aebbeacee9567ae85515Patrick Scottprivate: 1144585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch void invalidateRect(const IntRect& rect) { } 1145585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch 11468216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott RefPtr<Frame> m_parent; 11478216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott IntSize m_size; 11488216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott HTMLPlugInElement* m_element; 11498216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott KURL m_url; 11508216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott WTF::Vector<String> m_paramNames; 11518216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott WTF::Vector<String> m_paramValues; 11528216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott String m_mimeType; 11538216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott bool m_loadManually; 11548216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott}; 11558216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 11566d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei PopescuWTF::PassRefPtr<Widget> FrameLoaderClientAndroid::createPlugin( 11578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const IntSize& size, 11588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian HTMLPlugInElement* element, 11598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const KURL& url, 11606d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu const WTF::Vector<String>& names, 11616d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu const WTF::Vector<String>& values, 11628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const String& mimeType, 11638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool loadManually) { 11648216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott WTF::PassRefPtr<PluginView> prpWidget = 0; 11658216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott#ifdef ANDROID_PLUGINS 11668216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // This is copied from PluginView.cpp. We need to determine if a plugin 11678216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // will be found before doing some of the work in PluginView. 11688216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott String mimeTypeCopy = mimeType; 11698216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott PluginPackage* plugin = 11708216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott PluginDatabase::installedPlugins()->findPlugin(url, mimeTypeCopy); 11718216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott if (!plugin && PluginDatabase::installedPlugins()->refresh()) { 11728216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott mimeTypeCopy = mimeType; 11738216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott plugin = PluginDatabase::installedPlugins()->findPlugin(url, 11748216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott mimeTypeCopy); 11758216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott } 11768216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott Settings* settings = m_frame->settings(); 11778216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // Do the placeholder if plugins are on-demand and there is a plugin for the 11788216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // given mime type. 11799dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott if (settings && settings->arePluginsOnDemand() && plugin && 11809dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott !m_onDemandPluginsEnabled) { 11818216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott return adoptRef(new PluginToggleWidget(m_frame, size, element, url, 11828216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott names, values, mimeType, loadManually)); 11838216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott } 11848216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott prpWidget = PluginView::create(m_frame, 11858216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott size, 11868216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott element, 11878216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott url, 11888216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott names, 11898216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott values, 11908216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott mimeType, 11918216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott loadManually); 11928216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // Return the plugin if it was loaded successfully. Otherwise, fallback to 11938216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // the youtube placeholder if possible. No need to check prpWidget as 11948216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // PluginView::create will create a PluginView for missing plugins. 11958216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // Note: this check really only checks if the plugin was found and not if 11968216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // the plugin was loaded. 11978216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott if (prpWidget->status() == PluginStatusLoadedSuccessfully) 11988216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott return prpWidget; 11998216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott#endif 12008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create an iframe for youtube urls. 12013bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen if (isYouTubeUrl(url, mimeType) && isYouTubeInstalled()) { 12026d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu WTF::RefPtr<Frame> frame = createFrame(blankURL(), String(), element, 12038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String(), false, 0, 0); 12048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (frame) { 12058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // grab everything after /v/ 12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String videoId = url.path().substring(sizeof(slash_v_slash)); 12078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Extract just the video id 12088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned videoIdEnd = 0; 12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (; videoIdEnd < videoId.length(); videoIdEnd++) { 12108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (videoId[videoIdEnd] == '&') { 12118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project videoId = videoId.left(videoIdEnd); 12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 12138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project AssetManager* am = globalAssetManager(); 12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Asset* a = am->open("webkit/youtube.html", 12178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Asset::ACCESS_BUFFER); 12188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!a) 12198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NULL; 12208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String s = String((const char*)a->getBuffer(false), a->getLength()); 12218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s = s.replace("VIDEO_ID", videoId); 12228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete a; 12238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loadDataIntoFrame(frame.get(), 1224e372b0aa0721bf108058f04c43ad1365058369b2Steve Block KURL(ParsedURLString, "file:///android_asset/webkit/"), String(), s); 12256d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu // Transfer ownership to a local refptr. 1226deb338ee1849d227ba106f707fb53c0f18b49518Grace Kloba WTF::RefPtr<Widget> widget(frame->view()); 12276d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu return widget.release(); 12288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12308216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott return prpWidget; 12318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::redirectDataToPlugin(Widget* pluginWidget) { 12343d2cfdc4c24631a2b60467b7dd03bb88f10be9b7Patrick Scott // Do not redirect data if the Widget is our plugin placeholder. 12353d2cfdc4c24631a2b60467b7dd03bb88f10be9b7Patrick Scott if (pluginWidget->isPluginView()) { 12363d2cfdc4c24631a2b60467b7dd03bb88f10be9b7Patrick Scott m_manualLoader = static_cast<PluginView*>(pluginWidget); 12373d2cfdc4c24631a2b60467b7dd03bb88f10be9b7Patrick Scott } 12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12406d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei PopescuWTF::PassRefPtr<Widget> FrameLoaderClientAndroid::createJavaAppletWidget(const IntSize&, HTMLAppletElement*, 12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const KURL& baseURL, const WTF::Vector<String>& paramNames, 12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const WTF::Vector<String>& paramValues) { 12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // don't support widget yet 12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12488f53f0666f20844fa87c63e5f823470c12fc2721Kristian Monsenvoid FrameLoaderClientAndroid::didTransferChildFrameToNewDocument(WebCore::Page*) 12495b71639dd156f6224bbb25ed257ac70374641f6bSteve Block{ 12505b71639dd156f6224bbb25ed257ac70374641f6bSteve Block ASSERT(m_frame); 12518e56126c98940dc57a03335780d4233e8c19b09fSteve Block // m_webFrame points to the WebFrame for the page that our frame previously 12525b71639dd156f6224bbb25ed257ac70374641f6bSteve Block // belonged to. If the frame now belongs to a new page, we need to update 12535b71639dd156f6224bbb25ed257ac70374641f6bSteve Block // m_webFrame to point to the WebFrame for the new page. 12545b71639dd156f6224bbb25ed257ac70374641f6bSteve Block Page* newPage = m_frame->page(); 12555b71639dd156f6224bbb25ed257ac70374641f6bSteve Block if (newPage != m_webFrame->page()) { 12565b71639dd156f6224bbb25ed257ac70374641f6bSteve Block ChromeClientAndroid* chromeClient = static_cast<ChromeClientAndroid*>(newPage->chrome()->client()); 12575b71639dd156f6224bbb25ed257ac70374641f6bSteve Block Release(m_webFrame); 12585b71639dd156f6224bbb25ed257ac70374641f6bSteve Block m_webFrame = chromeClient->webFrame(); 12595b71639dd156f6224bbb25ed257ac70374641f6bSteve Block Retain(m_webFrame); 12605b71639dd156f6224bbb25ed257ac70374641f6bSteve Block } 12615b71639dd156f6224bbb25ed257ac70374641f6bSteve Block} 12625b71639dd156f6224bbb25ed257ac70374641f6bSteve Block 1263f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reckvoid FrameLoaderClientAndroid::transferLoadingResourceFromPage(unsigned long, DocumentLoader*, const ResourceRequest&, Page*) 1264f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck{ 1265f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck notImplemented(); 1266f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck} 1267f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck 12688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is used by the <OBJECT> element to determine the type of 12698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the contents and work out if it can render it. 12708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectObjectContentType FrameLoaderClientAndroid::objectContentType(const KURL& url, 12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const String& mimeType) { 12726916255e3bc5760bcaac2ec7d5057e057bd3de6aPatrick Scott return FrameLoader::defaultObjectContentType(url, mimeType); 12738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function allows the application to set the correct CSS media 12768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// style. Android could use it to set the media style 'handheld'. Safari 12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// may use it to set the media style to 'print' when the user wants to print 12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// a particular web page. 12798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::overrideMediaType() const { 12808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lowPriority_notImplemented(); 12818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 12828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is used to re-attach Javascript<->native code classes. 1285031c32d25a37eec52b946918d7648750f8e59a1fSteve Blockvoid FrameLoaderClientAndroid::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld* world) 1286031c32d25a37eec52b946918d7648750f8e59a1fSteve Block{ 1287031c32d25a37eec52b946918d7648750f8e59a1fSteve Block if (world != mainThreadNormalWorld()) 1288031c32d25a37eec52b946918d7648750f8e59a1fSteve Block return; 1289031c32d25a37eec52b946918d7648750f8e59a1fSteve Block 12908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 129159d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger LOGV("::WebCore:: windowObjectCleared called on frame %p for %s\n", 12928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame, m_frame->loader()->url().string().ascii().data()); 12938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->windowObjectCleared(m_frame); 12948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoaderClientAndroid::documentElementAvailable() { 12978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 12988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 12998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Jun-07 tip of tree merge: 13008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::blockedError(ResourceRequest const& request) { 13018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ResourceError(String(), InternalErrorFileDoesNotExist, String(), String()); 13028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Nov-07 tip of tree merge: 13058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didPerformFirstNavigation() const { 130659d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger // This seems to be just a notification that the UI can listen to, to 130759d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger // know if the user has performed first navigation action. 130859d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger // It is called from 13098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // void FrameLoader::addBackForwardItemClippedAtTarget(bool doClip) 131059d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger // "Navigation" here means a transition from one page to another that 13118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // ends up in the back/forward list. 13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::registerForIconNotification(bool listen) { 13158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (listen) 13168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebIconDatabase::RegisterForIconNotification(this); 13178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 13188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebIconDatabase::UnregisterForIconNotification(this); 13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is the WebIconDatabaseClient method for receiving a notification when we 13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// get the icon for the page. 13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didAddIconForPageUrl(const String& pageUrl) { 13248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This call must happen before dispatchDidReceiveIcon since that method 13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // may register for icon notifications again since the icon data may have 13268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // to be read from disk. 13278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project registerForIconNotification(false); 1328e372b0aa0721bf108058f04c43ad1365058369b2Steve Block KURL u(ParsedURLString, pageUrl); 13299e2ee40924101fa594b0b31d866f896154b47caaBen Murdoch if (equalIgnoringFragmentIdentifier(u, m_frame->loader()->url())) { 13308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dispatchDidReceiveIcon(); 13318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1333f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott 13344c02d6a0244d7e6a7172e1f72aa514c7f68b1ceaBen Murdochvoid FrameLoaderClientAndroid::dispatchDidChangeIcons() { 13354c02d6a0244d7e6a7172e1f72aa514c7f68b1ceaBen Murdoch notImplemented(); 13364c02d6a0244d7e6a7172e1f72aa514c7f68b1ceaBen Murdoch} 13374c02d6a0244d7e6a7172e1f72aa514c7f68b1ceaBen Murdoch 13385ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain MerrickPassRefPtr<FrameNetworkingContext> FrameLoaderClientAndroid::createNetworkingContext() 13395ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain Merrick{ 13405ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain Merrick return FrameNetworkingContextAndroid::create(getFrame()); 13415ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain Merrick} 13425ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain Merrick 13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1344