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 "WebHistory.h" 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebIconDatabase.h" 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebFrameView.h" 761f9212cd9a5e957562b12e8c3294b7f357fa1f85Huahui Wu#include "WebViewClientError.h" 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebViewCore.h" 78a5b05f64bda3dea3ba23e77e9eb2ef59812cdc86Kristian Monsen#include "autofill/WebAutofill.h" 7977dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "android_graphics.h" 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 81a54eb7fa1e850d7096f97065f35ed00bcb5384d3Mathias Agopian#include <androidfw/AssetManager.h> 8279768700a853c40c66ff0b0591957958667fdd9eSteve Block#include <wtf/text/CString.h> 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 84a577c97987bfe6f96fee0081bcdf4d526a9f7d3fSteve Block#define verifiedOk() // Verified that we don't need to implement this. 85a577c97987bfe6f96fee0081bcdf4d526a9f7d3fSteve Block 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern android::AssetManager* globalAssetManager(); 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android { 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const int EXTRA_LAYOUT_DELAY = 1000; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoaderClientAndroid::FrameLoaderClientAndroid(WebFrame* webframe) 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_frame(NULL) 943e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott , m_webFrame(webframe) 953e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott , m_manualLoader(NULL) 969dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott , m_hasSentResponseToPlugin(false) 975498351dca14a6380ef3174a0afa0bb950b92d68Steve Block , m_onDemandPluginsEnabled(false) 985498351dca14a6380ef3174a0afa0bb950b92d68Steve Block , m_didReceiveServerRedirect(false) { 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Retain(m_webFrame); 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoaderClientAndroid* FrameLoaderClientAndroid::get(const WebCore::Frame* frame) 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return static_cast<FrameLoaderClientAndroid*> (frame->loader()->client()); 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::frameLoaderDestroyed() { 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project registerForIconNotification(false); 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame = 0; 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Release(m_webFrame); 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete this; 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::hasWebView() const { 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME, 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // there is one web view per page, or top frame. 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // as android's view is created from Java side, it is always there. 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::makeRepresentation(DocumentLoader*) { 1229dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott m_onDemandPluginsEnabled = false; 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // don't use representation 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verifiedOk(); 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::forceLayout() { 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 1298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->view()->forceLayout(); 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME, should we adjust view size here? 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->view()->adjustViewSize(); 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::forceLayoutForNonHTML() { 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setCopiesOnScroll() { 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this is a hint about whether we need to force redraws, or can 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // just copy the scrolled content. Since we always force a redraw 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // anyways, we can ignore this call. 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verifiedOk(); 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::detachedFromParent2() { 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME, ready to detach frame from view 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::detachedFromParent3() { 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME, ready to release view 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is responsible for associating the "id" with a given 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// subresource load. The following functions that accept an "id" are 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// called for each subresource, so they should not be dispatched to the m_frame. 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::assignIdentifierToInitialRequest(unsigned long id, 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader*, const ResourceRequest&) { 159a577c97987bfe6f96fee0081bcdf4d526a9f7d3fSteve Block notImplemented(); 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillSendRequest(DocumentLoader*, unsigned long id, 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest&, const ResourceResponse&) { 164a577c97987bfe6f96fee0081bcdf4d526a9f7d3fSteve Block notImplemented(); 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool FrameLoaderClientAndroid::shouldUseCredentialStorage(DocumentLoader*, unsigned long identifier) 168635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 169635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project notImplemented(); 170635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return false; 171635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 172635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveAuthenticationChallenge(DocumentLoader*, 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long id, const AuthenticationChallenge&) { 175a577c97987bfe6f96fee0081bcdf4d526a9f7d3fSteve Block notImplemented(); 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCancelAuthenticationChallenge(DocumentLoader*, 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long id, const AuthenticationChallenge&) { 180a577c97987bfe6f96fee0081bcdf4d526a9f7d3fSteve Block notImplemented(); 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveResponse(DocumentLoader*, 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long id, const ResourceResponse&) { 185a577c97987bfe6f96fee0081bcdf4d526a9f7d3fSteve Block notImplemented(); 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveContentLength(DocumentLoader*, 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long id, int lengthReceived) { 190a577c97987bfe6f96fee0081bcdf4d526a9f7d3fSteve Block notImplemented(); 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishLoading(DocumentLoader*, 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long id) { 195a577c97987bfe6f96fee0081bcdf4d526a9f7d3fSteve Block notImplemented(); 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailLoading(DocumentLoader* docLoader, 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long id, const ResourceError&) { 200a577c97987bfe6f96fee0081bcdf4d526a9f7d3fSteve Block notImplemented(); 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::dispatchDidLoadResourceFromMemoryCache(DocumentLoader*, 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceRequest&, const ResourceResponse&, int length) { 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidHandleOnloadEvents() { 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveServerRedirectForProvisionalLoad() { 2135498351dca14a6380ef3174a0afa0bb950b92d68Steve Block ASSERT(!m_didReceiveServerRedirect); 2145498351dca14a6380ef3174a0afa0bb950b92d68Steve Block m_didReceiveServerRedirect = true; 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCancelClientRedirect() { 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillPerformClientRedirect(const KURL&, 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double interval, double fireDate) { 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidChangeLocationWithinPage() { 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2306a011ab807deb276b9924d501a4219542092958cSteve Blockvoid FrameLoaderClientAndroid::dispatchDidPushStateWithinPage() 2316a011ab807deb276b9924d501a4219542092958cSteve Block{ 2326a011ab807deb276b9924d501a4219542092958cSteve Block notImplemented(); 2336a011ab807deb276b9924d501a4219542092958cSteve Block} 2346a011ab807deb276b9924d501a4219542092958cSteve Block 2356a011ab807deb276b9924d501a4219542092958cSteve Blockvoid FrameLoaderClientAndroid::dispatchDidReplaceStateWithinPage() 2366a011ab807deb276b9924d501a4219542092958cSteve Block{ 2376a011ab807deb276b9924d501a4219542092958cSteve Block notImplemented(); 2386a011ab807deb276b9924d501a4219542092958cSteve Block} 2396a011ab807deb276b9924d501a4219542092958cSteve Block 2406a011ab807deb276b9924d501a4219542092958cSteve Blockvoid FrameLoaderClientAndroid::dispatchDidPopStateWithinPage() 2416a011ab807deb276b9924d501a4219542092958cSteve Block{ 2426a011ab807deb276b9924d501a4219542092958cSteve Block notImplemented(); 2436a011ab807deb276b9924d501a4219542092958cSteve Block} 2446a011ab807deb276b9924d501a4219542092958cSteve Block 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillClose() { 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveIcon() { 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->tree() && m_frame->tree()->parent()) 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 253009b983c891f32393abb660c7ddcba669fbd5b94Steve Block WTF::String url(m_frame->document()->url().string()); 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Try to obtain the icon image. 2552f4ef9300ef5b74c660927a63057e2fcff0e1905Steve Block // FIXME: This method should not be used from outside WebCore and will be removed. 2562f4ef9300ef5b74c660927a63057e2fcff0e1905Steve Block // http://trac.webkit.org/changeset/81484 2572f4ef9300ef5b74c660927a63057e2fcff0e1905Steve Block WebCore::Image* icon = WebCore::iconDatabase().synchronousIconForPageURL(url, WebCore::IntSize(16, 16)); 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the request fails, try the original request url. 2595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!icon) { 2605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian DocumentLoader* docLoader = m_frame->loader()->activeDocumentLoader(); 2615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian KURL originalURL = docLoader->originalRequest().url(); 2622f4ef9300ef5b74c660927a63057e2fcff0e1905Steve Block // FIXME: This method should not be used from outside WebCore and will be removed. 2632f4ef9300ef5b74c660927a63057e2fcff0e1905Steve Block // http://trac.webkit.org/changeset/81484 2642f4ef9300ef5b74c660927a63057e2fcff0e1905Steve Block icon = WebCore::iconDatabase().synchronousIconForPageURL(originalURL, WebCore::IntSize(16, 16)); 2655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // There is a bug in webkit where cancelling an icon load is treated as a 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // failure. When this is fixed, we can ASSERT again that we have an icon. 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (icon) { 2692df3aefb377b3f3c4af3b548b1980d8c8ae56844Steve Block ALOGV("Received icon (%p) for %s", icon, 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url.utf8().data()); 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->didReceiveIcon(icon); 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 2732df3aefb377b3f3c4af3b548b1980d8c8ae56844Steve Block ALOGV("Icon data for %s unavailable, registering for notification...", 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url.utf8().data()); 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project registerForIconNotification(); 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 279c6fbc06882c120f5f51090203775eb0421550d13Patrick Scottvoid FrameLoaderClientAndroid::dispatchDidReceiveTouchIconURL(const String& url, bool precomposed) { 280f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott ASSERT(m_frame); 281f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott // Do not report sub frame touch icons 282f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott if (m_frame->tree() && m_frame->tree()->parent()) 283f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott return; 284c6fbc06882c120f5f51090203775eb0421550d13Patrick Scott m_webFrame->didReceiveTouchIconURL(url, precomposed); 285f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott} 286f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidStartProvisionalLoad() { 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 291d0432c2bc211a5607471b057aafc7538a33034f6Ben Murdochvoid FrameLoaderClientAndroid::dispatchDidReceiveTitle(const StringWithDirection& title) { 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Used to check for FrameLoadTypeStandard but we only want to send the title for 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the top frame and not sub-frames. 295d0432c2bc211a5607471b057aafc7538a33034f6Ben Murdoch // FIXME: Use direction of title. 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->tree() || !m_frame->tree()->parent()) { 297d0432c2bc211a5607471b057aafc7538a33034f6Ben Murdoch m_webFrame->setTitle(title.string()); 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCommitLoad() { 30295a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch#if ENABLE(WEB_AUTOFILL) 30395a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch if (m_frame == m_frame->page()->mainFrame()) { 30495a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch EditorClientAndroid* editorC = static_cast<EditorClientAndroid*>(m_frame->page()->editorClient()); 305a5b05f64bda3dea3ba23e77e9eb2ef59812cdc86Kristian Monsen WebAutofill* autoFill = editorC->getAutofill(); 30695a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch autoFill->reset(); 30795a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch } 30895a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch#endif 30946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark verifiedOk(); 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void loadDataIntoFrame(Frame* frame, KURL baseUrl, const String& url, 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const String& data) { 314635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (baseUrl.isEmpty()) { 315635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project baseUrl = blankURL(); 316635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 317635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ResourceRequest request(baseUrl); 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CString cstr = data.utf8(); 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<WebCore::SharedBuffer> buf = WebCore::SharedBuffer::create(cstr.data(), cstr.length()); 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SubstituteData subData(buf, String("text/html"), String("utf-8"), 321635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project KURL(KURL(), url)); 322635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project frame->loader()->load(request, subData, false); 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailProvisionalLoad(const ResourceError& error) { 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Ignore ErrorInterrupted since it is due to a policy interruption. This 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // is caused by a decision to download the main resource rather than 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // display it. 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (error.errorCode() == InternalErrorInterrupted 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project || error.errorCode() == InternalErrorCancelled) { 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we decided to download the main resource or if the user cancelled 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // it, make sure we report that the load is done. 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project didFinishLoad(); 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project AssetManager* am = globalAssetManager(); 33959d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check to see if the error code was not generated internally 341334e51bc2ff9bf7fc55fa67dc8a6d9257501a32eLeon Scroggins WebCore::PlatformBridge::rawResId id = WebCore::PlatformBridge::NoDomain; 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ((error.errorCode() == ErrorFile || 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project error.errorCode() == ErrorFileNotFound) && 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (!error.localizedDescription().isEmpty())) { 345334e51bc2ff9bf7fc55fa67dc8a6d9257501a32eLeon Scroggins id = WebCore::PlatformBridge::LoadError; 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String filename = m_webFrame->getRawResourceFilename(id); 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (filename.isEmpty()) 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Grab the error page from the asset manager 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Asset* a = am->openNonAsset( 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project filename.utf8().data(), Asset::ACCESS_BUFFER); 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!a) 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Take the failing url and encode html entities so javascript urls are not 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // executed. 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CString failingUrl = error.failingURL().utf8(); 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WTF::Vector<char> url; 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int len = failingUrl.length(); 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const char* data = failingUrl.data(); 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (int i = 0; i < len; i++) { 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char c = data[i]; 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project || (c >= '0' && c <= '9')) 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url.append(c); 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char buf[16]; 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int res = sprintf(buf, "&#%d;", c); 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project buf[res] = 0; 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url.append(buf, res); 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 37550c829a5ccdfac52020f6ddd3e9eda7b87c11fd0Steve Block // Vector sets up its data buffer lazilly, so if failingUrl is the empty 37650c829a5ccdfac52020f6ddd3e9eda7b87c11fd0Steve Block // string, the data buffer will be null. This will result in sanitizedUrl 37750c829a5ccdfac52020f6ddd3e9eda7b87c11fd0Steve Block // being null, and the string substitution below will be a no-op. 37850c829a5ccdfac52020f6ddd3e9eda7b87c11fd0Steve Block // FIXME: Ideally we'd always have a non-empty URL, or at least improve the 37950c829a5ccdfac52020f6ddd3e9eda7b87c11fd0Steve Block // wording of the error page in this case. See http://b/5293782. 38050c829a5ccdfac52020f6ddd3e9eda7b87c11fd0Steve Block String sanitizedUrl = url.data() ? String(url.data(), url.size()) : ""; 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Replace all occurances of %s with the failing url. 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String s = UTF8Encoding().decode((const char*)a->getBuffer(false), a->getLength()); 38450c829a5ccdfac52020f6ddd3e9eda7b87c11fd0Steve Block s = s.replace("%s", sanitizedUrl); 38559d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Replace all occurances of %e with the error text 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s = s.replace("%e", error.localizedDescription()); 388ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create the request and the substitute data and tell the FrameLoader to 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // load with the replacement data. 391ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project // use KURL(const char*) as KURL(const String& url) can trigger ASSERT for 392ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project // invalidate URL string. 393e372b0aa0721bf108058f04c43ad1365058369b2Steve Block loadDataIntoFrame(m_frame, KURL(ParsedURLString, data), error.failingURL(), s); 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Delete the asset. 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete a; 39785248e3a39ad1010d9df785fc0d82162fe7d2d27Leon Scroggins III 39885248e3a39ad1010d9df785fc0d82162fe7d2d27Leon Scroggins III // Report that the load is finished, since it failed. 39985248e3a39ad1010d9df785fc0d82162fe7d2d27Leon Scroggins III didFinishLoad(); 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailLoad(const ResourceError&) { 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // called when page is completed with error 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project didFinishLoad(); 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishDocumentLoad() { 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // called when finishedParsing 409a577c97987bfe6f96fee0081bcdf4d526a9f7d3fSteve Block notImplemented(); 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishLoad() { 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project didFinishLoad(); 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFirstLayout() { 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 4188b2ec69eaf97dd8a817342ca54044d74da6b4b19Grace Kloba // set EXTRA_LAYOUT_DELAY if the loader is not completed yet 4198b2ec69eaf97dd8a817342ca54044d74da6b4b19Grace Kloba if (!m_frame->loader()->isComplete()) 4208b2ec69eaf97dd8a817342ca54044d74da6b4b19Grace Kloba m_frame->document()->setExtraLayoutDelay(EXTRA_LAYOUT_DELAY); 421635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // we need to do this here instead of dispatchDidFirstVisuallyNonEmptyLayout 422635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // so that about:blank will update the screen. 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->tree()->parent()) { 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Only need to notify Java side for the top frame 4254e2a4b529874878b8c8027887cbbbea34cce7334John Reck WebViewCore* core = WebViewCore::getWebViewCore(m_frame->view()); 4264e2a4b529874878b8c8027887cbbbea34cce7334John Reck if (core) 4274e2a4b529874878b8c8027887cbbbea34cce7334John Reck core->didFirstLayout(); 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 431635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFirstVisuallyNonEmptyLayout() 432635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 433635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project notImplemented(); 434635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 435635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 436f1f796b0c3a725a520ac41959a0db7855480e9deJohn ReckFrame* FrameLoaderClientAndroid::dispatchCreatePage(const NavigationAction&) { 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_MULTIPLE_WINDOWS 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->settings() && m_frame->settings()->supportMultipleWindows()) 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Always a user gesture since window.open maps to 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // ChromeClientAndroid::createWindow 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_webFrame->createWindow(false, true); 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the client doesn't support multiple windows, just replace the 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // current frame's contents. 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_frame; 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchShow() { 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->view()->invalidate(); 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool TreatAsAttachment(const String& content_disposition) { 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Some broken sites just send 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Content-Disposition: ; filename="file" 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // screen those out here. 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (content_disposition.startsWith(";")) 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (content_disposition.startsWith("inline", false)) 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Some broken sites just send 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Content-Disposition: filename="file" 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // without a disposition token... screen those out. 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (content_disposition.startsWith("filename", false)) 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Also in use is Content-Disposition: name="file" 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (content_disposition.startsWith("name", false)) 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We have a content-disposition of "attachment" or unknown. 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // RFC 2183, section 2.8 says that an unknown disposition 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // value should be treated as "attachment" 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 482d591474a98e82c78f1c85464d9c77b67cfa7d059Ben Murdochvoid FrameLoaderClientAndroid::dispatchDecidePolicyForResponse(FramePolicyFunction func, 483d591474a98e82c78f1c85464d9c77b67cfa7d059Ben Murdoch const ResourceResponse& response, const ResourceRequest& request) { 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(func); 4867df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott if (!func) 4877df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott return; 4881e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott 4891e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott PolicyChecker* policy = m_frame->loader()->policyChecker(); 4901e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott 4917df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott if (request.isNull()) { 4921e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott (policy->*func)(PolicyIgnore); 4937df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott return; 4947df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott } 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Default to Use (display internally). 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PolicyAction action = PolicyUse; 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check if we should Download instead. 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const String& content_disposition = response.httpHeaderField("Content-Disposition"); 4991e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott if (!content_disposition.isEmpty() && 5001e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott TreatAsAttachment(content_disposition)) { 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Server wants to override our normal policy. 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; 5091e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott } 5101e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott 5111e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott // Ask if it can be handled internally. 512d591474a98e82c78f1c85464d9c77b67cfa7d059Ben Murdoch if (!canShowMIMEType(response.mimeType())) { 5131e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott // Check to see if we are a sub frame (main frame has no owner element) 5141e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott if (m_frame->ownerElement() != 0) 5151e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott action = PolicyIgnore; 5161e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott else 5171e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott action = PolicyDownload; 5181e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott (policy->*func)(action); 5191e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott return; 5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // A status code of 204 indicates no content change. Ignore the result. 5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::DocumentLoader* docLoader = m_frame->loader()->activeDocumentLoader(); 5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (docLoader->response().httpStatusCode() == 204) 5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project action = PolicyIgnore; 5251e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott (policy->*func)(action); 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForNewWindowAction(FramePolicyFunction func, 529b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch const NavigationAction& action, const ResourceRequest& request, 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PassRefPtr<FormState> formState, const String& frameName) { 5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 5327df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott ASSERT(func); 5337df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott if (!func) 5347df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott return; 535b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch 5367df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott if (request.isNull()) { 537035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block (m_frame->loader()->policyChecker()->*func)(PolicyIgnore); 5387df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott return; 5397df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott } 540b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch 541b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch if (action.type() == NavigationTypeFormSubmitted || action.type() == NavigationTypeFormResubmitted) 542b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch m_frame->loader()->resetMultipleFormSubmissionProtection(); 543b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we get to this point it means that a link has a target that was not 5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // found by the frame tree. Instead of creating a new frame, return the 5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // current frame in dispatchCreatePage. 5477df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott if (canHandleRequest(request)) 548035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block (m_frame->loader()->policyChecker()->*func)(PolicyUse); 5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 550035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block (m_frame->loader()->policyChecker()->*func)(PolicyIgnore); 5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::cancelPolicyCheck() { 554a577c97987bfe6f96fee0081bcdf4d526a9f7d3fSteve Block notImplemented(); 5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchUnableToImplementPolicy(const ResourceError&) { 5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForNavigationAction(FramePolicyFunction func, 5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const NavigationAction& action, const ResourceRequest& request, 5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PassRefPtr<FormState> formState) { 5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(func); 5667df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott if (!func) 5677df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott return; 5687df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott if (request.isNull()) { 569035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block (m_frame->loader()->policyChecker()->*func)(PolicyIgnore); 5707df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott return; 5717df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott } 572b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch 573b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch // Reset multiple form submission protection. If this is a resubmission, we check with the 574b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch // user and reset the protection if they choose to resubmit the form (see WebCoreFrameBridge.cpp) 575b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch if (action.type() == NavigationTypeFormSubmitted) 576b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch m_frame->loader()->resetMultipleFormSubmissionProtection(); 577b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch 5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (action.type() == NavigationTypeFormResubmitted) { 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->decidePolicyForFormResubmission(func); 5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 581eae4493cc3434169fc14b44b851dac62db492aa5Patrick Scott } else 582035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block (m_frame->loader()->policyChecker()->*func)(PolicyUse); 5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillSubmitForm(FramePolicyFunction func, PassRefPtr<FormState>) { 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(func); 588035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block (m_frame->loader()->policyChecker()->*func)(PolicyUse); 5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 591e14e4cb809c2afcf51cce7775514d5e7820824f0Leon Scrogginsvoid FrameLoaderClientAndroid::dispatchWillSendSubmitEvent(HTMLFormElement* form) 592e14e4cb809c2afcf51cce7775514d5e7820824f0Leon Scroggins{ 593e14e4cb809c2afcf51cce7775514d5e7820824f0Leon Scroggins if (m_webFrame->shouldSaveFormData()) 594e14e4cb809c2afcf51cce7775514d5e7820824f0Leon Scroggins m_webFrame->saveFormData(form); 595e14e4cb809c2afcf51cce7775514d5e7820824f0Leon Scroggins} 596e14e4cb809c2afcf51cce7775514d5e7820824f0Leon Scroggins 5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidLoadMainResource(DocumentLoader*) { 5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::revertToProvisionalState(DocumentLoader*) { 6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setMainDocumentError(DocumentLoader* docLoader, const ResourceError& error) { 6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 6073e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott if (m_manualLoader) { 6083e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_manualLoader->didFail(error); 6093e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_manualLoader = NULL; 6103e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_hasSentResponseToPlugin = false; 6113e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott } else { 6121f9212cd9a5e957562b12e8c3294b7f357fa1f85Huahui Wu if (!error.isNull() && error.errorCode() >= InternalErrorLast && error.errorCode() != ERROR_OK) 6133e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_webFrame->reportError(error.errorCode(), 6143e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott error.localizedDescription(), error.failingURL()); 6153e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott } 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called right before the progress is updated. 6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::willChangeEstimatedProgress() { 6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verifiedOk(); 6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called after the progress has been updated. The bad part 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// about this is that when a page is completed, this function is called after 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the progress has been reset to 0. 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didChangeEstimatedProgress() { 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verifiedOk(); 6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This will give us the initial estimate when the page first starts to load. 6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressStartedNotification() { 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->page()) 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->setProgress(m_frame->page()->progress()->estimatedProgress()); 6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This will give us any updated progress including the final progress. 6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressEstimateChangedNotification() { 6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->page()) 6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->setProgress(m_frame->page()->progress()->estimatedProgress()); 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is just a notification that the progress has finished. Don't call 6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// setProgress(1) because postProgressEstimateChangedNotification will do so. 6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressFinishedNotification() { 64759d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger WebViewCore* core = WebViewCore::getWebViewCore(m_frame->view()); 6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->tree()->parent()) { 6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // only need to notify Java for the top frame 65059d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger core->notifyProgressFinished(); 6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 65259d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger // notify plugins that the frame has loaded 65359d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger core->notifyPluginsOnFrameLoad(m_frame); 6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setMainFrameDocumentReady(bool) { 6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this is only interesting once we provide an external API for the DOM 6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::startDownload(const ResourceRequest&) { 6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::willChangeTitle(DocumentLoader*) { 6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verifiedOk(); 6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didChangeTitle(DocumentLoader* loader) { 6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verifiedOk(); 6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::finishedLoading(DocumentLoader* docLoader) { 6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Telling the frame we received some data and passing 0 as the data is our 6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // way to get work done that is normally done when the first bit of data is 6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // received, even for the case of a document with no data (like about:blank) 6773e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott if (!m_manualLoader) { 6783e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott committedLoad(docLoader, 0, 0); 6793e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott return; 6803e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott } 6813e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott 6823e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_manualLoader->didFinishLoading(); 6833e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_manualLoader = NULL; 6843e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_hasSentResponseToPlugin = false; 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 687635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::updateGlobalHistory() { 6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 6896689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins 6906689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins DocumentLoader* docLoader = m_frame->loader()->documentLoader(); 6916689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins ASSERT(docLoader); 6926689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins 6936689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins // Code copied from FrameLoader.cpp:createHistoryItem 6946689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins // Only add this URL to the database if it is a valid page 6956689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins if (docLoader->unreachableURL().isEmpty() 6966689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins && docLoader->response().httpStatusCode() < 400) { 6976689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins m_webFrame->updateVisitedHistory(docLoader->urlForHistory(), false); 69848c46b2d3efc59f2883218d8e713d403b658ff2bPatrick Scott if (!docLoader->serverRedirectSourceForHistory().isNull()) 699e372b0aa0721bf108058f04c43ad1365058369b2Steve Block m_webFrame->updateVisitedHistory(KURL(ParsedURLString, docLoader->serverRedirectDestinationForHistory()), false); 7006689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins } 7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoaderClientAndroid::updateGlobalHistoryRedirectLinks() { 704635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Note, do we need to do anything where there is no HistoryItem? If we call 705635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // updateGlobalHistory(), we will add bunch of "data:xxx" urls for gmail.com 706635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // which is not what we want. Opt to do nothing now. 7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::shouldGoToHistoryItem(HistoryItem* item) const { 7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // hmmm, seems like we might do a more thoughtful check 7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return item != NULL; 7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 715d591474a98e82c78f1c85464d9c77b67cfa7d059Ben Murdochbool FrameLoaderClientAndroid::shouldStopLoadingForHistoryItem(HistoryItem* item) const 716d591474a98e82c78f1c85464d9c77b67cfa7d059Ben Murdoch{ 717d591474a98e82c78f1c85464d9c77b67cfa7d059Ben Murdoch return true; 718d591474a98e82c78f1c85464d9c77b67cfa7d059Ben Murdoch} 719d591474a98e82c78f1c85464d9c77b67cfa7d059Ben Murdoch 720b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Blockvoid FrameLoaderClientAndroid::didDisplayInsecureContent() 721b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block{ 722b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block notImplemented(); 723b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block} 724b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block 725cbaa27bf61927b2a32fd63ff574e57035de6a968Steve Blockvoid FrameLoaderClientAndroid::didRunInsecureContent(SecurityOrigin*, const KURL&) 726b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block{ 727b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block notImplemented(); 728b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block} 729b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block 7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::committedLoad(DocumentLoader* loader, const char* data, int length) { 7319abe77efade00cb2e8add0327bd1b1a9cbe3af97Steve Block if (!m_manualLoader) 7329abe77efade00cb2e8add0327bd1b1a9cbe3af97Steve Block loader->commitData(data, length); 733414529d1222ba129634445cb7b312874816c0d2fDerek Sollenberger 734414529d1222ba129634445cb7b312874816c0d2fDerek Sollenberger // commit data may have created a manual plugin loader 735414529d1222ba129634445cb7b312874816c0d2fDerek Sollenberger if (m_manualLoader) { 7363e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott if (!m_hasSentResponseToPlugin) { 7373e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_manualLoader->didReceiveResponse(loader->response()); 7383e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott // Failure could cause the main document to have an error causing 7393e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott // the manual loader to be reset. 7403e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott if (!m_manualLoader) 7413e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott return; 7423e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_hasSentResponseToPlugin = true; 7433e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott } 7443e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott m_manualLoader->didReceiveData(data, length); 7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cancelledError(const ResourceRequest& request) { 749635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return ResourceError(String(), InternalErrorCancelled, request.url(), String()); 7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cannotShowURLError(const ResourceRequest& request) { 753635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return ResourceError(String(), InternalErrorCannotShowUrl, request.url(), String()); 7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::interruptForPolicyChangeError(const ResourceRequest& request) { 757635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return ResourceError(String(), InternalErrorInterrupted, request.url(), String()); 7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cannotShowMIMETypeError(const ResourceResponse& request) { 761635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return ResourceError(String(), InternalErrorCannotShowMimeType, request.url(), String()); 7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::fileDoesNotExistError(const ResourceResponse& request) { 765635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return ResourceError(String(), InternalErrorFileDoesNotExist, request.url(), String()); 7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::pluginWillHandleLoadError(const ResourceResponse& request) { 769635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return ResourceError(String(), InternalErrorPluginWillHandleLoadError, request.url(), String()); 7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::shouldFallBack(const ResourceError&) { 7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canHandleRequest(const ResourceRequest& request) const { 7785498351dca14a6380ef3174a0afa0bb950b92d68Steve Block // This is called by WebCore to determine if this load can be handled by the 7795498351dca14a6380ef3174a0afa0bb950b92d68Steve Block // WebView. In general, we delegate to the WebFrame, which may ask the 7805498351dca14a6380ef3174a0afa0bb950b92d68Steve Block // embedding application whether it wishes to hijack the load. However, we 7815498351dca14a6380ef3174a0afa0bb950b92d68Steve Block // don't allow this if the load is ... 7825498351dca14a6380ef3174a0afa0bb950b92d68Steve Block // - An intrapage navigation 7835498351dca14a6380ef3174a0afa0bb950b92d68Steve Block // - An iframe with a HTTP or HTTPS scheme URL 7845498351dca14a6380ef3174a0afa0bb950b92d68Steve Block bool canHandle = WebCore::equalIgnoringFragmentIdentifier(request.url(), m_frame->document()->url()) || 7855498351dca14a6380ef3174a0afa0bb950b92d68Steve Block (request.url().protocol().startsWith("http", false) && m_frame->tree() && m_frame->tree()->parent()) || 7865498351dca14a6380ef3174a0afa0bb950b92d68Steve Block m_webFrame->canHandleRequest(request); 7875498351dca14a6380ef3174a0afa0bb950b92d68Steve Block 7885498351dca14a6380ef3174a0afa0bb950b92d68Steve Block // If this is a server-side redirect and the WebView will handle loading it, 7895498351dca14a6380ef3174a0afa0bb950b92d68Steve Block // notify the WebFrame, which may notify the embedding application that 7905498351dca14a6380ef3174a0afa0bb950b92d68Steve Block // we're loading a new URL. 7915498351dca14a6380ef3174a0afa0bb950b92d68Steve Block if (m_didReceiveServerRedirect && canHandle) 7925498351dca14a6380ef3174a0afa0bb950b92d68Steve Block m_webFrame->loadStarted(m_frame); 7935498351dca14a6380ef3174a0afa0bb950b92d68Steve Block m_didReceiveServerRedirect = false; 7945498351dca14a6380ef3174a0afa0bb950b92d68Steve Block 7955498351dca14a6380ef3174a0afa0bb950b92d68Steve Block return canHandle; 7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canShowMIMEType(const String& mimeType) const { 7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: This looks like it has to do with whether or not a type can be 8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // shown "internally" (i.e. inside the browser) regardless of whether 8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // or not the browser is doing the rendering, e.g. a full page plugin. 8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (MIMETypeRegistry::isSupportedImageResourceMIMEType(mimeType) || 8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType) || 8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MIMETypeRegistry::isSupportedJavaScriptMIMEType(mimeType) || 8050981d957132dc87d7cd48ae62a37002cb37c811dGrace Kloba (m_frame && m_frame->settings() 8060981d957132dc87d7cd48ae62a37002cb37c811dGrace Kloba && m_frame->settings()->arePluginsEnabled() 8070981d957132dc87d7cd48ae62a37002cb37c811dGrace Kloba && PluginDatabase::installedPlugins()->isMIMETypeRegistered( 8080981d957132dc87d7cd48ae62a37002cb37c811dGrace Kloba mimeType)) || 8095165094157ce50696d79167abc1125fc4b38b545Patrick Scott (DOMImplementation::isTextMIMEType(mimeType) && 8105165094157ce50696d79167abc1125fc4b38b545Patrick Scott !mimeType.startsWith("text/vnd")) || 811b20ea4938e919d82254b11885220c8564546d1caPatrick Scott DOMImplementation::isXMLMIMEType(mimeType)) 8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8168398c067254e66df9f726716f95aee2a0ca7b39aSteve Blockbool FrameLoaderClientAndroid::canShowMIMETypeAsHTML(const String& mimeType) const { 8178398c067254e66df9f726716f95aee2a0ca7b39aSteve Block return false; 8188398c067254e66df9f726716f95aee2a0ca7b39aSteve Block} 8198398c067254e66df9f726716f95aee2a0ca7b39aSteve Block 8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::representationExistsForURLScheme(const String&) const { 8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // don't use representation 8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verifiedOk(); 8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::generatedMIMETypeForURLScheme(const String& URLScheme) const { 8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME, copy from Apple's port 8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String mimetype("x-apple-web-kit/"); 8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mimetype.append(URLScheme.lower()); 8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return mimetype; 8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::frameLoadCompleted() { 8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // copied from Apple port, without this back with sub-frame will trigger ASSERT 8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::saveViewStateToItem(HistoryItem* item) { 8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(item); 8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // store the current scale (only) for the top frame 8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->tree()->parent()) { 843211634993282bd9d5c18b26d70e7909aa4a3cfdcPatrick Scott // We should have added a bridge when the child item was added to its 844211634993282bd9d5c18b26d70e7909aa4a3cfdcPatrick Scott // parent. 845211634993282bd9d5c18b26d70e7909aa4a3cfdcPatrick Scott AndroidWebHistoryBridge* bridge = item->bridge(); 846211634993282bd9d5c18b26d70e7909aa4a3cfdcPatrick Scott ASSERT(bridge); 847a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view()); 848c4683829d0d4932156a97ce14ea15deed71bf21dShimeng (Simon) Wang bridge->setScale(webViewCore->scale()); 849c4683829d0d4932156a97ce14ea15deed71bf21dShimeng (Simon) Wang bridge->setTextWrapScale(webViewCore->textWrapScale()); 8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::notifyHistoryItemChanged(item); 8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::restoreViewState() { 8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view()); 85767ed0edeb2ad5bb22ec778472b78d41e7eb3b68aSteve Block HistoryItem* item = m_frame->loader()->history()->currentItem(); 858be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch AndroidWebHistoryBridge* bridge = item->bridge(); 8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // restore the scale (only) for the top frame 8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->tree()->parent()) { 861c05b3a990126a5a1de357c025e25e6acd4e4e185Grace Kloba webViewCore->restoreScale(bridge->scale(), bridge->textWrapScale()); 8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 865be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdochvoid FrameLoaderClientAndroid::dispatchDidAddBackForwardItem(HistoryItem* item) const { 8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->addHistoryItem(item); 8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 870be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdochvoid FrameLoaderClientAndroid::dispatchDidRemoveBackForwardItem(HistoryItem* item) const { 8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 872be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch m_webFrame->removeHistoryItem(0); 8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 875be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdochvoid FrameLoaderClientAndroid::dispatchDidChangeBackForwardIndex() const { 8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 877be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch BackForwardList* list = m_frame->page()->backForwardList(); 878be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch ASSERT(list); 8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->updateHistoryIndex(list->backListCount()); 8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::provisionalLoadStarted() { 8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->loadStarted(m_frame); 8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didFinishLoad() { 8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->setExtraLayoutDelay(0); 8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->didFinishLoad(m_frame); 8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::prepareForDataSourceReplacement() { 8945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian verifiedOk(); 8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<DocumentLoader> FrameLoaderClientAndroid::createDocumentLoader( 8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceRequest& request, const SubstituteData& data) { 8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> loader = DocumentLoader::create(request, data); 9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return loader.release(); 9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 903d0432c2bc211a5607471b057aafc7538a33034f6Ben Murdochvoid FrameLoaderClientAndroid::setTitle(const StringWithDirection& title, const KURL& url) { 9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Not needed. dispatchDidReceiveTitle is called immediately after this. 9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // url is used to update the Apple port history items. 9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verifiedOk(); 9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::userAgent(const KURL& u) { 9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_webFrame->userAgentForURL(&u); 9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9138ec4217018562da37ecf4144e582fa848b807263Grace Klobavoid FrameLoaderClientAndroid::savePlatformDataToCachedFrame(WebCore::CachedFrame* cachedFrame) { 9148ec4217018562da37ecf4144e582fa848b807263Grace Kloba CachedFramePlatformDataAndroid* platformData = new CachedFramePlatformDataAndroid(m_frame->settings()); 9158ec4217018562da37ecf4144e582fa848b807263Grace Kloba cachedFrame->setCachedFramePlatformData(platformData); 916635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 917635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 9188ec4217018562da37ecf4144e582fa848b807263Grace Klobavoid FrameLoaderClientAndroid::transitionToCommittedFromCachedFrame(WebCore::CachedFrame* cachedFrame) { 9198ec4217018562da37ecf4144e582fa848b807263Grace Kloba CachedFramePlatformDataAndroid* platformData = reinterpret_cast<CachedFramePlatformDataAndroid*>(cachedFrame->cachedFramePlatformData()); 9208ec4217018562da37ecf4144e582fa848b807263Grace Kloba#ifdef ANDROID_META_SUPPORT 9218ec4217018562da37ecf4144e582fa848b807263Grace Kloba platformData->restoreMetadata(m_frame->settings()); 9228ec4217018562da37ecf4144e582fa848b807263Grace Kloba#endif 92369ae8c4ecaffcbc20d4b251a6e831ac6c4e58f30Nicolas Roard 92469ae8c4ecaffcbc20d4b251a6e831ac6c4e58f30Nicolas Roard#if ENABLE(ANDROID_OVERFLOW_SCROLL) 92569ae8c4ecaffcbc20d4b251a6e831ac6c4e58f30Nicolas Roard#else 926259cc8a1c75a1e2f4b1f029296279f210fed6b2cBen Murdoch WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view()); 927259cc8a1c75a1e2f4b1f029296279f210fed6b2cBen Murdoch 928259cc8a1c75a1e2f4b1f029296279f210fed6b2cBen Murdoch webViewCore->clearContent(); 92969ae8c4ecaffcbc20d4b251a6e831ac6c4e58f30Nicolas Roard#endif 930259cc8a1c75a1e2f4b1f029296279f210fed6b2cBen Murdoch 931ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba m_webFrame->transitionToCommitted(m_frame); 932635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 933635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 934635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::transitionToCommittedForNewPage() { 935635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(m_frame); 936cb86952d254446a800421b5804f886f8d87cd875Grace Kloba 937cb86952d254446a800421b5804f886f8d87cd875Grace Kloba#ifdef ANDROID_META_SUPPORT 938cb86952d254446a800421b5804f886f8d87cd875Grace Kloba // reset metadata settings for the main frame as they are not preserved cross page 939cb86952d254446a800421b5804f886f8d87cd875Grace Kloba if (m_frame == m_frame->page()->mainFrame() && m_frame->settings()) 940cb86952d254446a800421b5804f886f8d87cd875Grace Kloba m_frame->settings()->resetMetadataSettings(); 941cb86952d254446a800421b5804f886f8d87cd875Grace Kloba#endif 942cb86952d254446a800421b5804f886f8d87cd875Grace Kloba 9438ec4217018562da37ecf4144e582fa848b807263Grace Kloba // Save the old WebViewCore before creating a new FrameView. There is one 9448ec4217018562da37ecf4144e582fa848b807263Grace Kloba // WebViewCore per page. Each frame, including the main frame and sub frame, 9458ec4217018562da37ecf4144e582fa848b807263Grace Kloba // has a 1:1 FrameView and WebFrameView. 9468ec4217018562da37ecf4144e582fa848b807263Grace Kloba WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view()); 9478ec4217018562da37ecf4144e582fa848b807263Grace Kloba Retain(webViewCore); 9488ec4217018562da37ecf4144e582fa848b807263Grace Kloba 949ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba // Save the old WebFrameView's bounds and apply them to the new WebFrameView 95074448d56dfb0a3123af451319ff7b897e15774ceJohn Reck RefPtr<WebCore::FrameView> oldFrameView = m_frame->view(); 95174448d56dfb0a3123af451319ff7b897e15774ceJohn Reck WebFrameView* oldWebFrameView = static_cast<WebFrameView*> (oldFrameView->platformWidget()); 9529a8423b643a8ce99e5642f2548600f9125382e89John Reck IntRect bounds; 9539a8423b643a8ce99e5642f2548600f9125382e89John Reck if (oldWebFrameView) 9549a8423b643a8ce99e5642f2548600f9125382e89John Reck bounds = oldWebFrameView->getBounds(); 955a0e12fbb7d3eec607b7988fb8ff873305583acc4Steve Block const float oldZoomFactor = oldFrameView->frame()->textZoomFactor(); 95627d79a6495971cad26199bdf5dc79abcb1ff1c9eGrace Kloba m_frame->createView(bounds.size(), oldFrameView->baseBackgroundColor(), oldFrameView->isTransparent(), 95727d79a6495971cad26199bdf5dc79abcb1ff1c9eGrace Kloba oldFrameView->fixedLayoutSize(), oldFrameView->useFixedLayout()); 958a0e12fbb7d3eec607b7988fb8ff873305583acc4Steve Block if (oldZoomFactor != 1.0f && oldZoomFactor != m_frame->textZoomFactor()) { 959a0e12fbb7d3eec607b7988fb8ff873305583acc4Steve Block m_frame->setTextZoomFactor(oldZoomFactor); 9605c54c95ab6356ebcbf2ef44a299c3765d97eed6eShimeng (Simon) Wang } 961bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen 9629a8423b643a8ce99e5642f2548600f9125382e89John Reck if (oldWebFrameView) { 9639a8423b643a8ce99e5642f2548600f9125382e89John Reck IntRect visBounds = oldWebFrameView->getVisibleBounds(); 9649a8423b643a8ce99e5642f2548600f9125382e89John Reck IntRect windowBounds = oldWebFrameView->getWindowBounds(); 9659a8423b643a8ce99e5642f2548600f9125382e89John Reck // Create a new WebFrameView for the new FrameView 9669a8423b643a8ce99e5642f2548600f9125382e89John Reck WebFrameView* newFrameView = new WebFrameView(m_frame->view(), webViewCore); 9679a8423b643a8ce99e5642f2548600f9125382e89John Reck newFrameView->setLocation(bounds.x(), bounds.y()); 9689a8423b643a8ce99e5642f2548600f9125382e89John Reck newFrameView->setSize(bounds.width(), bounds.height()); 9699a8423b643a8ce99e5642f2548600f9125382e89John Reck newFrameView->setVisibleSize(visBounds.width(), visBounds.height()); 9709a8423b643a8ce99e5642f2548600f9125382e89John Reck newFrameView->setWindowBounds(windowBounds.x(), windowBounds.y(), windowBounds.width(), windowBounds.height()); 9719a8423b643a8ce99e5642f2548600f9125382e89John Reck // newFrameView attaches itself to FrameView which Retains the reference, so 9729a8423b643a8ce99e5642f2548600f9125382e89John Reck // call Release for newFrameView 9739a8423b643a8ce99e5642f2548600f9125382e89John Reck Release(newFrameView); 9749a8423b643a8ce99e5642f2548600f9125382e89John Reck } 9758ec4217018562da37ecf4144e582fa848b807263Grace Kloba // WebFrameView Retains webViewCore, so call Release for webViewCore 9768ec4217018562da37ecf4144e582fa848b807263Grace Kloba Release(webViewCore); 977635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 978635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_webFrame->transitionToCommitted(m_frame); 979635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 980635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 981f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reckvoid FrameLoaderClientAndroid::dispatchDidBecomeFrameset(bool) 982f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck{ 983f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck} 984f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck 9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canCachePage() const { 9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::download(ResourceHandle* handle, const ResourceRequest&, 9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceRequest&, const ResourceResponse&) { 9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Get the C++ side of the load listener and tell it to handle the download 99280e68b43c3da64848db8edc7d8e8fe095888e42eAndrei Popescu handle->getInternal()->m_loader->downloadFile(); 9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWTF::PassRefPtr<WebCore::Frame> FrameLoaderClientAndroid::createFrame(const KURL& url, const String& name, 9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTMLFrameOwnerElement* ownerElement, const String& referrer, 9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool allowsScrolling, int marginWidth, int marginHeight) 9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* parent = ownerElement->document()->frame(); 10008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoaderClientAndroid* loaderC = new FrameLoaderClientAndroid(m_webFrame); 10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> pFrame = Frame::create(parent->page(), ownerElement, loaderC); 10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* newFrame = pFrame.get(); 10038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loaderC->setFrame(newFrame); 10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Append the subframe to the parent and set the name of the subframe. The name must be set after 10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // appending the child so that the name becomes unique. 10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parent->tree()->appendChild(newFrame); 10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newFrame->tree()->setName(name); 10088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create a new FrameView and WebFrameView for the child frame to draw into. 10095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian RefPtr<FrameView> frameView = FrameView::create(newFrame); 10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Attach the frameView to the newFrame. 10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newFrame->setView(frameView); 10128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newFrame->init(); 10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newFrame->selection()->setFocused(true); 10142df3aefb377b3f3c4af3b548b1980d8c8ae56844Steve Block ALOGV("::WebCore:: createSubFrame returning %p", newFrame); 10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The creation of the frame may have run arbitrary JavaScript that removed it from the page already. 10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!pFrame->page()) 10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 101959d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger 10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parent->loader()->loadURLIntoChildFrame(url, referrer, pFrame.get()); 10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // onLoad may cuase the frame to be removed from the document. Allow the RefPtr to delete the child frame. 10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!pFrame->tree()->parent()) 10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NULL; 10258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return pFrame.release(); 10278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// YouTube flash url path starts with /v/ 10308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const char slash_v_slash[] = { '/', 'v', '/' }; 1031b2743d4d2391f76c75e6ec82f8fdc185d103b43aKristian Monsenstatic const char slash_e_slash[] = { '/', 'e', '/' }; 10328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool isValidYouTubeVideo(const String& path) 10348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!charactersAreAllASCII(path.characters(), path.length())) 10368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned int len = path.length(); 10388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (len <= sizeof(slash_v_slash)) // check for more than just /v/ 10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CString str = path.lower().utf8(); 10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const char* data = str.data(); 1042b2743d4d2391f76c75e6ec82f8fdc185d103b43aKristian Monsen // Youtube flash url can start with /v/ or /e/ 10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (memcmp(data, slash_v_slash, sizeof(slash_v_slash)) != 0) 1044b2743d4d2391f76c75e6ec82f8fdc185d103b43aKristian Monsen if (memcmp(data, slash_e_slash, sizeof(slash_e_slash)) != 0) 1045b2743d4d2391f76c75e6ec82f8fdc185d103b43aKristian Monsen return false; 10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Start after /v/ 10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned int i = sizeof(slash_v_slash); i < len; i++) { 10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char c = data[i]; 10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check for alpha-numeric characters only. 1050635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (WTF::isASCIIAlphanumeric(c) || c == '_' || c == '-') 10518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continue; 10528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The url can have more parameters such as &hl=en after the video id. 10538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Once we start seeing extra parameters we can return true. 10548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return c == '&' && i > sizeof(slash_v_slash); 10558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 10578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool isYouTubeUrl(const KURL& url, const String& mimeType) 10608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1061635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project String host = url.host(); 1062635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool youtube = host.endsWith("youtube.com") 1063635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project || host.endsWith("youtube-nocookie.com"); 1064635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return youtube && isValidYouTubeVideo(url.path()) 10658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && equalIgnoringCase(mimeType, "application/x-shockwave-flash"); 10668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10683bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsenstatic bool isYouTubeInstalled() { 10693bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen return WebCore::packageNotifier().isPackageInstalled("com.google.android.youtube"); 10703bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen} 10713bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen 1072585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch// Use PluginViewBase rather than an Android specific sub class as we do not require any 1073585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch// Android specific functionality; this just renders a placeholder which will later 1074585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch// activate the real plugin. 1075585ee724ef91cab37349b10b022e608510a7f763Ben Murdochclass PluginToggleWidget : public PluginViewBase { 10768216a0e796895ec6e736aebbeacee9567ae85515Patrick Scottpublic: 10778216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott PluginToggleWidget(Frame* parent, const IntSize& size, 10788216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott HTMLPlugInElement* elem, const KURL& url, 10798216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott const WTF::Vector<String>& paramNames, 10808216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott const WTF::Vector<String>& paramValues, const String& mimeType, 10818216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott bool loadManually) 1082585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch : PluginViewBase(0) 1083585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch , m_parent(parent) 10848216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott , m_size(size) 10858216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott , m_element(elem) 10868216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott , m_url(url) 10878216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott , m_paramNames(paramNames) 10888216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott , m_paramValues(paramValues) 10898216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott , m_mimeType(mimeType) 10908216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott , m_loadManually(loadManually) 10918216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott { 10928216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott resize(size); 10938216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott } 10948216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 10958216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott virtual void paint(GraphicsContext* ctx, const IntRect& rect) 10968216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott { 10978216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // Most of this code is copied from PluginView::paintMissingPluginIcon 10988216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // with slight modification. 10998216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 11008216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott static RefPtr<Image> image; 11011c95c29b31ed45a394643094162e01796c0c5122Patrick Scott if (!image) { 11028216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott image = Image::loadPlatformResource("togglePlugin"); 11038216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott } 11048216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 11058216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott IntRect imageRect(x(), y(), image->width(), image->height()); 11068216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 11078216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott int xOffset = (width() - imageRect.width()) >> 1; 11088216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott int yOffset = (height() - imageRect.height()) >> 1; 11098216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 11108216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott imageRect.move(xOffset, yOffset); 11118216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 11128216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott if (!rect.intersects(imageRect)) 11138216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott return; 11148216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 11158216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // FIXME: We need to clip similarly to paintMissingPluginIcon but it is 11168216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // way screwed up right now. It has something to do with how we tell 11178216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // webkit the scroll position and it causes the placeholder to get 11188216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // clipped very badly. http://b/issue?id=2533303 11198216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 11208216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott ctx->save(); 11218216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott ctx->clip(frameRect()); 11221c95c29b31ed45a394643094162e01796c0c5122Patrick Scott 1123b73606ba44efcb32effeb03603d2eaa402455062Ben Murdoch ctx->setFillColor(Color::white, ColorSpaceDeviceRGB); 11240e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang ctx->fillRect(frameRect()); 11250e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang if (frameRect().contains(imageRect)) { 11260e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang // Leave a 2 pixel padding. 11270e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang const int pixelWidth = 2; 11280e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang IntRect innerRect = frameRect(); 11290e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang innerRect.inflate(-pixelWidth); 11300e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang // Draw a 2 pixel light gray border. 1131b73606ba44efcb32effeb03603d2eaa402455062Ben Murdoch ctx->setStrokeColor(Color::lightGray, ColorSpaceDeviceRGB); 11320e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang ctx->strokeRect(innerRect, pixelWidth); 11330e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang } 11341c95c29b31ed45a394643094162e01796c0c5122Patrick Scott 11351c95c29b31ed45a394643094162e01796c0c5122Patrick Scott // Draw the image in the center 1136b73606ba44efcb32effeb03603d2eaa402455062Ben Murdoch ctx->drawImage(image.get(), ColorSpaceDeviceRGB, imageRect.location()); 11378216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott ctx->restore(); 11388216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott } 11398216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 11408216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott virtual void handleEvent(Event* event) 11418216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott { 11428216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott if (event->type() != eventNames().clickEvent) 11438216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott return; 11448216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 11459dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott Frame* frame = m_parent->page()->mainFrame(); 11469dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott while (frame) { 11479dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott RenderView* view = frame->contentRenderer(); 11489dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott const HashSet<RenderWidget*> widgets = view->widgets(); 11499dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott HashSet<RenderWidget*>::const_iterator it = widgets.begin(); 11509dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott HashSet<RenderWidget*>::const_iterator end = widgets.end(); 11519dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott for (; it != end; ++it) { 11529dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott Widget* widget = (*it)->widget(); 11539dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott // PluginWidget is used only with PluginToggleWidget 1154121b0cf4517156d0ac5111caf9830c51b69bae8fDerek Sollenberger if (widget && widget->isPluginViewBase()) { 11559dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott PluginToggleWidget* ptw = 11569dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott static_cast<PluginToggleWidget*>(widget); 11579dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott ptw->swapPlugin(*it); 11589dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott } 11599dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott } 11609dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott frame = frame->tree()->traverseNext(); 11619dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott } 11629dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott } 11639dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott 11649dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott void swapPlugin(RenderWidget* renderer) { 11659dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott typedef FrameLoaderClientAndroid FLCA; 11669dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott FLCA* client = static_cast<FLCA*>(m_parent->loader()->client()); 11679dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott client->enableOnDemandPlugins(); 11688216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott WTF::PassRefPtr<PluginView> prpWidget = 11698216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott PluginView::create(m_parent.get(), 11708216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott m_size, 11718216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott m_element, 11728216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott m_url, 11738216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott m_paramNames, 11748216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott m_paramValues, 11758216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott m_mimeType, 11768216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott m_loadManually); 11778216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott RefPtr<Widget> myProtector(this); 11788216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott prpWidget->focusPluginElement(); 11798216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott renderer->setWidget(prpWidget); 11808216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott } 11818216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 11828216a0e796895ec6e736aebbeacee9567ae85515Patrick Scottprivate: 1183585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch void invalidateRect(const IntRect& rect) { } 1184585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch 11858216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott RefPtr<Frame> m_parent; 11868216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott IntSize m_size; 11878216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott HTMLPlugInElement* m_element; 11888216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott KURL m_url; 11898216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott WTF::Vector<String> m_paramNames; 11908216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott WTF::Vector<String> m_paramValues; 11918216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott String m_mimeType; 11928216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott bool m_loadManually; 11938216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott}; 11948216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott 11956d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei PopescuWTF::PassRefPtr<Widget> FrameLoaderClientAndroid::createPlugin( 11968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const IntSize& size, 11978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian HTMLPlugInElement* element, 11988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const KURL& url, 11996d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu const WTF::Vector<String>& names, 12006d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu const WTF::Vector<String>& values, 12018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const String& mimeType, 12028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool loadManually) { 12038216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott WTF::PassRefPtr<PluginView> prpWidget = 0; 12048216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott#ifdef ANDROID_PLUGINS 12058216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // This is copied from PluginView.cpp. We need to determine if a plugin 12068216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // will be found before doing some of the work in PluginView. 12078216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott String mimeTypeCopy = mimeType; 12088216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott PluginPackage* plugin = 12098216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott PluginDatabase::installedPlugins()->findPlugin(url, mimeTypeCopy); 12108216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott if (!plugin && PluginDatabase::installedPlugins()->refresh()) { 12118216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott mimeTypeCopy = mimeType; 12128216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott plugin = PluginDatabase::installedPlugins()->findPlugin(url, 12138216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott mimeTypeCopy); 12148216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott } 12158216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott Settings* settings = m_frame->settings(); 12168216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // Do the placeholder if plugins are on-demand and there is a plugin for the 12178216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // given mime type. 12189dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott if (settings && settings->arePluginsOnDemand() && plugin && 12199dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott !m_onDemandPluginsEnabled) { 12208216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott return adoptRef(new PluginToggleWidget(m_frame, size, element, url, 12218216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott names, values, mimeType, loadManually)); 12228216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott } 12238216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott prpWidget = PluginView::create(m_frame, 12248216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott size, 12258216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott element, 12268216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott url, 12278216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott names, 12288216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott values, 12298216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott mimeType, 12308216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott loadManually); 12318216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // Return the plugin if it was loaded successfully. Otherwise, fallback to 12328216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // the youtube placeholder if possible. No need to check prpWidget as 12338216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // PluginView::create will create a PluginView for missing plugins. 12348216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // Note: this check really only checks if the plugin was found and not if 12358216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott // the plugin was loaded. 12368216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott if (prpWidget->status() == PluginStatusLoadedSuccessfully) 12378216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott return prpWidget; 12388216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott#endif 12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create an iframe for youtube urls. 12403bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen if (isYouTubeUrl(url, mimeType) && isYouTubeInstalled()) { 12416d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu WTF::RefPtr<Frame> frame = createFrame(blankURL(), String(), element, 12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String(), false, 0, 0); 12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (frame) { 12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // grab everything after /v/ 12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String videoId = url.path().substring(sizeof(slash_v_slash)); 12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Extract just the video id 12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned videoIdEnd = 0; 12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (; videoIdEnd < videoId.length(); videoIdEnd++) { 12498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (videoId[videoIdEnd] == '&') { 12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project videoId = videoId.left(videoIdEnd); 12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project AssetManager* am = globalAssetManager(); 12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Asset* a = am->open("webkit/youtube.html", 12568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Asset::ACCESS_BUFFER); 12578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!a) 12588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NULL; 12598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String s = String((const char*)a->getBuffer(false), a->getLength()); 12608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s = s.replace("VIDEO_ID", videoId); 12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete a; 12628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loadDataIntoFrame(frame.get(), 1263e372b0aa0721bf108058f04c43ad1365058369b2Steve Block KURL(ParsedURLString, "file:///android_asset/webkit/"), String(), s); 12646d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu // Transfer ownership to a local refptr. 1265deb338ee1849d227ba106f707fb53c0f18b49518Grace Kloba WTF::RefPtr<Widget> widget(frame->view()); 12666d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu return widget.release(); 12678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12698216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott return prpWidget; 12708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::redirectDataToPlugin(Widget* pluginWidget) { 12733d2cfdc4c24631a2b60467b7dd03bb88f10be9b7Patrick Scott // Do not redirect data if the Widget is our plugin placeholder. 12743d2cfdc4c24631a2b60467b7dd03bb88f10be9b7Patrick Scott if (pluginWidget->isPluginView()) { 12753d2cfdc4c24631a2b60467b7dd03bb88f10be9b7Patrick Scott m_manualLoader = static_cast<PluginView*>(pluginWidget); 12763d2cfdc4c24631a2b60467b7dd03bb88f10be9b7Patrick Scott } 12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12796d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei PopescuWTF::PassRefPtr<Widget> FrameLoaderClientAndroid::createJavaAppletWidget(const IntSize&, HTMLAppletElement*, 12808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const KURL& baseURL, const WTF::Vector<String>& paramNames, 12818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const WTF::Vector<String>& paramValues) { 12828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // don't support widget yet 12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project notImplemented(); 12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 12858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12878f53f0666f20844fa87c63e5f823470c12fc2721Kristian Monsenvoid FrameLoaderClientAndroid::didTransferChildFrameToNewDocument(WebCore::Page*) 12885b71639dd156f6224bbb25ed257ac70374641f6bSteve Block{ 12895b71639dd156f6224bbb25ed257ac70374641f6bSteve Block ASSERT(m_frame); 12908e56126c98940dc57a03335780d4233e8c19b09fSteve Block // m_webFrame points to the WebFrame for the page that our frame previously 12915b71639dd156f6224bbb25ed257ac70374641f6bSteve Block // belonged to. If the frame now belongs to a new page, we need to update 12925b71639dd156f6224bbb25ed257ac70374641f6bSteve Block // m_webFrame to point to the WebFrame for the new page. 12935b71639dd156f6224bbb25ed257ac70374641f6bSteve Block Page* newPage = m_frame->page(); 12945b71639dd156f6224bbb25ed257ac70374641f6bSteve Block if (newPage != m_webFrame->page()) { 12955b71639dd156f6224bbb25ed257ac70374641f6bSteve Block ChromeClientAndroid* chromeClient = static_cast<ChromeClientAndroid*>(newPage->chrome()->client()); 12965b71639dd156f6224bbb25ed257ac70374641f6bSteve Block Release(m_webFrame); 12975b71639dd156f6224bbb25ed257ac70374641f6bSteve Block m_webFrame = chromeClient->webFrame(); 12985b71639dd156f6224bbb25ed257ac70374641f6bSteve Block Retain(m_webFrame); 12995b71639dd156f6224bbb25ed257ac70374641f6bSteve Block } 13005b71639dd156f6224bbb25ed257ac70374641f6bSteve Block} 13015b71639dd156f6224bbb25ed257ac70374641f6bSteve Block 1302f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reckvoid FrameLoaderClientAndroid::transferLoadingResourceFromPage(unsigned long, DocumentLoader*, const ResourceRequest&, Page*) 1303f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck{ 1304f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck notImplemented(); 1305f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck} 1306f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck 13078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is used by the <OBJECT> element to determine the type of 13088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the contents and work out if it can render it. 13096742cf84f0251a9c6663b8afe6f1bb24256ea00fSteve BlockObjectContentType FrameLoaderClientAndroid::objectContentType(const KURL& url, const String& mimeType, bool shouldPreferPlugInsForImages) { 13106742cf84f0251a9c6663b8afe6f1bb24256ea00fSteve Block return FrameLoader::defaultObjectContentType(url, mimeType, shouldPreferPlugInsForImages); 13118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function allows the application to set the correct CSS media 13148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// style. Android could use it to set the media style 'handheld'. Safari 13158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// may use it to set the media style to 'print' when the user wants to print 13168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// a particular web page. 13178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::overrideMediaType() const { 1318a577c97987bfe6f96fee0081bcdf4d526a9f7d3fSteve Block notImplemented(); 13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is used to re-attach Javascript<->native code classes. 1323031c32d25a37eec52b946918d7648750f8e59a1fSteve Blockvoid FrameLoaderClientAndroid::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld* world) 1324031c32d25a37eec52b946918d7648750f8e59a1fSteve Block{ 1325031c32d25a37eec52b946918d7648750f8e59a1fSteve Block if (world != mainThreadNormalWorld()) 1326031c32d25a37eec52b946918d7648750f8e59a1fSteve Block return; 1327031c32d25a37eec52b946918d7648750f8e59a1fSteve Block 13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 13292df3aefb377b3f3c4af3b548b1980d8c8ae56844Steve Block ALOGV("::WebCore:: windowObjectCleared called on frame %p for %s\n", 1330638aaf75a16aa7ad95fd6a129f52f3890274b2e9Steve Block m_frame, m_frame->document()->url().string().ascii().data()); 13318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_webFrame->windowObjectCleared(m_frame); 13328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoaderClientAndroid::documentElementAvailable() { 13358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 13368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Jun-07 tip of tree merge: 13388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::blockedError(ResourceRequest const& request) { 13398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ResourceError(String(), InternalErrorFileDoesNotExist, String(), String()); 13408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Nov-07 tip of tree merge: 13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didPerformFirstNavigation() const { 134459d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger // This seems to be just a notification that the UI can listen to, to 134559d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger // know if the user has performed first navigation action. 134659d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger // It is called from 13478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // void FrameLoader::addBackForwardItemClippedAtTarget(bool doClip) 134859d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger // "Navigation" here means a transition from one page to another that 13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // ends up in the back/forward list. 13508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::registerForIconNotification(bool listen) { 13538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (listen) 13548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebIconDatabase::RegisterForIconNotification(this); 13558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 13568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebIconDatabase::UnregisterForIconNotification(this); 13578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is the WebIconDatabaseClient method for receiving a notification when we 13608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// get the icon for the page. 13618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didAddIconForPageUrl(const String& pageUrl) { 13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This call must happen before dispatchDidReceiveIcon since that method 13638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // may register for icon notifications again since the icon data may have 13648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // to be read from disk. 13658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project registerForIconNotification(false); 1366e372b0aa0721bf108058f04c43ad1365058369b2Steve Block KURL u(ParsedURLString, pageUrl); 1367009b983c891f32393abb660c7ddcba669fbd5b94Steve Block if (equalIgnoringFragmentIdentifier(u, m_frame->document()->url())) { 13688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dispatchDidReceiveIcon(); 13698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1371f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott 13724c02d6a0244d7e6a7172e1f72aa514c7f68b1ceaBen Murdochvoid FrameLoaderClientAndroid::dispatchDidChangeIcons() { 13734c02d6a0244d7e6a7172e1f72aa514c7f68b1ceaBen Murdoch notImplemented(); 13744c02d6a0244d7e6a7172e1f72aa514c7f68b1ceaBen Murdoch} 13754c02d6a0244d7e6a7172e1f72aa514c7f68b1ceaBen Murdoch 13765ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain MerrickPassRefPtr<FrameNetworkingContext> FrameLoaderClientAndroid::createNetworkingContext() 13775ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain Merrick{ 13785ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain Merrick return FrameNetworkingContextAndroid::create(getFrame()); 13795ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain Merrick} 13805ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain Merrick 13818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1382