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