FrameLoaderClientAndroid.cpp revision 3bc49c8c3d13a6745cc535c7e6a57da60bb83a09
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"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CString.h"
338ec4217018562da37ecf4144e582fa848b807263Grace Kloba#include "CachedFrame.h"
348ec4217018562da37ecf4144e582fa848b807263Grace Kloba#include "CachedFramePlatformDataAndroid.h"
35b20ea4938e919d82254b11885220c8564546d1caPatrick Scott#include "DOMImplementation.h"
3677dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "Document.h"
3777dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "DocumentLoader.h"
38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Frame.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoader.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameTree.h"
4177dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "FrameView.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLFrameOwnerElement.h"
448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "HTMLPlugInElement.h"
4577dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "HistoryItem.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IconDatabase.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MIMETypeRegistry.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NotImplemented.h"
493bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen#include "PackageNotifier.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h"
51334e51bc2ff9bf7fc55fa67dc8a6d9257501a32eLeon Scroggins#include "PlatformBridge.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformGraphicsContext.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginDatabase.h"
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginView.h"
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ProgressTracker.h"
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderPart.h"
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceError.h"
5977dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "ResourceHandle.h"
6077dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "ResourceHandleInternal.h"
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectionController.h"
6277dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "Settings.h"
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkCanvas.h"
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkRect.h"
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextEncoding.h"
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreFrameBridge.h"
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreResourceLoader.h"
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebHistory.h"
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebIconDatabase.h"
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebFrameView.h"
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebViewCore.h"
7277dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "android_graphics.h"
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <utils/AssetManager.h>
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern android::AssetManager* globalAssetManager();
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android {
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const int EXTRA_LAYOUT_DELAY = 1000;
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoaderClientAndroid::FrameLoaderClientAndroid(WebFrame* webframe)
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_frame(NULL)
843e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    , m_webFrame(webframe)
853e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    , m_manualLoader(NULL)
863e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    , m_hasSentResponseToPlugin(false) {
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Retain(m_webFrame);
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoaderClientAndroid* FrameLoaderClientAndroid::get(const WebCore::Frame* frame)
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<FrameLoaderClientAndroid*> (frame->loader()->client());
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::frameLoaderDestroyed() {
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    registerForIconNotification(false);
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame = 0;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Release(m_webFrame);
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete this;
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::hasWebView() const {
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME,
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // there is one web view per page, or top frame.
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // as android's view is created from Java side, it is always there.
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::makeRepresentation(DocumentLoader*) {
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't use representation
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::forceLayout() {
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
1168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_frame->view()->forceLayout();
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, should we adjust view size here?
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->view()->adjustViewSize();
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::forceLayoutForNonHTML() {
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setCopiesOnScroll() {
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // this is a hint about whether we need to force redraws, or can
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // just copy the scrolled content. Since we always force a redraw
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // anyways, we can ignore this call.
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::detachedFromParent2() {
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, ready to detach frame from view
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::detachedFromParent3() {
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, ready to release view
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is responsible for associating the "id" with a given
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// subresource load.  The following functions that accept an "id" are
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// called for each subresource, so they should not be dispatched to the m_frame.
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::assignIdentifierToInitialRequest(unsigned long id,
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            DocumentLoader*, const ResourceRequest&) {
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillSendRequest(DocumentLoader*, unsigned long id,
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            ResourceRequest&, const ResourceResponse&) {
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
154635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool FrameLoaderClientAndroid::shouldUseCredentialStorage(DocumentLoader*, unsigned long  identifier)
155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
157635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return false;
158635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
159635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveAuthenticationChallenge(DocumentLoader*,
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const AuthenticationChallenge&) {
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCancelAuthenticationChallenge(DocumentLoader*,
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const AuthenticationChallenge&) {
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveResponse(DocumentLoader*,
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const ResourceResponse&) {
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveContentLength(DocumentLoader*,
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, int lengthReceived) {
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishLoading(DocumentLoader*,
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id) {
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailLoading(DocumentLoader* docLoader,
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const ResourceError&) {
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::dispatchDidLoadResourceFromMemoryCache(DocumentLoader*,
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            const ResourceRequest&, const ResourceResponse&, int length) {
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoaderClientAndroid::dispatchDidLoadResourceByXMLHttpRequest(unsigned long identifier, const ScriptString&) {
1975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return;
1985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
1995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidHandleOnloadEvents() {
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveServerRedirectForProvisionalLoad() {
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Tell the load it was a redirect.
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->loadStarted(m_frame);
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCancelClientRedirect() {
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillPerformClientRedirect(const KURL&,
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                double interval, double fireDate) {
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidChangeLocationWithinPage() {
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2226a011ab807deb276b9924d501a4219542092958cSteve Blockvoid FrameLoaderClientAndroid::dispatchDidPushStateWithinPage()
2236a011ab807deb276b9924d501a4219542092958cSteve Block{
2246a011ab807deb276b9924d501a4219542092958cSteve Block    notImplemented();
2256a011ab807deb276b9924d501a4219542092958cSteve Block}
2266a011ab807deb276b9924d501a4219542092958cSteve Block
2276a011ab807deb276b9924d501a4219542092958cSteve Blockvoid FrameLoaderClientAndroid::dispatchDidReplaceStateWithinPage()
2286a011ab807deb276b9924d501a4219542092958cSteve Block{
2296a011ab807deb276b9924d501a4219542092958cSteve Block    notImplemented();
2306a011ab807deb276b9924d501a4219542092958cSteve Block}
2316a011ab807deb276b9924d501a4219542092958cSteve Block
2326a011ab807deb276b9924d501a4219542092958cSteve Blockvoid FrameLoaderClientAndroid::dispatchDidPopStateWithinPage()
2336a011ab807deb276b9924d501a4219542092958cSteve Block{
2346a011ab807deb276b9924d501a4219542092958cSteve Block    notImplemented();
2356a011ab807deb276b9924d501a4219542092958cSteve Block}
2366a011ab807deb276b9924d501a4219542092958cSteve Block
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillClose() {
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveIcon() {
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->tree() && m_frame->tree()->parent())
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::String url(m_frame->loader()->url().string());
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Try to obtain the icon image.
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::Image* icon = WebCore::iconDatabase()->iconForPageURL(
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            url, WebCore::IntSize(16, 16));
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the request fails, try the original request url.
2505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!icon) {
2515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        DocumentLoader* docLoader = m_frame->loader()->activeDocumentLoader();
2525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        KURL originalURL = docLoader->originalRequest().url();
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        icon = WebCore::iconDatabase()->iconForPageURL(
2545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                   originalURL, WebCore::IntSize(16, 16));
2555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // There is a bug in webkit where cancelling an icon load is treated as a
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // failure. When this is fixed, we can ASSERT again that we have an icon.
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (icon) {
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOGV("Received icon (%p) for %s", icon,
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                url.utf8().data());
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->didReceiveIcon(icon);
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOGV("Icon data for %s unavailable, registering for notification...",
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                url.utf8().data());
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        registerForIconNotification();
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
269c6fbc06882c120f5f51090203775eb0421550d13Patrick Scottvoid FrameLoaderClientAndroid::dispatchDidReceiveTouchIconURL(const String& url, bool precomposed) {
270f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott    ASSERT(m_frame);
271f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott    // Do not report sub frame touch icons
272f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott    if (m_frame->tree() && m_frame->tree()->parent())
273f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott        return;
274c6fbc06882c120f5f51090203775eb0421550d13Patrick Scott    m_webFrame->didReceiveTouchIconURL(url, precomposed);
275f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott}
276f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidStartProvisionalLoad() {
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveTitle(const String& title) {
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Used to check for FrameLoadTypeStandard but we only want to send the title for
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the top frame and not sub-frames.
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree() || !m_frame->tree()->parent()) {
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->setTitle(title);
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCommitLoad() {
29146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    verifiedOk();
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void loadDataIntoFrame(Frame* frame, KURL baseUrl, const String& url,
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const String& data) {
296635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (baseUrl.isEmpty()) {
297635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        baseUrl = blankURL();
298635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
299635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ResourceRequest request(baseUrl);
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CString cstr = data.utf8();
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<WebCore::SharedBuffer> buf = WebCore::SharedBuffer::create(cstr.data(), cstr.length());
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SubstituteData subData(buf, String("text/html"), String("utf-8"),
303635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            KURL(KURL(), url));
304635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    frame->loader()->load(request, subData, false);
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailProvisionalLoad(const ResourceError& error) {
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Ignore ErrorInterrupted since it is due to a policy interruption. This
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // is caused by a decision to download the main resource rather than
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // display it.
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (error.errorCode() == InternalErrorInterrupted
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            || error.errorCode() == InternalErrorCancelled) {
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If we decided to download the main resource or if the user cancelled
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // it, make sure we report that the load is done.
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        didFinishLoad();
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AssetManager* am = globalAssetManager();
32159d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check to see if the error code was not generated internally
323334e51bc2ff9bf7fc55fa67dc8a6d9257501a32eLeon Scroggins    WebCore::PlatformBridge::rawResId id = WebCore::PlatformBridge::NoDomain;
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ((error.errorCode() == ErrorFile ||
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            error.errorCode() == ErrorFileNotFound) &&
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (!error.localizedDescription().isEmpty())) {
327334e51bc2ff9bf7fc55fa67dc8a6d9257501a32eLeon Scroggins        id = WebCore::PlatformBridge::LoadError;
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String filename = m_webFrame->getRawResourceFilename(id);
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (filename.isEmpty())
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Grab the error page from the asset manager
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Asset* a = am->openNonAsset(
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            filename.utf8().data(), Asset::ACCESS_BUFFER);
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a)
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Take the failing url and encode html entities so javascript urls are not
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // executed.
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CString failingUrl = error.failingURL().utf8();
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WTF::Vector<char> url;
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int len = failingUrl.length();
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* data = failingUrl.data();
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < len; i++) {
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        char c = data[i];
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                || (c >= '0' && c <= '9'))
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            url.append(c);
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            char buf[16];
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int res = sprintf(buf, "&#%d;", c);
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            buf[res] = 0;
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            url.append(buf, res);
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Replace all occurances of %s with the failing url.
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String s = UTF8Encoding().decode((const char*)a->getBuffer(false), a->getLength());
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    s = s.replace("%s", String(url.data(), url.size()));
36159d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Replace all occurances of %e with the error text
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    s = s.replace("%e", error.localizedDescription());
364ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create the request and the substitute data and tell the FrameLoader to
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // load with the replacement data.
367ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project    // use KURL(const char*) as KURL(const String& url) can trigger ASSERT for
368ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project    // invalidate URL string.
369e372b0aa0721bf108058f04c43ad1365058369b2Steve Block    loadDataIntoFrame(m_frame, KURL(ParsedURLString, data), error.failingURL(), s);
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Delete the asset.
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete a;
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailLoad(const ResourceError&) {
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // called when page is completed with error
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    didFinishLoad();
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishDocumentLoad() {
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // called when finishedParsing
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishLoad() {
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    didFinishLoad();
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFirstLayout() {
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->document()->setExtraLayoutDelay(EXTRA_LAYOUT_DELAY);
392635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // we need to do this here instead of dispatchDidFirstVisuallyNonEmptyLayout
393635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // so that about:blank will update the screen.
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Only need to notify Java side for the top frame
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebViewCore::getWebViewCore(m_frame->view())->didFirstLayout();
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
400635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFirstVisuallyNonEmptyLayout()
401635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
402635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
403635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
404635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrame* FrameLoaderClientAndroid::dispatchCreatePage() {
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_MULTIPLE_WINDOWS
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->settings() && m_frame->settings()->supportMultipleWindows())
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Always a user gesture since window.open maps to
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // ChromeClientAndroid::createWindow
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_webFrame->createWindow(false, true);
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If the client doesn't support multiple windows, just replace the
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // current frame's contents.
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_frame;
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchShow() {
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->view()->invalidate();
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool TreatAsAttachment(const String& content_disposition) {
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Some broken sites just send
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Content-Disposition: ; filename="file"
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // screen those out here.
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith(";"))
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith("inline", false))
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Some broken sites just send
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Content-Disposition: filename="file"
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // without a disposition token... screen those out.
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith("filename", false))
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Also in use is Content-Disposition: name="file"
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith("name", false))
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We have a content-disposition of "attachment" or unknown.
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // RFC 2183, section 2.8 says that an unknown disposition
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // value should be treated as "attachment"
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForMIMEType(FramePolicyFunction func,
4527df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott                                const String& MIMEType, const ResourceRequest& request) {
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(func);
4557df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (!func)
4567df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
4577df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (request.isNull()) {
458035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyIgnore);
4597df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
4607df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    }
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Default to Use (display internally).
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PolicyAction action = PolicyUse;
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check if we should Download instead.
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const ResourceResponse& response = m_frame->loader()->activeDocumentLoader()->response();
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const String& content_disposition = response.httpHeaderField("Content-Disposition");
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!content_disposition.isEmpty()) {
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Server wants to override our normal policy.
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (TreatAsAttachment(content_disposition)) {
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Check to see if we are a sub frame (main frame has no owner element)
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_frame->ownerElement() != 0)
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                action = PolicyIgnore;
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                action = PolicyDownload;
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Ask if it can be handled internally.
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!canShowMIMEType(MIMEType)) {
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Check to see if we are a sub frame (main frame has no owner element)
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_frame->ownerElement() != 0)
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                action = PolicyIgnore;
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                action = PolicyDownload;
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // A status code of 204 indicates no content change. Ignore the result.
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::DocumentLoader* docLoader = m_frame->loader()->activeDocumentLoader();
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (docLoader->response().httpStatusCode() == 204)
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        action = PolicyIgnore;
489035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block    (m_frame->loader()->policyChecker()->*func)(action);
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForNewWindowAction(FramePolicyFunction func,
493b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch                                const NavigationAction& action, const ResourceRequest& request,
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                PassRefPtr<FormState> formState, const String& frameName) {
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4967df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    ASSERT(func);
4977df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (!func)
4987df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
499b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
5007df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (request.isNull()) {
501035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyIgnore);
5027df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
5037df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    }
504b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
505b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch    if (action.type() == NavigationTypeFormSubmitted || action.type() == NavigationTypeFormResubmitted)
506b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch        m_frame->loader()->resetMultipleFormSubmissionProtection();
507b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we get to this point it means that a link has a target that was not
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // found by the frame tree. Instead of creating a new frame, return the
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // current frame in dispatchCreatePage.
5117df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (canHandleRequest(request))
512035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyUse);
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
514035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyIgnore);
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::cancelPolicyCheck() {
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchUnableToImplementPolicy(const ResourceError&) {
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForNavigationAction(FramePolicyFunction func,
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                const NavigationAction& action, const ResourceRequest& request,
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                PassRefPtr<FormState> formState) {
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(func);
5307df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (!func)
5317df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
5327df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (request.isNull()) {
533035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyIgnore);
5347df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
5357df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    }
536b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
537b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch    // Reset multiple form submission protection. If this is a resubmission, we check with the
538b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch    // user and reset the protection if they choose to resubmit the form (see WebCoreFrameBridge.cpp)
539b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch    if (action.type() == NavigationTypeFormSubmitted)
540b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch        m_frame->loader()->resetMultipleFormSubmissionProtection();
541b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (action.type() == NavigationTypeFormResubmitted) {
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->decidePolicyForFormResubmission(func);
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
546035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyUse);
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillSubmitForm(FramePolicyFunction func, PassRefPtr<FormState>) {
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(func);
553035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block    (m_frame->loader()->policyChecker()->*func)(PolicyUse);
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidLoadMainResource(DocumentLoader*) {
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::revertToProvisionalState(DocumentLoader*) {
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setMainDocumentError(DocumentLoader* docLoader, const ResourceError& error) {
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5663e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    if (m_manualLoader) {
5673e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        m_manualLoader->didFail(error);
5683e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        m_manualLoader = NULL;
5693e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        m_hasSentResponseToPlugin = false;
5703e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    } else {
5713e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        if (!error.isNull() && error.errorCode() >= InternalErrorLast)
5723e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott            m_webFrame->reportError(error.errorCode(),
5733e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott                    error.localizedDescription(), error.failingURL());
5743e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    }
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called right before the progress is updated.
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::willChangeEstimatedProgress() {
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called after the progress has been updated. The bad part
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// about this is that when a page is completed, this function is called after
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the progress has been reset to 0.
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didChangeEstimatedProgress() {
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This will give us the initial estimate when the page first starts to load.
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressStartedNotification() {
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->page())
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->setProgress(m_frame->page()->progress()->estimatedProgress());
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This will give us any updated progress including the final progress.
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressEstimateChangedNotification() {
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->page())
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->setProgress(m_frame->page()->progress()->estimatedProgress());
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is just a notification that the progress has finished. Don't call
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// setProgress(1) because postProgressEstimateChangedNotification will do so.
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressFinishedNotification() {
60659d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    WebViewCore* core =  WebViewCore::getWebViewCore(m_frame->view());
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // only need to notify Java for the top frame
60959d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger        core->notifyProgressFinished();
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
61159d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // notify plugins that the frame has loaded
61259d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    core->notifyPluginsOnFrameLoad(m_frame);
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setMainFrameDocumentReady(bool) {
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // this is only interesting once we provide an external API for the DOM
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::startDownload(const ResourceRequest&) {
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::willChangeTitle(DocumentLoader*) {
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didChangeTitle(DocumentLoader* loader) {
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::finishedLoading(DocumentLoader* docLoader) {
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Telling the frame we received some data and passing 0 as the data is our
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // way to get work done that is normally done when the first bit of data is
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // received, even for the case of a document with no data (like about:blank)
6363e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    if (!m_manualLoader) {
6373e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        committedLoad(docLoader, 0, 0);
6383e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        return;
6393e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    }
6403e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott
6413e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    m_manualLoader->didFinishLoading();
6423e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    m_manualLoader = NULL;
6433e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    m_hasSentResponseToPlugin = false;
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
646635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::updateGlobalHistory() {
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
6486689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins
6496689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    DocumentLoader* docLoader = m_frame->loader()->documentLoader();
6506689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    ASSERT(docLoader);
6516689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins
6526689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    // Code copied from FrameLoader.cpp:createHistoryItem
6536689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    // Only add this URL to the database if it is a valid page
6546689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    if (docLoader->unreachableURL().isEmpty()
6556689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins            && docLoader->response().httpStatusCode() < 400) {
6566689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins        m_webFrame->updateVisitedHistory(docLoader->urlForHistory(), false);
65748c46b2d3efc59f2883218d8e713d403b658ff2bPatrick Scott        if (!docLoader->serverRedirectSourceForHistory().isNull())
658e372b0aa0721bf108058f04c43ad1365058369b2Steve Block            m_webFrame->updateVisitedHistory(KURL(ParsedURLString, docLoader->serverRedirectDestinationForHistory()), false);
6596689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    }
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoaderClientAndroid::updateGlobalHistoryRedirectLinks() {
663635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Note, do we need to do anything where there is no HistoryItem? If we call
664635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // updateGlobalHistory(), we will add bunch of "data:xxx" urls for gmail.com
665635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // which is not what we want. Opt to do nothing now.
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::shouldGoToHistoryItem(HistoryItem* item) const {
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // hmmm, seems like we might do a more thoughtful check
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return item != NULL;
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
674b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Blockvoid FrameLoaderClientAndroid::didDisplayInsecureContent()
675b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block{
676b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block    notImplemented();
677b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block}
678b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block
679b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Blockvoid FrameLoaderClientAndroid::didRunInsecureContent(SecurityOrigin*)
680b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block{
681b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block    notImplemented();
682b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block}
683b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::committedLoad(DocumentLoader* loader, const char* data, int length) {
685c2874fc0a80c2eba019fac221dd05d49454553d6Cary Clark    if (!m_manualLoader) {
686c2874fc0a80c2eba019fac221dd05d49454553d6Cary Clark        ASSERT(m_frame);
687c2874fc0a80c2eba019fac221dd05d49454553d6Cary Clark        String encoding = loader->overrideEncoding();
688c2874fc0a80c2eba019fac221dd05d49454553d6Cary Clark        bool userChosen = !encoding.isNull();
689c2874fc0a80c2eba019fac221dd05d49454553d6Cary Clark        if (encoding.isNull())
690c2874fc0a80c2eba019fac221dd05d49454553d6Cary Clark            encoding = loader->response().textEncodingName();
691c2874fc0a80c2eba019fac221dd05d49454553d6Cary Clark        loader->frameLoader()->setEncoding(encoding, userChosen);
692c2874fc0a80c2eba019fac221dd05d49454553d6Cary Clark        Document *doc = m_frame->document();
693c2874fc0a80c2eba019fac221dd05d49454553d6Cary Clark        if (doc)
694c2874fc0a80c2eba019fac221dd05d49454553d6Cary Clark            loader->frameLoader()->addData(data, length);
695c2874fc0a80c2eba019fac221dd05d49454553d6Cary Clark    }
6963e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    if (m_manualLoader) {
6973e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        if (!m_hasSentResponseToPlugin) {
6983e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott            m_manualLoader->didReceiveResponse(loader->response());
6993e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott            // Failure could cause the main document to have an error causing
7003e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott            // the manual loader to be reset.
7013e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott            if (!m_manualLoader)
7023e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott                return;
7033e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott            m_hasSentResponseToPlugin = true;
7043e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        }
7053e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        m_manualLoader->didReceiveData(data, length);
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cancelledError(const ResourceRequest& request) {
710635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorCancelled, request.url(), String());
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cannotShowURLError(const ResourceRequest& request) {
714635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorCannotShowUrl, request.url(), String());
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::interruptForPolicyChangeError(const ResourceRequest& request) {
718635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorInterrupted, request.url(), String());
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cannotShowMIMETypeError(const ResourceResponse& request) {
722635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorCannotShowMimeType, request.url(), String());
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::fileDoesNotExistError(const ResourceResponse& request) {
726635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorFileDoesNotExist, request.url(), String());
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::pluginWillHandleLoadError(const ResourceResponse& request) {
730635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorPluginWillHandleLoadError, request.url(), String());
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::shouldFallBack(const ResourceError&) {
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canHandleRequest(const ResourceRequest& request) const {
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't allow hijacking of intrapage navigation
74159d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    if (WebCore::equalIgnoringFragmentIdentifier(request.url(), m_frame->loader()->url()))
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't allow hijacking of iframe urls that are http or https
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (request.url().protocol().startsWith("http", false) &&
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_frame->tree() && m_frame->tree()->parent())
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
749cb86952d254446a800421b5804f886f8d87cd875Grace Kloba    return m_webFrame->canHandleRequest(request);
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canShowMIMEType(const String& mimeType) const {
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This looks like it has to do with whether or not a type can be
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // shown "internally" (i.e. inside the browser) regardless of whether
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // or not the browser is doing the rendering, e.g. a full page plugin.
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (MIMETypeRegistry::isSupportedImageResourceMIMEType(mimeType) ||
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType) ||
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            MIMETypeRegistry::isSupportedJavaScriptMIMEType(mimeType) ||
7590981d957132dc87d7cd48ae62a37002cb37c811dGrace Kloba            (m_frame && m_frame->settings()
7600981d957132dc87d7cd48ae62a37002cb37c811dGrace Kloba                    && m_frame->settings()->arePluginsEnabled()
7610981d957132dc87d7cd48ae62a37002cb37c811dGrace Kloba                    && PluginDatabase::installedPlugins()->isMIMETypeRegistered(
7620981d957132dc87d7cd48ae62a37002cb37c811dGrace Kloba                            mimeType)) ||
763b20ea4938e919d82254b11885220c8564546d1caPatrick Scott            DOMImplementation::isTextMIMEType(mimeType) ||
764b20ea4938e919d82254b11885220c8564546d1caPatrick Scott            DOMImplementation::isXMLMIMEType(mimeType))
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::representationExistsForURLScheme(const String&) const {
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't use representation
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::generatedMIMETypeForURLScheme(const String& URLScheme) const {
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, copy from Apple's port
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String mimetype("x-apple-web-kit/");
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mimetype.append(URLScheme.lower());
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return mimetype;
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::frameLoadCompleted() {
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // copied from Apple port, without this back with sub-frame will trigger ASSERT
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::saveViewStateToItem(HistoryItem* item) {
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(item);
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We should have added a bridge when the child item was added to its
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // parent.
792be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch    AndroidWebHistoryBridge* bridge = item->bridge();
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(bridge);
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // store the current scale (only) for the top frame
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
796a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view());
797a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        bridge->setScale((int)(webViewCore->scale() * 100));
798a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        bridge->setScreenWidthScale((int)(webViewCore->screenWidthScale() * 100));
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::notifyHistoryItemChanged(item);
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::restoreViewState() {
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view());
80667ed0edeb2ad5bb22ec778472b78d41e7eb3b68aSteve Block    HistoryItem* item = m_frame->loader()->history()->currentItem();
807be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch    AndroidWebHistoryBridge* bridge = item->bridge();
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // restore the scale (only) for the top frame
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
810be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch        int scale = bridge->scale();
811a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        webViewCore->restoreScale(scale);
812be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch        int screenWidthScale = bridge->screenWidthScale();
813a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        if (screenWidthScale != scale)
814a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba            webViewCore->restoreScreenWidthScale(screenWidthScale);
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
818be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdochvoid FrameLoaderClientAndroid::dispatchDidAddBackForwardItem(HistoryItem* item) const {
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->addHistoryItem(item);
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
823be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdochvoid FrameLoaderClientAndroid::dispatchDidRemoveBackForwardItem(HistoryItem* item) const {
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
825be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch    m_webFrame->removeHistoryItem(0);
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdochvoid FrameLoaderClientAndroid::dispatchDidChangeBackForwardIndex() const {
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
830be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch    BackForwardList* list = m_frame->page()->backForwardList();
831be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch    ASSERT(list);
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->updateHistoryIndex(list->backListCount());
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::provisionalLoadStarted() {
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->loadStarted(m_frame);
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didFinishLoad() {
8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->document()->setExtraLayoutDelay(0);
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->didFinishLoad(m_frame);
8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::prepareForDataSourceReplacement() {
8475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    verifiedOk();
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<DocumentLoader> FrameLoaderClientAndroid::createDocumentLoader(
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const ResourceRequest& request, const SubstituteData& data) {
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<DocumentLoader> loader = DocumentLoader::create(request, data);
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return loader.release();
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setTitle(const String& title, const KURL& url) {
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Not needed. dispatchDidReceiveTitle is called immediately after this.
8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // url is used to update the Apple port history items.
8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::userAgent(const KURL& u) {
8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_webFrame->userAgentForURL(&u);
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8668ec4217018562da37ecf4144e582fa848b807263Grace Klobavoid FrameLoaderClientAndroid::savePlatformDataToCachedFrame(WebCore::CachedFrame* cachedFrame) {
8678ec4217018562da37ecf4144e582fa848b807263Grace Kloba    CachedFramePlatformDataAndroid* platformData = new CachedFramePlatformDataAndroid(m_frame->settings());
8688ec4217018562da37ecf4144e582fa848b807263Grace Kloba    cachedFrame->setCachedFramePlatformData(platformData);
869635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
870635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
8718ec4217018562da37ecf4144e582fa848b807263Grace Klobavoid FrameLoaderClientAndroid::transitionToCommittedFromCachedFrame(WebCore::CachedFrame* cachedFrame) {
8728ec4217018562da37ecf4144e582fa848b807263Grace Kloba    CachedFramePlatformDataAndroid* platformData = reinterpret_cast<CachedFramePlatformDataAndroid*>(cachedFrame->cachedFramePlatformData());
8738ec4217018562da37ecf4144e582fa848b807263Grace Kloba#ifdef ANDROID_META_SUPPORT
8748ec4217018562da37ecf4144e582fa848b807263Grace Kloba   platformData->restoreMetadata(m_frame->settings());
8758ec4217018562da37ecf4144e582fa848b807263Grace Kloba#endif
876ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba   m_webFrame->transitionToCommitted(m_frame);
877635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
878635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
879635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::transitionToCommittedForNewPage() {
880635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(m_frame);
881cb86952d254446a800421b5804f886f8d87cd875Grace Kloba
882cb86952d254446a800421b5804f886f8d87cd875Grace Kloba#ifdef ANDROID_META_SUPPORT
883cb86952d254446a800421b5804f886f8d87cd875Grace Kloba    // reset metadata settings for the main frame as they are not preserved cross page
884cb86952d254446a800421b5804f886f8d87cd875Grace Kloba    if (m_frame == m_frame->page()->mainFrame() && m_frame->settings())
885cb86952d254446a800421b5804f886f8d87cd875Grace Kloba        m_frame->settings()->resetMetadataSettings();
886cb86952d254446a800421b5804f886f8d87cd875Grace Kloba#endif
887cb86952d254446a800421b5804f886f8d87cd875Grace Kloba
8888ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // Save the old WebViewCore before creating a new FrameView. There is one
8898ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // WebViewCore per page. Each frame, including the main frame and sub frame,
8908ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // has a 1:1 FrameView and WebFrameView.
8918ec4217018562da37ecf4144e582fa848b807263Grace Kloba    WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view());
8928ec4217018562da37ecf4144e582fa848b807263Grace Kloba    Retain(webViewCore);
8938ec4217018562da37ecf4144e582fa848b807263Grace Kloba
894ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba    // Save the old WebFrameView's bounds and apply them to the new WebFrameView
895bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen    WebFrameView* oldWebFrameView = static_cast<WebFrameView*> (m_frame->view()->platformWidget());
896bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen    IntRect bounds = oldWebFrameView->getBounds();
897bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen    IntRect windowBounds = oldWebFrameView->getWindowBounds();
898bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen    WebCore::FrameView* oldFrameView = oldWebFrameView->view();
899bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen    m_frame->createView(bounds.size(), oldFrameView->baseBackgroundColor(), oldFrameView->isTransparent(), IntSize(), false);
900bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen
9018ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // Create a new WebFrameView for the new FrameView
9028ec4217018562da37ecf4144e582fa848b807263Grace Kloba    WebFrameView* newFrameView = new WebFrameView(m_frame->view(), webViewCore);
903ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba    newFrameView->setLocation(bounds.x(), bounds.y());
904ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba    newFrameView->setSize(bounds.width(), bounds.height());
905ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba    newFrameView->setWindowBounds(windowBounds.x(), windowBounds.y(), windowBounds.width(), windowBounds.height());
9068ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // newFrameView attaches itself to FrameView which Retains the reference, so
9078ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // call Release for newFrameView
9088ec4217018562da37ecf4144e582fa848b807263Grace Kloba    Release(newFrameView);
9098ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // WebFrameView Retains webViewCore, so call Release for webViewCore
9108ec4217018562da37ecf4144e582fa848b807263Grace Kloba    Release(webViewCore);
911635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
912635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_webFrame->transitionToCommitted(m_frame);
913635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
914635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canCachePage() const {
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::download(ResourceHandle* handle, const ResourceRequest&,
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                const ResourceRequest&, const ResourceResponse&) {
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the C++ side of the load listener and tell it to handle the download
92280e68b43c3da64848db8edc7d8e8fe095888e42eAndrei Popescu    handle->getInternal()->m_loader->downloadFile();
9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWTF::PassRefPtr<WebCore::Frame> FrameLoaderClientAndroid::createFrame(const KURL& url, const String& name,
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        HTMLFrameOwnerElement* ownerElement, const String& referrer,
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        bool allowsScrolling, int marginWidth, int marginHeight)
9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* parent = ownerElement->document()->frame();
9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameLoaderClientAndroid* loaderC = new FrameLoaderClientAndroid(m_webFrame);
9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<Frame> pFrame = Frame::create(parent->page(), ownerElement, loaderC);
9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* newFrame = pFrame.get();
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    loaderC->setFrame(newFrame);
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Append the subframe to the parent and set the name of the subframe. The name must be set after
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // appending the child so that the name becomes unique.
9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    parent->tree()->appendChild(newFrame);
9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->tree()->setName(name);
9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create a new FrameView and WebFrameView for the child frame to draw into.
9395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    RefPtr<FrameView> frameView = FrameView::create(newFrame);
94059d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    WebFrameView* webFrameView = new WebFrameView(frameView.get(),
9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            WebViewCore::getWebViewCore(parent->view()));
9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // frameView Retains webFrameView, so call Release for webFrameView
9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Release(webFrameView);
9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Attach the frameView to the newFrame.
9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->setView(frameView);
9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->init();
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->selection()->setFocused(true);
9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("::WebCore:: createSubFrame returning %p", newFrame);
9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The creation of the frame may have run arbitrary JavaScript that removed it from the page already.
9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!pFrame->page())
9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
95359d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger
9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    parent->loader()->loadURLIntoChildFrame(url, referrer, pFrame.get());
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // onLoad may cuase the frame to be removed from the document. Allow the RefPtr to delete the child frame.
9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!pFrame->tree()->parent())
9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NULL;
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pFrame.release();
9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// YouTube flash url path starts with /v/
9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const char slash_v_slash[] = { '/', 'v', '/' };
9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool isValidYouTubeVideo(const String& path)
9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!charactersAreAllASCII(path.characters(), path.length()))
9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned int len = path.length();
9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (len <= sizeof(slash_v_slash)) // check for more than just /v/
9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CString str = path.lower().utf8();
9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* data = str.data();
9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (memcmp(data, slash_v_slash, sizeof(slash_v_slash)) != 0)
9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Start after /v/
9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned int i = sizeof(slash_v_slash); i < len; i++) {
9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        char c = data[i];
9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Check for alpha-numeric characters only.
981635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (WTF::isASCIIAlphanumeric(c) || c == '_' || c == '-')
9828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The url can have more parameters such as &hl=en after the video id.
9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Once we start seeing extra parameters we can return true.
9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return c == '&' && i > sizeof(slash_v_slash);
9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool isYouTubeUrl(const KURL& url, const String& mimeType)
9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
992635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    String host = url.host();
993635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool youtube = host.endsWith("youtube.com")
994635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            || host.endsWith("youtube-nocookie.com");
995635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return youtube && isValidYouTubeVideo(url.path())
9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            && equalIgnoringCase(mimeType, "application/x-shockwave-flash");
9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9993bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsenstatic bool isYouTubeInstalled() {
10003bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen    return WebCore::packageNotifier().isPackageInstalled("com.google.android.youtube");
10013bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen}
10023bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen
10036d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei PopescuWTF::PassRefPtr<Widget> FrameLoaderClientAndroid::createPlugin(
10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const IntSize& size,
10058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HTMLPlugInElement* element,
10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const KURL& url,
10076d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu        const WTF::Vector<String>& names,
10086d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu        const WTF::Vector<String>& values,
10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const String& mimeType,
10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool loadManually) {
10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create an iframe for youtube urls.
10123bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen    if (isYouTubeUrl(url, mimeType) && isYouTubeInstalled()) {
10136d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu        WTF::RefPtr<Frame> frame = createFrame(blankURL(), String(), element,
10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                String(), false, 0, 0);
10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (frame) {
10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // grab everything after /v/
10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String videoId = url.path().substring(sizeof(slash_v_slash));
10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Extract just the video id
10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unsigned videoIdEnd = 0;
10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (; videoIdEnd < videoId.length(); videoIdEnd++) {
10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (videoId[videoIdEnd] == '&') {
10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    videoId = videoId.left(videoIdEnd);
10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
10258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            AssetManager* am = globalAssetManager();
10278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Asset* a = am->open("webkit/youtube.html",
10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Asset::ACCESS_BUFFER);
10298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!a)
10308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return NULL;
10318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String s = String((const char*)a->getBuffer(false), a->getLength());
10328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            s = s.replace("VIDEO_ID", videoId);
10338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            delete a;
10348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            loadDataIntoFrame(frame.get(),
1035e372b0aa0721bf108058f04c43ad1365058369b2Steve Block                    KURL(ParsedURLString, "file:///android_asset/webkit/"), String(), s);
10366d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu            // Transfer ownership to a local refptr.
1037deb338ee1849d227ba106f707fb53c0f18b49518Grace Kloba            WTF::RefPtr<Widget> widget(frame->view());
10386d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu            return widget.release();
10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NULL;
10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_PLUGINS
10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return PluginView::create(m_frame,
10448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              size,
10458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              element,
10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              url,
10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              names,
10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              values,
10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              mimeType,
10508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              loadManually);
10518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
10528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NULL;
10538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
10548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::redirectDataToPlugin(Widget* pluginWidget) {
10573e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    m_manualLoader = static_cast<PluginView*>(pluginWidget);
10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10606d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei PopescuWTF::PassRefPtr<Widget> FrameLoaderClientAndroid::createJavaAppletWidget(const IntSize&, HTMLAppletElement*,
10618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        const KURL& baseURL, const WTF::Vector<String>& paramNames,
10628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        const WTF::Vector<String>& paramValues) {
10638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't support widget yet
10648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
10658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
10668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is used by the <OBJECT> element to determine the type of
10698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the contents and work out if it can render it.
10708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectObjectContentType FrameLoaderClientAndroid::objectContentType(const KURL& url,
10718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        const String& mimeType) {
10726916255e3bc5760bcaac2ec7d5057e057bd3de6aPatrick Scott    return FrameLoader::defaultObjectContentType(url, mimeType);
10738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function allows the application to set the correct CSS media
10768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// style. Android could use it to set the media style 'handheld'. Safari
10778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// may use it to set the media style to 'print' when the user wants to print
10788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// a particular web page.
10798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::overrideMediaType() const {
10808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
10818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return String();
10828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is used to re-attach Javascript<->native code classes.
1085031c32d25a37eec52b946918d7648750f8e59a1fSteve Blockvoid FrameLoaderClientAndroid::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld* world)
1086031c32d25a37eec52b946918d7648750f8e59a1fSteve Block{
1087031c32d25a37eec52b946918d7648750f8e59a1fSteve Block    if (world != mainThreadNormalWorld())
1088031c32d25a37eec52b946918d7648750f8e59a1fSteve Block        return;
1089031c32d25a37eec52b946918d7648750f8e59a1fSteve Block
10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
109159d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    LOGV("::WebCore:: windowObjectCleared called on frame %p for %s\n",
10928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    		m_frame, m_frame->loader()->url().string().ascii().data());
10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->windowObjectCleared(m_frame);
10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoaderClientAndroid::documentElementAvailable() {
10978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
10988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
10998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Jun-07 tip of tree merge:
11008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::blockedError(ResourceRequest const& request) {
11018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ResourceError(String(), InternalErrorFileDoesNotExist, String(), String());
11028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Nov-07 tip of tree merge:
11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didPerformFirstNavigation() const {
110659d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // This seems to be just a notification that the UI can listen to, to
110759d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // know if the user has performed first navigation action.
110859d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // It is called from
11098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // void FrameLoader::addBackForwardItemClippedAtTarget(bool doClip)
111059d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // "Navigation" here means a transition from one page to another that
11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // ends up in the back/forward list.
11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::registerForIconNotification(bool listen) {
11158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (listen)
11168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebIconDatabase::RegisterForIconNotification(this);
11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
11188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebIconDatabase::UnregisterForIconNotification(this);
11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is the WebIconDatabaseClient method for receiving a notification when we
11228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// get the icon for the page.
11238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didAddIconForPageUrl(const String& pageUrl) {
11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This call must happen before dispatchDidReceiveIcon since that method
11258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // may register for icon notifications again since the icon data may have
11268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // to be read from disk.
11278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    registerForIconNotification(false);
1128e372b0aa0721bf108058f04c43ad1365058369b2Steve Block    KURL u(ParsedURLString, pageUrl);
11299e2ee40924101fa594b0b31d866f896154b47caaBen Murdoch    if (equalIgnoringFragmentIdentifier(u, m_frame->loader()->url())) {
11308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dispatchDidReceiveIcon();
11318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1133f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott
11348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1135