FrameLoaderClientAndroid.cpp revision 6a011ab807deb276b9924d501a4219542092958c
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"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "android_graphics.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CString.h"
328ec4217018562da37ecf4144e582fa848b807263Grace Kloba#include "CachedFrame.h"
338ec4217018562da37ecf4144e582fa848b807263Grace Kloba#include "CachedFramePlatformDataAndroid.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DocumentLoader.h"
35b20ea4938e919d82254b11885220c8564546d1caPatrick Scott#include "DOMImplementation.h"
36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Frame.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoader.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoaderClientAndroid.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameTree.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLFrameOwnerElement.h"
428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "HTMLPlugInElement.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IconDatabase.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MIMETypeRegistry.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NotImplemented.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h"
47334e51bc2ff9bf7fc55fa67dc8a6d9257501a32eLeon Scroggins#include "PlatformBridge.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformGraphicsContext.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginDatabase.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginView.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ProgressTracker.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderPart.h"
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceError.h"
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectionController.h"
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkCanvas.h"
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkRect.h"
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextEncoding.h"
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h"
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HistoryItem.h"
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceHandle.h"
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceHandleInternal.h"
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreFrameBridge.h"
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreResourceLoader.h"
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebHistory.h"
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebIconDatabase.h"
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebFrameView.h"
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebViewCore.h"
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h"
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <utils/AssetManager.h>
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern android::AssetManager* globalAssetManager();
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android {
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const int EXTRA_LAYOUT_DELAY = 1000;
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoaderClientAndroid::FrameLoaderClientAndroid(WebFrame* webframe)
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_frame(NULL)
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_webFrame(webframe) {
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Retain(m_webFrame);
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoaderClientAndroid* FrameLoaderClientAndroid::get(const WebCore::Frame* frame)
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<FrameLoaderClientAndroid*> (frame->loader()->client());
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::frameLoaderDestroyed() {
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    registerForIconNotification(false);
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame = 0;
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Release(m_webFrame);
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete this;
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::hasWebView() const {
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME,
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // there is one web view per page, or top frame.
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // as android's view is created from Java side, it is always there.
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::makeRepresentation(DocumentLoader*) {
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't use representation
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::forceLayout() {
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
1128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_frame->view()->forceLayout();
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, should we adjust view size here?
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->view()->adjustViewSize();
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::forceLayoutForNonHTML() {
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setCopiesOnScroll() {
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // this is a hint about whether we need to force redraws, or can
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // just copy the scrolled content. Since we always force a redraw
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // anyways, we can ignore this call.
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::detachedFromParent2() {
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, ready to detach frame from view
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::detachedFromParent3() {
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, ready to release view
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is responsible for associating the "id" with a given
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// subresource load.  The following functions that accept an "id" are
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// called for each subresource, so they should not be dispatched to the m_frame.
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::assignIdentifierToInitialRequest(unsigned long id,
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            DocumentLoader*, const ResourceRequest&) {
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillSendRequest(DocumentLoader*, unsigned long id,
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            ResourceRequest&, const ResourceResponse&) {
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool FrameLoaderClientAndroid::shouldUseCredentialStorage(DocumentLoader*, unsigned long  identifier)
151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return false;
154635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveAuthenticationChallenge(DocumentLoader*,
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const AuthenticationChallenge&) {
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCancelAuthenticationChallenge(DocumentLoader*,
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const AuthenticationChallenge&) {
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveResponse(DocumentLoader*,
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const ResourceResponse&) {
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveContentLength(DocumentLoader*,
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, int lengthReceived) {
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishLoading(DocumentLoader*,
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id) {
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailLoading(DocumentLoader* docLoader,
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const ResourceError&) {
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::dispatchDidLoadResourceFromMemoryCache(DocumentLoader*,
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            const ResourceRequest&, const ResourceResponse&, int length) {
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoaderClientAndroid::dispatchDidLoadResourceByXMLHttpRequest(unsigned long identifier, const ScriptString&) {
1935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return;
1945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
1955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidHandleOnloadEvents() {
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveServerRedirectForProvisionalLoad() {
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Tell the load it was a redirect.
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->loadStarted(m_frame);
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCancelClientRedirect() {
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillPerformClientRedirect(const KURL&,
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                double interval, double fireDate) {
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidChangeLocationWithinPage() {
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2186a011ab807deb276b9924d501a4219542092958cSteve Blockvoid FrameLoaderClientAndroid::dispatchDidPushStateWithinPage()
2196a011ab807deb276b9924d501a4219542092958cSteve Block{
2206a011ab807deb276b9924d501a4219542092958cSteve Block    notImplemented();
2216a011ab807deb276b9924d501a4219542092958cSteve Block}
2226a011ab807deb276b9924d501a4219542092958cSteve Block
2236a011ab807deb276b9924d501a4219542092958cSteve Blockvoid FrameLoaderClientAndroid::dispatchDidReplaceStateWithinPage()
2246a011ab807deb276b9924d501a4219542092958cSteve Block{
2256a011ab807deb276b9924d501a4219542092958cSteve Block    notImplemented();
2266a011ab807deb276b9924d501a4219542092958cSteve Block}
2276a011ab807deb276b9924d501a4219542092958cSteve Block
2286a011ab807deb276b9924d501a4219542092958cSteve Blockvoid FrameLoaderClientAndroid::dispatchDidPopStateWithinPage()
2296a011ab807deb276b9924d501a4219542092958cSteve Block{
2306a011ab807deb276b9924d501a4219542092958cSteve Block    notImplemented();
2316a011ab807deb276b9924d501a4219542092958cSteve Block}
2326a011ab807deb276b9924d501a4219542092958cSteve Block
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillClose() {
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveIcon() {
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->tree() && m_frame->tree()->parent())
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::String url(m_frame->loader()->url().string());
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Try to obtain the icon image.
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::Image* icon = WebCore::iconDatabase()->iconForPageURL(
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            url, WebCore::IntSize(16, 16));
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the request fails, try the original request url.
2465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!icon) {
2475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        DocumentLoader* docLoader = m_frame->loader()->activeDocumentLoader();
2485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        KURL originalURL = docLoader->originalRequest().url();
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        icon = WebCore::iconDatabase()->iconForPageURL(
2505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                   originalURL, WebCore::IntSize(16, 16));
2515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // There is a bug in webkit where cancelling an icon load is treated as a
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // failure. When this is fixed, we can ASSERT again that we have an icon.
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (icon) {
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOGV("Received icon (%p) for %s", icon,
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                url.utf8().data());
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->didReceiveIcon(icon);
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOGV("Icon data for %s unavailable, registering for notification...",
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                url.utf8().data());
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        registerForIconNotification();
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
265c6fbc06882c120f5f51090203775eb0421550d13Patrick Scottvoid FrameLoaderClientAndroid::dispatchDidReceiveTouchIconURL(const String& url, bool precomposed) {
266f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott    ASSERT(m_frame);
267f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott    // Do not report sub frame touch icons
268f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott    if (m_frame->tree() && m_frame->tree()->parent())
269f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott        return;
270c6fbc06882c120f5f51090203775eb0421550d13Patrick Scott    m_webFrame->didReceiveTouchIconURL(url, precomposed);
271f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott}
272f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidStartProvisionalLoad() {
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveTitle(const String& title) {
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Used to check for FrameLoadTypeStandard but we only want to send the title for
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the top frame and not sub-frames.
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree() || !m_frame->tree()->parent()) {
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->setTitle(title);
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCommitLoad() {
28746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    verifiedOk();
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
290635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void loadDataIntoFrame(Frame* frame, KURL baseUrl, const String& url,
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const String& data) {
292635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (baseUrl.isEmpty()) {
293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        baseUrl = blankURL();
294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
295635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ResourceRequest request(baseUrl);
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CString cstr = data.utf8();
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<WebCore::SharedBuffer> buf = WebCore::SharedBuffer::create(cstr.data(), cstr.length());
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SubstituteData subData(buf, String("text/html"), String("utf-8"),
299635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            KURL(KURL(), url));
300635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    frame->loader()->load(request, subData, false);
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailProvisionalLoad(const ResourceError& error) {
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Ignore ErrorInterrupted since it is due to a policy interruption. This
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // is caused by a decision to download the main resource rather than
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // display it.
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (error.errorCode() == InternalErrorInterrupted
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            || error.errorCode() == InternalErrorCancelled) {
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If we decided to download the main resource or if the user cancelled
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // it, make sure we report that the load is done.
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        didFinishLoad();
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AssetManager* am = globalAssetManager();
31759d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check to see if the error code was not generated internally
319334e51bc2ff9bf7fc55fa67dc8a6d9257501a32eLeon Scroggins    WebCore::PlatformBridge::rawResId id = WebCore::PlatformBridge::NoDomain;
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ((error.errorCode() == ErrorFile ||
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            error.errorCode() == ErrorFileNotFound) &&
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (!error.localizedDescription().isEmpty())) {
323334e51bc2ff9bf7fc55fa67dc8a6d9257501a32eLeon Scroggins        id = WebCore::PlatformBridge::LoadError;
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String filename = m_webFrame->getRawResourceFilename(id);
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (filename.isEmpty())
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Grab the error page from the asset manager
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Asset* a = am->openNonAsset(
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            filename.utf8().data(), Asset::ACCESS_BUFFER);
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a)
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Take the failing url and encode html entities so javascript urls are not
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // executed.
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CString failingUrl = error.failingURL().utf8();
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WTF::Vector<char> url;
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int len = failingUrl.length();
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* data = failingUrl.data();
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < len; i++) {
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        char c = data[i];
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                || (c >= '0' && c <= '9'))
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            url.append(c);
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            char buf[16];
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int res = sprintf(buf, "&#%d;", c);
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            buf[res] = 0;
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            url.append(buf, res);
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Replace all occurances of %s with the failing url.
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String s = UTF8Encoding().decode((const char*)a->getBuffer(false), a->getLength());
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    s = s.replace("%s", String(url.data(), url.size()));
35759d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Replace all occurances of %e with the error text
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    s = s.replace("%e", error.localizedDescription());
360ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create the request and the substitute data and tell the FrameLoader to
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // load with the replacement data.
363ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project    // use KURL(const char*) as KURL(const String& url) can trigger ASSERT for
364ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project    // invalidate URL string.
365e372b0aa0721bf108058f04c43ad1365058369b2Steve Block    loadDataIntoFrame(m_frame, KURL(ParsedURLString, data), error.failingURL(), s);
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Delete the asset.
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete a;
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailLoad(const ResourceError&) {
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // called when page is completed with error
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    didFinishLoad();
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishDocumentLoad() {
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // called when finishedParsing
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishLoad() {
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    didFinishLoad();
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFirstLayout() {
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->document()->setExtraLayoutDelay(EXTRA_LAYOUT_DELAY);
388635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // we need to do this here instead of dispatchDidFirstVisuallyNonEmptyLayout
389635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // so that about:blank will update the screen.
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Only need to notify Java side for the top frame
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebViewCore::getWebViewCore(m_frame->view())->didFirstLayout();
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
396635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFirstVisuallyNonEmptyLayout()
397635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
398635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
399635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
400635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrame* FrameLoaderClientAndroid::dispatchCreatePage() {
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_MULTIPLE_WINDOWS
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->settings() && m_frame->settings()->supportMultipleWindows())
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Always a user gesture since window.open maps to
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // ChromeClientAndroid::createWindow
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_webFrame->createWindow(false, true);
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If the client doesn't support multiple windows, just replace the
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // current frame's contents.
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_frame;
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchShow() {
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->view()->invalidate();
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool TreatAsAttachment(const String& content_disposition) {
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Some broken sites just send
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Content-Disposition: ; filename="file"
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // screen those out here.
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith(";"))
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith("inline", false))
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Some broken sites just send
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Content-Disposition: filename="file"
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // without a disposition token... screen those out.
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith("filename", false))
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Also in use is Content-Disposition: name="file"
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith("name", false))
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We have a content-disposition of "attachment" or unknown.
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // RFC 2183, section 2.8 says that an unknown disposition
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // value should be treated as "attachment"
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForMIMEType(FramePolicyFunction func,
4487df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott                                const String& MIMEType, const ResourceRequest& request) {
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(func);
4517df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (!func)
4527df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
4537df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (request.isNull()) {
454035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyIgnore);
4557df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
4567df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    }
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Default to Use (display internally).
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PolicyAction action = PolicyUse;
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check if we should Download instead.
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const ResourceResponse& response = m_frame->loader()->activeDocumentLoader()->response();
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const String& content_disposition = response.httpHeaderField("Content-Disposition");
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!content_disposition.isEmpty()) {
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Server wants to override our normal policy.
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (TreatAsAttachment(content_disposition)) {
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Check to see if we are a sub frame (main frame has no owner element)
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_frame->ownerElement() != 0)
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                action = PolicyIgnore;
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                action = PolicyDownload;
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Ask if it can be handled internally.
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!canShowMIMEType(MIMEType)) {
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Check to see if we are a sub frame (main frame has no owner element)
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_frame->ownerElement() != 0)
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                action = PolicyIgnore;
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                action = PolicyDownload;
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // A status code of 204 indicates no content change. Ignore the result.
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::DocumentLoader* docLoader = m_frame->loader()->activeDocumentLoader();
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (docLoader->response().httpStatusCode() == 204)
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        action = PolicyIgnore;
485035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block    (m_frame->loader()->policyChecker()->*func)(action);
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForNewWindowAction(FramePolicyFunction func,
489b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch                                const NavigationAction& action, const ResourceRequest& request,
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                PassRefPtr<FormState> formState, const String& frameName) {
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4927df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    ASSERT(func);
4937df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (!func)
4947df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
495b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
4967df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (request.isNull()) {
497035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyIgnore);
4987df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
4997df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    }
500b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
501b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch    if (action.type() == NavigationTypeFormSubmitted || action.type() == NavigationTypeFormResubmitted)
502b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch        m_frame->loader()->resetMultipleFormSubmissionProtection();
503b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we get to this point it means that a link has a target that was not
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // found by the frame tree. Instead of creating a new frame, return the
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // current frame in dispatchCreatePage.
5077df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (canHandleRequest(request))
508035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyUse);
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
510035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyIgnore);
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::cancelPolicyCheck() {
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchUnableToImplementPolicy(const ResourceError&) {
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForNavigationAction(FramePolicyFunction func,
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                const NavigationAction& action, const ResourceRequest& request,
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                PassRefPtr<FormState> formState) {
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(func);
5267df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (!func)
5277df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
5287df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (request.isNull()) {
529035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyIgnore);
5307df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
5317df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    }
532b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
533b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch    // Reset multiple form submission protection. If this is a resubmission, we check with the
534b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch    // user and reset the protection if they choose to resubmit the form (see WebCoreFrameBridge.cpp)
535b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch    if (action.type() == NavigationTypeFormSubmitted)
536b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch        m_frame->loader()->resetMultipleFormSubmissionProtection();
537b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (action.type() == NavigationTypeFormResubmitted) {
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->decidePolicyForFormResubmission(func);
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
542035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyUse);
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillSubmitForm(FramePolicyFunction func, PassRefPtr<FormState>) {
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(func);
549035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block    (m_frame->loader()->policyChecker()->*func)(PolicyUse);
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidLoadMainResource(DocumentLoader*) {
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::revertToProvisionalState(DocumentLoader*) {
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setMainDocumentError(DocumentLoader* docLoader, const ResourceError& error) {
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!error.isNull() && error.errorCode() >= InternalErrorLast)
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->reportError(error.errorCode(),
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                error.localizedDescription(), error.failingURL());
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called right before the progress is updated.
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::willChangeEstimatedProgress() {
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called after the progress has been updated. The bad part
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// about this is that when a page is completed, this function is called after
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the progress has been reset to 0.
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didChangeEstimatedProgress() {
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This will give us the initial estimate when the page first starts to load.
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressStartedNotification() {
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->page())
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->setProgress(m_frame->page()->progress()->estimatedProgress());
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This will give us any updated progress including the final progress.
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressEstimateChangedNotification() {
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->page())
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->setProgress(m_frame->page()->progress()->estimatedProgress());
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is just a notification that the progress has finished. Don't call
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// setProgress(1) because postProgressEstimateChangedNotification will do so.
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressFinishedNotification() {
59659d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    WebViewCore* core =  WebViewCore::getWebViewCore(m_frame->view());
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // only need to notify Java for the top frame
59959d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger        core->notifyProgressFinished();
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
60159d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // notify plugins that the frame has loaded
60259d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    core->notifyPluginsOnFrameLoad(m_frame);
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setMainFrameDocumentReady(bool) {
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // this is only interesting once we provide an external API for the DOM
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::startDownload(const ResourceRequest&) {
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::willChangeTitle(DocumentLoader*) {
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didChangeTitle(DocumentLoader* loader) {
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::finishedLoading(DocumentLoader* docLoader) {
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Telling the frame we received some data and passing 0 as the data is our
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // way to get work done that is normally done when the first bit of data is
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // received, even for the case of a document with no data (like about:blank)
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    committedLoad(docLoader, 0, 0);
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
629635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::updateGlobalHistory() {
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
6316689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins
6326689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    DocumentLoader* docLoader = m_frame->loader()->documentLoader();
6336689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    ASSERT(docLoader);
6346689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins
6356689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    // Code copied from FrameLoader.cpp:createHistoryItem
6366689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    // Only add this URL to the database if it is a valid page
6376689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    if (docLoader->unreachableURL().isEmpty()
6386689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins            && docLoader->response().httpStatusCode() < 400) {
6396689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins        m_webFrame->updateVisitedHistory(docLoader->urlForHistory(), false);
64048c46b2d3efc59f2883218d8e713d403b658ff2bPatrick Scott        if (!docLoader->serverRedirectSourceForHistory().isNull())
641e372b0aa0721bf108058f04c43ad1365058369b2Steve Block            m_webFrame->updateVisitedHistory(KURL(ParsedURLString, docLoader->serverRedirectDestinationForHistory()), false);
6426689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    }
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoaderClientAndroid::updateGlobalHistoryRedirectLinks() {
646635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Note, do we need to do anything where there is no HistoryItem? If we call
647635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // updateGlobalHistory(), we will add bunch of "data:xxx" urls for gmail.com
648635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // which is not what we want. Opt to do nothing now.
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::shouldGoToHistoryItem(HistoryItem* item) const {
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // hmmm, seems like we might do a more thoughtful check
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return item != NULL;
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
657b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Blockvoid FrameLoaderClientAndroid::didDisplayInsecureContent()
658b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block{
659b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block    notImplemented();
660b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block}
661b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block
662b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Blockvoid FrameLoaderClientAndroid::didRunInsecureContent(SecurityOrigin*)
663b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block{
664b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block    notImplemented();
665b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block}
666b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::committedLoad(DocumentLoader* loader, const char* data, int length) {
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String encoding = loader->overrideEncoding();
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool userChosen = !encoding.isNull();
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (encoding.isNull())
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        encoding = loader->response().textEncodingName();
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    loader->frameLoader()->setEncoding(encoding, userChosen);
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Document *doc = m_frame->document();
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (doc) {
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        loader->frameLoader()->addData(data, length);
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cancelledError(const ResourceRequest& request) {
681635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorCancelled, request.url(), String());
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cannotShowURLError(const ResourceRequest& request) {
685635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorCannotShowUrl, request.url(), String());
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::interruptForPolicyChangeError(const ResourceRequest& request) {
689635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorInterrupted, request.url(), String());
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cannotShowMIMETypeError(const ResourceResponse& request) {
693635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorCannotShowMimeType, request.url(), String());
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::fileDoesNotExistError(const ResourceResponse& request) {
697635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorFileDoesNotExist, request.url(), String());
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::pluginWillHandleLoadError(const ResourceResponse& request) {
701635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorPluginWillHandleLoadError, request.url(), String());
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::shouldFallBack(const ResourceError&) {
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canHandleRequest(const ResourceRequest& request) const {
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't allow hijacking of intrapage navigation
71259d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    if (WebCore::equalIgnoringFragmentIdentifier(request.url(), m_frame->loader()->url()))
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't allow hijacking of iframe urls that are http or https
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (request.url().protocol().startsWith("http", false) &&
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_frame->tree() && m_frame->tree()->parent())
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
720cb86952d254446a800421b5804f886f8d87cd875Grace Kloba    return m_webFrame->canHandleRequest(request);
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canShowMIMEType(const String& mimeType) const {
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This looks like it has to do with whether or not a type can be
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // shown "internally" (i.e. inside the browser) regardless of whether
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // or not the browser is doing the rendering, e.g. a full page plugin.
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (MIMETypeRegistry::isSupportedImageResourceMIMEType(mimeType) ||
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType) ||
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            MIMETypeRegistry::isSupportedJavaScriptMIMEType(mimeType) ||
730b20ea4938e919d82254b11885220c8564546d1caPatrick Scott            PluginDatabase::installedPlugins()->isMIMETypeRegistered(mimeType) ||
731b20ea4938e919d82254b11885220c8564546d1caPatrick Scott            DOMImplementation::isTextMIMEType(mimeType) ||
732b20ea4938e919d82254b11885220c8564546d1caPatrick Scott            DOMImplementation::isXMLMIMEType(mimeType))
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::representationExistsForURLScheme(const String&) const {
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't use representation
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::generatedMIMETypeForURLScheme(const String& URLScheme) const {
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, copy from Apple's port
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String mimetype("x-apple-web-kit/");
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mimetype.append(URLScheme.lower());
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return mimetype;
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::frameLoadCompleted() {
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // copied from Apple port, without this back with sub-frame will trigger ASSERT
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::saveViewStateToItem(HistoryItem* item) {
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(item);
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We should have added a bridge when the child item was added to its
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // parent.
760be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch    AndroidWebHistoryBridge* bridge = item->bridge();
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(bridge);
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // store the current scale (only) for the top frame
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
764a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view());
765a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        bridge->setScale((int)(webViewCore->scale() * 100));
766a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        bridge->setScreenWidthScale((int)(webViewCore->screenWidthScale() * 100));
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::notifyHistoryItemChanged(item);
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::restoreViewState() {
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view());
77467ed0edeb2ad5bb22ec778472b78d41e7eb3b68aSteve Block    HistoryItem* item = m_frame->loader()->history()->currentItem();
775be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch    AndroidWebHistoryBridge* bridge = item->bridge();
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // restore the scale (only) for the top frame
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
778be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch        int scale = bridge->scale();
779a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        webViewCore->restoreScale(scale);
780be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch        int screenWidthScale = bridge->screenWidthScale();
781a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        if (screenWidthScale != scale)
782a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba            webViewCore->restoreScreenWidthScale(screenWidthScale);
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
786be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdochvoid FrameLoaderClientAndroid::dispatchDidAddBackForwardItem(HistoryItem* item) const {
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->addHistoryItem(item);
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
791be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdochvoid FrameLoaderClientAndroid::dispatchDidRemoveBackForwardItem(HistoryItem* item) const {
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
793be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch    m_webFrame->removeHistoryItem(0);
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
796be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdochvoid FrameLoaderClientAndroid::dispatchDidChangeBackForwardIndex() const {
7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
798be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch    BackForwardList* list = m_frame->page()->backForwardList();
799be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch    ASSERT(list);
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->updateHistoryIndex(list->backListCount());
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::provisionalLoadStarted() {
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->loadStarted(m_frame);
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didFinishLoad() {
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->document()->setExtraLayoutDelay(0);
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->didFinishLoad(m_frame);
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::prepareForDataSourceReplacement() {
8155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    verifiedOk();
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<DocumentLoader> FrameLoaderClientAndroid::createDocumentLoader(
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const ResourceRequest& request, const SubstituteData& data) {
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<DocumentLoader> loader = DocumentLoader::create(request, data);
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return loader.release();
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setTitle(const String& title, const KURL& url) {
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Not needed. dispatchDidReceiveTitle is called immediately after this.
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // url is used to update the Apple port history items.
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::userAgent(const KURL& u) {
8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_webFrame->userAgentForURL(&u);
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8348ec4217018562da37ecf4144e582fa848b807263Grace Klobavoid FrameLoaderClientAndroid::savePlatformDataToCachedFrame(WebCore::CachedFrame* cachedFrame) {
8358ec4217018562da37ecf4144e582fa848b807263Grace Kloba    CachedFramePlatformDataAndroid* platformData = new CachedFramePlatformDataAndroid(m_frame->settings());
8368ec4217018562da37ecf4144e582fa848b807263Grace Kloba    cachedFrame->setCachedFramePlatformData(platformData);
837635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
838635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
8398ec4217018562da37ecf4144e582fa848b807263Grace Klobavoid FrameLoaderClientAndroid::transitionToCommittedFromCachedFrame(WebCore::CachedFrame* cachedFrame) {
8408ec4217018562da37ecf4144e582fa848b807263Grace Kloba    CachedFramePlatformDataAndroid* platformData = reinterpret_cast<CachedFramePlatformDataAndroid*>(cachedFrame->cachedFramePlatformData());
8418ec4217018562da37ecf4144e582fa848b807263Grace Kloba#ifdef ANDROID_META_SUPPORT
8428ec4217018562da37ecf4144e582fa848b807263Grace Kloba   platformData->restoreMetadata(m_frame->settings());
8438ec4217018562da37ecf4144e582fa848b807263Grace Kloba#endif
844ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba   m_webFrame->transitionToCommitted(m_frame);
845635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
846635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
847635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::transitionToCommittedForNewPage() {
848635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(m_frame);
849cb86952d254446a800421b5804f886f8d87cd875Grace Kloba
850cb86952d254446a800421b5804f886f8d87cd875Grace Kloba#ifdef ANDROID_META_SUPPORT
851cb86952d254446a800421b5804f886f8d87cd875Grace Kloba    // reset metadata settings for the main frame as they are not preserved cross page
852cb86952d254446a800421b5804f886f8d87cd875Grace Kloba    if (m_frame == m_frame->page()->mainFrame() && m_frame->settings())
853cb86952d254446a800421b5804f886f8d87cd875Grace Kloba        m_frame->settings()->resetMetadataSettings();
854cb86952d254446a800421b5804f886f8d87cd875Grace Kloba#endif
855cb86952d254446a800421b5804f886f8d87cd875Grace Kloba
8568ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // Save the old WebViewCore before creating a new FrameView. There is one
8578ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // WebViewCore per page. Each frame, including the main frame and sub frame,
8588ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // has a 1:1 FrameView and WebFrameView.
8598ec4217018562da37ecf4144e582fa848b807263Grace Kloba    WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view());
8608ec4217018562da37ecf4144e582fa848b807263Grace Kloba    Retain(webViewCore);
8618ec4217018562da37ecf4144e582fa848b807263Grace Kloba
862ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba    // Save the old WebFrameView's bounds and apply them to the new WebFrameView
8638ec4217018562da37ecf4144e582fa848b807263Grace Kloba    WebFrameView* oldFrameView = static_cast<WebFrameView*> (m_frame->view()->platformWidget());
864ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba    IntRect bounds = oldFrameView->getBounds();
865ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba    IntRect windowBounds = oldFrameView->getWindowBounds();
8668ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // we only support opaque, white background for now
867ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba    m_frame->createView(bounds.size(), Color::white, false, IntSize(), false);
8688ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // Create a new WebFrameView for the new FrameView
8698ec4217018562da37ecf4144e582fa848b807263Grace Kloba    WebFrameView* newFrameView = new WebFrameView(m_frame->view(), webViewCore);
870ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba    newFrameView->setLocation(bounds.x(), bounds.y());
871ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba    newFrameView->setSize(bounds.width(), bounds.height());
872ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba    newFrameView->setWindowBounds(windowBounds.x(), windowBounds.y(), windowBounds.width(), windowBounds.height());
8738ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // newFrameView attaches itself to FrameView which Retains the reference, so
8748ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // call Release for newFrameView
8758ec4217018562da37ecf4144e582fa848b807263Grace Kloba    Release(newFrameView);
8768ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // WebFrameView Retains webViewCore, so call Release for webViewCore
8778ec4217018562da37ecf4144e582fa848b807263Grace Kloba    Release(webViewCore);
878635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
879635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_webFrame->transitionToCommitted(m_frame);
880635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
881635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canCachePage() const {
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::download(ResourceHandle* handle, const ResourceRequest&,
8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                const ResourceRequest&, const ResourceResponse&) {
8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the C++ side of the load listener and tell it to handle the download
88980e68b43c3da64848db8edc7d8e8fe095888e42eAndrei Popescu    handle->getInternal()->m_loader->downloadFile();
8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWTF::PassRefPtr<WebCore::Frame> FrameLoaderClientAndroid::createFrame(const KURL& url, const String& name,
8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        HTMLFrameOwnerElement* ownerElement, const String& referrer,
8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        bool allowsScrolling, int marginWidth, int marginHeight)
8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* parent = ownerElement->document()->frame();
8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameLoaderClientAndroid* loaderC = new FrameLoaderClientAndroid(m_webFrame);
8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<Frame> pFrame = Frame::create(parent->page(), ownerElement, loaderC);
8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* newFrame = pFrame.get();
9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    loaderC->setFrame(newFrame);
9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Append the subframe to the parent and set the name of the subframe. The name must be set after
9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // appending the child so that the name becomes unique.
9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    parent->tree()->appendChild(newFrame);
9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->tree()->setName(name);
9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create a new FrameView and WebFrameView for the child frame to draw into.
9065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    RefPtr<FrameView> frameView = FrameView::create(newFrame);
90759d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    WebFrameView* webFrameView = new WebFrameView(frameView.get(),
9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            WebViewCore::getWebViewCore(parent->view()));
9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // frameView Retains webFrameView, so call Release for webFrameView
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Release(webFrameView);
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Attach the frameView to the newFrame.
9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->setView(frameView);
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->init();
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->selection()->setFocused(true);
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("::WebCore:: createSubFrame returning %p", newFrame);
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The creation of the frame may have run arbitrary JavaScript that removed it from the page already.
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!pFrame->page())
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
92059d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    parent->loader()->loadURLIntoChildFrame(url, referrer, pFrame.get());
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // onLoad may cuase the frame to be removed from the document. Allow the RefPtr to delete the child frame.
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!pFrame->tree()->parent())
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NULL;
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pFrame.release();
9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// YouTube flash url path starts with /v/
9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const char slash_v_slash[] = { '/', 'v', '/' };
9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool isValidYouTubeVideo(const String& path)
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!charactersAreAllASCII(path.characters(), path.length()))
9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned int len = path.length();
9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (len <= sizeof(slash_v_slash)) // check for more than just /v/
9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CString str = path.lower().utf8();
9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* data = str.data();
9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (memcmp(data, slash_v_slash, sizeof(slash_v_slash)) != 0)
9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Start after /v/
9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned int i = sizeof(slash_v_slash); i < len; i++) {
9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        char c = data[i];
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Check for alpha-numeric characters only.
948635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (WTF::isASCIIAlphanumeric(c) || c == '_' || c == '-')
9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The url can have more parameters such as &hl=en after the video id.
9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Once we start seeing extra parameters we can return true.
9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return c == '&' && i > sizeof(slash_v_slash);
9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool isYouTubeUrl(const KURL& url, const String& mimeType)
9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
959635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    String host = url.host();
960635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool youtube = host.endsWith("youtube.com")
961635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            || host.endsWith("youtube-nocookie.com");
962635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return youtube && isValidYouTubeVideo(url.path())
9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            && equalIgnoringCase(mimeType, "application/x-shockwave-flash");
9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9666d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei PopescuWTF::PassRefPtr<Widget> FrameLoaderClientAndroid::createPlugin(
9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const IntSize& size,
9688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HTMLPlugInElement* element,
9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const KURL& url,
9706d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu        const WTF::Vector<String>& names,
9716d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu        const WTF::Vector<String>& values,
9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const String& mimeType,
9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool loadManually) {
9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create an iframe for youtube urls.
9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isYouTubeUrl(url, mimeType)) {
9766d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu        WTF::RefPtr<Frame> frame = createFrame(blankURL(), String(), element,
9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                String(), false, 0, 0);
9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (frame) {
9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // grab everything after /v/
9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String videoId = url.path().substring(sizeof(slash_v_slash));
9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Extract just the video id
9828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unsigned videoIdEnd = 0;
9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (; videoIdEnd < videoId.length(); videoIdEnd++) {
9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (videoId[videoIdEnd] == '&') {
9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    videoId = videoId.left(videoIdEnd);
9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            AssetManager* am = globalAssetManager();
9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Asset* a = am->open("webkit/youtube.html",
9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Asset::ACCESS_BUFFER);
9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!a)
9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return NULL;
9948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String s = String((const char*)a->getBuffer(false), a->getLength());
9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            s = s.replace("VIDEO_ID", videoId);
9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            delete a;
9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            loadDataIntoFrame(frame.get(),
998e372b0aa0721bf108058f04c43ad1365058369b2Steve Block                    KURL(ParsedURLString, "file:///android_asset/webkit/"), String(), s);
9996d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu            // Transfer ownership to a local refptr.
1000deb338ee1849d227ba106f707fb53c0f18b49518Grace Kloba            WTF::RefPtr<Widget> widget(frame->view());
10016d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu            return widget.release();
10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NULL;
10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_PLUGINS
10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return PluginView::create(m_frame,
10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              size,
10088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              element,
10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              url,
10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              names,
10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              values,
10128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              mimeType,
10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              loadManually);
10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NULL;
10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::redirectDataToPlugin(Widget* pluginWidget) {
10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't support plugin yet
10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10246d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei PopescuWTF::PassRefPtr<Widget> FrameLoaderClientAndroid::createJavaAppletWidget(const IntSize&, HTMLAppletElement*,
10258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        const KURL& baseURL, const WTF::Vector<String>& paramNames,
10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        const WTF::Vector<String>& paramValues) {
10278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't support widget yet
10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
10298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
10308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is used by the <OBJECT> element to determine the type of
10338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the contents and work out if it can render it.
10348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectObjectContentType FrameLoaderClientAndroid::objectContentType(const KURL& url,
10358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        const String& mimeType) {
10368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (mimeType.length() == 0)
10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
10388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Guess the mimeType from the extension
10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (url.hasPath())
10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String path = url.path();
10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int lastIndex = path.reverseFind('.');
10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            static const String image("image/");
10448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (lastIndex >= 0)
10458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                String mime(path.substring(lastIndex + 1));
10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                mime.insert(image, 0);
10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (Image::supportsType(mime))
10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return ObjectContentImage;
10508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
10518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return ObjectContentFrame;
10538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1054cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott
10558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (Image::supportsType(mimeType))
10568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return ObjectContentImage;
1057cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott
1058cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott    if (PluginDatabase::installedPlugins()->isMIMETypeRegistered(mimeType))
1059cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott        return ObjectContentOtherPlugin;
1060cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott
1061cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott    if (MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType))
1062cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott        return ObjectContentFrame;
1063cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott
1064cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott    return ObjectContentNone;
10658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function allows the application to set the correct CSS media
10688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// style. Android could use it to set the media style 'handheld'. Safari
10698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// may use it to set the media style to 'print' when the user wants to print
10708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// a particular web page.
10718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::overrideMediaType() const {
10728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
10738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return String();
10748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is used to re-attach Javascript<->native code classes.
1077031c32d25a37eec52b946918d7648750f8e59a1fSteve Blockvoid FrameLoaderClientAndroid::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld* world)
1078031c32d25a37eec52b946918d7648750f8e59a1fSteve Block{
1079031c32d25a37eec52b946918d7648750f8e59a1fSteve Block    if (world != mainThreadNormalWorld())
1080031c32d25a37eec52b946918d7648750f8e59a1fSteve Block        return;
1081031c32d25a37eec52b946918d7648750f8e59a1fSteve Block
10828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
108359d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    LOGV("::WebCore:: windowObjectCleared called on frame %p for %s\n",
10848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    		m_frame, m_frame->loader()->url().string().ascii().data());
10858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->windowObjectCleared(m_frame);
10868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoaderClientAndroid::documentElementAvailable() {
10898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
10908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
10918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Jun-07 tip of tree merge:
10928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::blockedError(ResourceRequest const& request) {
10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ResourceError(String(), InternalErrorFileDoesNotExist, String(), String());
10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Nov-07 tip of tree merge:
10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didPerformFirstNavigation() const {
109859d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // This seems to be just a notification that the UI can listen to, to
109959d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // know if the user has performed first navigation action.
110059d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // It is called from
11018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // void FrameLoader::addBackForwardItemClippedAtTarget(bool doClip)
110259d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // "Navigation" here means a transition from one page to another that
11038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // ends up in the back/forward list.
11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::registerForIconNotification(bool listen) {
11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (listen)
11088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebIconDatabase::RegisterForIconNotification(this);
11098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
11108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebIconDatabase::UnregisterForIconNotification(this);
11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is the WebIconDatabaseClient method for receiving a notification when we
11148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// get the icon for the page.
11158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didAddIconForPageUrl(const String& pageUrl) {
11168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This call must happen before dispatchDidReceiveIcon since that method
11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // may register for icon notifications again since the icon data may have
11188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // to be read from disk.
11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    registerForIconNotification(false);
1120e372b0aa0721bf108058f04c43ad1365058369b2Steve Block    KURL u(ParsedURLString, pageUrl);
11219e2ee40924101fa594b0b31d866f896154b47caaBen Murdoch    if (equalIgnoringFragmentIdentifier(u, m_frame->loader()->url())) {
11228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dispatchDidReceiveIcon();
11238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1125f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott
11268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1127