FrameLoaderClientAndroid.cpp revision 3298a7d84b96ade73c6b170671711a8f2792ae59
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"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DocumentLoader.h"
33b20ea4938e919d82254b11885220c8564546d1caPatrick Scott#include "DOMImplementation.h"
34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Frame.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoader.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoaderClientAndroid.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameTree.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLFrameOwnerElement.h"
408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "HTMLPlugInElement.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IconDatabase.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MIMETypeRegistry.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NotImplemented.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformGraphicsContext.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginDatabase.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginView.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ProgressTracker.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderPart.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceError.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectionController.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkCanvas.h"
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkRect.h"
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextEncoding.h"
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h"
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HistoryItem.h"
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceHandle.h"
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceHandleInternal.h"
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreFrameBridge.h"
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreResourceLoader.h"
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebHistory.h"
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebIconDatabase.h"
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebFrameView.h"
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebViewCore.h"
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h"
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <utils/AssetManager.h>
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern android::AssetManager* globalAssetManager();
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android {
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const int EXTRA_LAYOUT_DELAY = 1000;
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoaderClientAndroid::FrameLoaderClientAndroid(WebFrame* webframe)
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_frame(NULL)
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_webFrame(webframe) {
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Retain(m_webFrame);
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoaderClientAndroid* FrameLoaderClientAndroid::get(const WebCore::Frame* frame)
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<FrameLoaderClientAndroid*> (frame->loader()->client());
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::frameLoaderDestroyed() {
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    registerForIconNotification(false);
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame = 0;
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Release(m_webFrame);
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete this;
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::hasWebView() const {
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME,
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // there is one web view per page, or top frame.
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // as android's view is created from Java side, it is always there.
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::makeRepresentation(DocumentLoader*) {
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't use representation
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::forceLayout() {
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
1098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_frame->view()->forceLayout();
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, should we adjust view size here?
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->view()->adjustViewSize();
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::forceLayoutForNonHTML() {
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setCopiesOnScroll() {
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // this is a hint about whether we need to force redraws, or can
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // just copy the scrolled content. Since we always force a redraw
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // anyways, we can ignore this call.
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::detachedFromParent2() {
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, ready to detach frame from view
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::detachedFromParent3() {
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, ready to release view
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is responsible for associating the "id" with a given
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// subresource load.  The following functions that accept an "id" are
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// called for each subresource, so they should not be dispatched to the m_frame.
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::assignIdentifierToInitialRequest(unsigned long id,
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            DocumentLoader*, const ResourceRequest&) {
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillSendRequest(DocumentLoader*, unsigned long id,
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            ResourceRequest&, const ResourceResponse&) {
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool FrameLoaderClientAndroid::shouldUseCredentialStorage(DocumentLoader*, unsigned long  identifier)
148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
149635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return false;
151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveAuthenticationChallenge(DocumentLoader*,
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const AuthenticationChallenge&) {
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCancelAuthenticationChallenge(DocumentLoader*,
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const AuthenticationChallenge&) {
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveResponse(DocumentLoader*,
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const ResourceResponse&) {
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveContentLength(DocumentLoader*,
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, int lengthReceived) {
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishLoading(DocumentLoader*,
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id) {
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailLoading(DocumentLoader* docLoader,
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const ResourceError&) {
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::dispatchDidLoadResourceFromMemoryCache(DocumentLoader*,
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            const ResourceRequest&, const ResourceResponse&, int length) {
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoaderClientAndroid::dispatchDidLoadResourceByXMLHttpRequest(unsigned long identifier, const ScriptString&) {
1905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return;
1915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
1925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidHandleOnloadEvents() {
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveServerRedirectForProvisionalLoad() {
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Tell the load it was a redirect.
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->loadStarted(m_frame);
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCancelClientRedirect() {
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillPerformClientRedirect(const KURL&,
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                double interval, double fireDate) {
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidChangeLocationWithinPage() {
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillClose() {
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveIcon() {
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->tree() && m_frame->tree()->parent())
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::String url(m_frame->loader()->url().string());
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Try to obtain the icon image.
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::Image* icon = WebCore::iconDatabase()->iconForPageURL(
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            url, WebCore::IntSize(16, 16));
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the request fails, try the original request url.
2285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!icon) {
2295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        DocumentLoader* docLoader = m_frame->loader()->activeDocumentLoader();
2305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        KURL originalURL = docLoader->originalRequest().url();
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        icon = WebCore::iconDatabase()->iconForPageURL(
2325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                   originalURL, WebCore::IntSize(16, 16));
2335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // There is a bug in webkit where cancelling an icon load is treated as a
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // failure. When this is fixed, we can ASSERT again that we have an icon.
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (icon) {
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOGV("Received icon (%p) for %s", icon,
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                url.utf8().data());
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->didReceiveIcon(icon);
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOGV("Icon data for %s unavailable, registering for notification...",
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                url.utf8().data());
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        registerForIconNotification();
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
247c6fbc06882c120f5f51090203775eb0421550d13Patrick Scottvoid FrameLoaderClientAndroid::dispatchDidReceiveTouchIconURL(const String& url, bool precomposed) {
248f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott    ASSERT(m_frame);
249f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott    // Do not report sub frame touch icons
250f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott    if (m_frame->tree() && m_frame->tree()->parent())
251f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott        return;
252c6fbc06882c120f5f51090203775eb0421550d13Patrick Scott    m_webFrame->didReceiveTouchIconURL(url, precomposed);
253f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott}
254f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidStartProvisionalLoad() {
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveTitle(const String& title) {
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Used to check for FrameLoadTypeStandard but we only want to send the title for
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the top frame and not sub-frames.
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree() || !m_frame->tree()->parent()) {
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->setTitle(title);
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCommitLoad() {
26946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    verifiedOk();
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
272635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void loadDataIntoFrame(Frame* frame, KURL baseUrl, const String& url,
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const String& data) {
274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (baseUrl.isEmpty()) {
275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        baseUrl = blankURL();
276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ResourceRequest request(baseUrl);
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CString cstr = data.utf8();
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<WebCore::SharedBuffer> buf = WebCore::SharedBuffer::create(cstr.data(), cstr.length());
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SubstituteData subData(buf, String("text/html"), String("utf-8"),
281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            KURL(KURL(), url));
282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    frame->loader()->load(request, subData, false);
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailProvisionalLoad(const ResourceError& error) {
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Ignore ErrorInterrupted since it is due to a policy interruption. This
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // is caused by a decision to download the main resource rather than
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // display it.
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (error.errorCode() == InternalErrorInterrupted
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            || error.errorCode() == InternalErrorCancelled) {
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If we decided to download the main resource or if the user cancelled
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // it, make sure we report that the load is done.
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        didFinishLoad();
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AssetManager* am = globalAssetManager();
29959d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check to see if the error code was not generated internally
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrame::RAW_RES_ID id = WebFrame::NODOMAIN;
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ((error.errorCode() == ErrorFile ||
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            error.errorCode() == ErrorFileNotFound) &&
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (!error.localizedDescription().isEmpty())) {
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id = WebFrame::LOADERROR;
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String filename = m_webFrame->getRawResourceFilename(id);
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (filename.isEmpty())
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Grab the error page from the asset manager
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Asset* a = am->openNonAsset(
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            filename.utf8().data(), Asset::ACCESS_BUFFER);
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a)
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Take the failing url and encode html entities so javascript urls are not
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // executed.
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CString failingUrl = error.failingURL().utf8();
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WTF::Vector<char> url;
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int len = failingUrl.length();
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* data = failingUrl.data();
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < len; i++) {
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        char c = data[i];
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                || (c >= '0' && c <= '9'))
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            url.append(c);
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            char buf[16];
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int res = sprintf(buf, "&#%d;", c);
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            buf[res] = 0;
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            url.append(buf, res);
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Replace all occurances of %s with the failing url.
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String s = UTF8Encoding().decode((const char*)a->getBuffer(false), a->getLength());
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    s = s.replace("%s", String(url.data(), url.size()));
33959d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Replace all occurances of %e with the error text
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    s = s.replace("%e", error.localizedDescription());
342ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create the request and the substitute data and tell the FrameLoader to
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // load with the replacement data.
345ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project    // use KURL(const char*) as KURL(const String& url) can trigger ASSERT for
346ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project    // invalidate URL string.
347e372b0aa0721bf108058f04c43ad1365058369b2Steve Block    loadDataIntoFrame(m_frame, KURL(ParsedURLString, data), error.failingURL(), s);
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Delete the asset.
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete a;
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailLoad(const ResourceError&) {
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // called when page is completed with error
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    didFinishLoad();
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishDocumentLoad() {
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // called when finishedParsing
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishLoad() {
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    didFinishLoad();
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFirstLayout() {
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->document()->setExtraLayoutDelay(EXTRA_LAYOUT_DELAY);
370635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // we need to do this here instead of dispatchDidFirstVisuallyNonEmptyLayout
371635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // so that about:blank will update the screen.
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Only need to notify Java side for the top frame
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebViewCore::getWebViewCore(m_frame->view())->didFirstLayout();
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
378635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFirstVisuallyNonEmptyLayout()
379635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
380635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
381635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
382635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrame* FrameLoaderClientAndroid::dispatchCreatePage() {
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_MULTIPLE_WINDOWS
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->settings() && m_frame->settings()->supportMultipleWindows())
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Always a user gesture since window.open maps to
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // ChromeClientAndroid::createWindow
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_webFrame->createWindow(false, true);
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If the client doesn't support multiple windows, just replace the
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // current frame's contents.
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_frame;
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchShow() {
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->view()->invalidate();
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool TreatAsAttachment(const String& content_disposition) {
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Some broken sites just send
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Content-Disposition: ; filename="file"
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // screen those out here.
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith(";"))
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith("inline", false))
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Some broken sites just send
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Content-Disposition: filename="file"
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // without a disposition token... screen those out.
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith("filename", false))
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Also in use is Content-Disposition: name="file"
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith("name", false))
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We have a content-disposition of "attachment" or unknown.
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // RFC 2183, section 2.8 says that an unknown disposition
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // value should be treated as "attachment"
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForMIMEType(FramePolicyFunction func,
4307df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott                                const String& MIMEType, const ResourceRequest& request) {
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(func);
4337df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (!func)
4347df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
4357df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (request.isNull()) {
436035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyIgnore);
4377df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
4387df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    }
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Default to Use (display internally).
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PolicyAction action = PolicyUse;
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check if we should Download instead.
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const ResourceResponse& response = m_frame->loader()->activeDocumentLoader()->response();
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const String& content_disposition = response.httpHeaderField("Content-Disposition");
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!content_disposition.isEmpty()) {
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Server wants to override our normal policy.
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (TreatAsAttachment(content_disposition)) {
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Check to see if we are a sub frame (main frame has no owner element)
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_frame->ownerElement() != 0)
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                action = PolicyIgnore;
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                action = PolicyDownload;
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Ask if it can be handled internally.
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!canShowMIMEType(MIMEType)) {
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Check to see if we are a sub frame (main frame has no owner element)
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_frame->ownerElement() != 0)
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                action = PolicyIgnore;
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                action = PolicyDownload;
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // A status code of 204 indicates no content change. Ignore the result.
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::DocumentLoader* docLoader = m_frame->loader()->activeDocumentLoader();
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (docLoader->response().httpStatusCode() == 204)
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        action = PolicyIgnore;
467035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block    (m_frame->loader()->policyChecker()->*func)(action);
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForNewWindowAction(FramePolicyFunction func,
471b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch                                const NavigationAction& action, const ResourceRequest& request,
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                PassRefPtr<FormState> formState, const String& frameName) {
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4747df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    ASSERT(func);
4757df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (!func)
4767df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
477b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
4787df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (request.isNull()) {
479035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyIgnore);
4807df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
4817df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    }
482b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
483b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch    if (action.type() == NavigationTypeFormSubmitted || action.type() == NavigationTypeFormResubmitted)
484b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch        m_frame->loader()->resetMultipleFormSubmissionProtection();
485b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we get to this point it means that a link has a target that was not
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // found by the frame tree. Instead of creating a new frame, return the
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // current frame in dispatchCreatePage.
4897df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (canHandleRequest(request))
490035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyUse);
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
492035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyIgnore);
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::cancelPolicyCheck() {
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchUnableToImplementPolicy(const ResourceError&) {
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForNavigationAction(FramePolicyFunction func,
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                const NavigationAction& action, const ResourceRequest& request,
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                PassRefPtr<FormState> formState) {
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(func);
5087df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (!func)
5097df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
5107df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (request.isNull()) {
511035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyIgnore);
5127df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
5137df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    }
514b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
515b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch    // Reset multiple form submission protection. If this is a resubmission, we check with the
516b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch    // user and reset the protection if they choose to resubmit the form (see WebCoreFrameBridge.cpp)
517b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch    if (action.type() == NavigationTypeFormSubmitted)
518b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch        m_frame->loader()->resetMultipleFormSubmissionProtection();
519b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (action.type() == NavigationTypeFormResubmitted) {
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->decidePolicyForFormResubmission(func);
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
524035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyUse);
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillSubmitForm(FramePolicyFunction func, PassRefPtr<FormState>) {
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(func);
531035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block    (m_frame->loader()->policyChecker()->*func)(PolicyUse);
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidLoadMainResource(DocumentLoader*) {
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::revertToProvisionalState(DocumentLoader*) {
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setMainDocumentError(DocumentLoader* docLoader, const ResourceError& error) {
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!error.isNull() && error.errorCode() >= InternalErrorLast)
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->reportError(error.errorCode(),
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                error.localizedDescription(), error.failingURL());
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called right before the progress is updated.
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::willChangeEstimatedProgress() {
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called after the progress has been updated. The bad part
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// about this is that when a page is completed, this function is called after
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the progress has been reset to 0.
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didChangeEstimatedProgress() {
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This will give us the initial estimate when the page first starts to load.
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressStartedNotification() {
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->page())
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->setProgress(m_frame->page()->progress()->estimatedProgress());
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This will give us any updated progress including the final progress.
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressEstimateChangedNotification() {
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->page())
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->setProgress(m_frame->page()->progress()->estimatedProgress());
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is just a notification that the progress has finished. Don't call
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// setProgress(1) because postProgressEstimateChangedNotification will do so.
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressFinishedNotification() {
57859d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    WebViewCore* core =  WebViewCore::getWebViewCore(m_frame->view());
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // only need to notify Java for the top frame
58159d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger        core->notifyProgressFinished();
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
58359d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // notify plugins that the frame has loaded
58459d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    core->notifyPluginsOnFrameLoad(m_frame);
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setMainFrameDocumentReady(bool) {
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // this is only interesting once we provide an external API for the DOM
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::startDownload(const ResourceRequest&) {
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::willChangeTitle(DocumentLoader*) {
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didChangeTitle(DocumentLoader* loader) {
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::finishedLoading(DocumentLoader* docLoader) {
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Telling the frame we received some data and passing 0 as the data is our
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // way to get work done that is normally done when the first bit of data is
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // received, even for the case of a document with no data (like about:blank)
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    committedLoad(docLoader, 0, 0);
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
611635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::updateGlobalHistory() {
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
6136689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins
6146689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    DocumentLoader* docLoader = m_frame->loader()->documentLoader();
6156689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    ASSERT(docLoader);
6166689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins
6176689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    // Code copied from FrameLoader.cpp:createHistoryItem
6186689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    // Only add this URL to the database if it is a valid page
6196689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    if (docLoader->unreachableURL().isEmpty()
6206689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins            && docLoader->response().httpStatusCode() < 400) {
6216689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins        m_webFrame->updateVisitedHistory(docLoader->urlForHistory(), false);
62248c46b2d3efc59f2883218d8e713d403b658ff2bPatrick Scott        if (!docLoader->serverRedirectSourceForHistory().isNull())
623e372b0aa0721bf108058f04c43ad1365058369b2Steve Block            m_webFrame->updateVisitedHistory(KURL(ParsedURLString, docLoader->serverRedirectDestinationForHistory()), false);
6246689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    }
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoaderClientAndroid::updateGlobalHistoryRedirectLinks() {
628635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Note, do we need to do anything where there is no HistoryItem? If we call
629635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // updateGlobalHistory(), we will add bunch of "data:xxx" urls for gmail.com
630635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // which is not what we want. Opt to do nothing now.
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::shouldGoToHistoryItem(HistoryItem* item) const {
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // hmmm, seems like we might do a more thoughtful check
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return item != NULL;
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
639b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Blockvoid FrameLoaderClientAndroid::didDisplayInsecureContent()
640b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block{
641b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block    notImplemented();
642b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block}
643b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block
644b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Blockvoid FrameLoaderClientAndroid::didRunInsecureContent(SecurityOrigin*)
645b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block{
646b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block    notImplemented();
647b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block}
648b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::committedLoad(DocumentLoader* loader, const char* data, int length) {
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String encoding = loader->overrideEncoding();
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool userChosen = !encoding.isNull();
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (encoding.isNull())
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        encoding = loader->response().textEncodingName();
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    loader->frameLoader()->setEncoding(encoding, userChosen);
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Document *doc = m_frame->document();
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (doc) {
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        loader->frameLoader()->addData(data, length);
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cancelledError(const ResourceRequest& request) {
663635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorCancelled, request.url(), String());
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cannotShowURLError(const ResourceRequest& request) {
667635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorCannotShowUrl, request.url(), String());
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::interruptForPolicyChangeError(const ResourceRequest& request) {
671635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorInterrupted, request.url(), String());
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cannotShowMIMETypeError(const ResourceResponse& request) {
675635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorCannotShowMimeType, request.url(), String());
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::fileDoesNotExistError(const ResourceResponse& request) {
679635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorFileDoesNotExist, request.url(), String());
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::pluginWillHandleLoadError(const ResourceResponse& request) {
683635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorPluginWillHandleLoadError, request.url(), String());
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::shouldFallBack(const ResourceError&) {
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canHandleRequest(const ResourceRequest& request) const {
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't allow hijacking of intrapage navigation
69459d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    if (WebCore::equalIgnoringFragmentIdentifier(request.url(), m_frame->loader()->url()))
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't allow hijacking of iframe urls that are http or https
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (request.url().protocol().startsWith("http", false) &&
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_frame->tree() && m_frame->tree()->parent())
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
702cb86952d254446a800421b5804f886f8d87cd875Grace Kloba    return m_webFrame->canHandleRequest(request);
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canShowMIMEType(const String& mimeType) const {
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This looks like it has to do with whether or not a type can be
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // shown "internally" (i.e. inside the browser) regardless of whether
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // or not the browser is doing the rendering, e.g. a full page plugin.
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (MIMETypeRegistry::isSupportedImageResourceMIMEType(mimeType) ||
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType) ||
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            MIMETypeRegistry::isSupportedJavaScriptMIMEType(mimeType) ||
712b20ea4938e919d82254b11885220c8564546d1caPatrick Scott            PluginDatabase::installedPlugins()->isMIMETypeRegistered(mimeType) ||
713b20ea4938e919d82254b11885220c8564546d1caPatrick Scott            DOMImplementation::isTextMIMEType(mimeType) ||
714b20ea4938e919d82254b11885220c8564546d1caPatrick Scott            DOMImplementation::isXMLMIMEType(mimeType))
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::representationExistsForURLScheme(const String&) const {
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't use representation
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::generatedMIMETypeForURLScheme(const String& URLScheme) const {
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, copy from Apple's port
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String mimetype("x-apple-web-kit/");
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mimetype.append(URLScheme.lower());
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return mimetype;
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::frameLoadCompleted() {
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // copied from Apple port, without this back with sub-frame will trigger ASSERT
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::saveViewStateToItem(HistoryItem* item) {
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_HISTORY_CLIENT
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(item);
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We should have added a bridge when the child item was added to its
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // parent.
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebHistoryItem* bridge = item->bridge();
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(bridge);
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // store the current scale (only) for the top frame
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
747a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view());
748a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        bridge->setScale((int)(webViewCore->scale() * 100));
749a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        bridge->setScreenWidthScale((int)(webViewCore->screenWidthScale() * 100));
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::notifyHistoryItemChanged(item);
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::restoreViewState() {
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_HISTORY_CLIENT
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view());
75967ed0edeb2ad5bb22ec778472b78d41e7eb3b68aSteve Block    HistoryItem* item = m_frame->loader()->history()->currentItem();
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // restore the scale (only) for the top frame
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
762a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        int scale = item->bridge()->scale();
763a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        webViewCore->restoreScale(scale);
764a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        int screenWidthScale = item->bridge()->screenWidthScale();
765a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        if (screenWidthScale != scale)
766a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba            webViewCore->restoreScreenWidthScale(screenWidthScale);
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_HISTORY_CLIENT
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidAddHistoryItem(HistoryItem* item) const {
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->addHistoryItem(item);
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidRemoveHistoryItem(HistoryItem* item, int index) const {
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->removeHistoryItem(index);
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidChangeHistoryIndex(
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BackForwardList* list) const {
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->updateHistoryIndex(list->backListCount());
7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::provisionalLoadStarted() {
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->loadStarted(m_frame);
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didFinishLoad() {
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->document()->setExtraLayoutDelay(0);
7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->didFinishLoad(m_frame);
7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::prepareForDataSourceReplacement() {
8015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    verifiedOk();
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<DocumentLoader> FrameLoaderClientAndroid::createDocumentLoader(
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const ResourceRequest& request, const SubstituteData& data) {
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<DocumentLoader> loader = DocumentLoader::create(request, data);
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return loader.release();
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setTitle(const String& title, const KURL& url) {
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Not needed. dispatchDidReceiveTitle is called immediately after this.
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // url is used to update the Apple port history items.
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::userAgent(const KURL& u) {
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_webFrame->userAgentForURL(&u);
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
820635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::savePlatformDataToCachedFrame(WebCore::CachedFrame*) {
821635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
822635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
823635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
824635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::transitionToCommittedFromCachedFrame(WebCore::CachedFrame*) {
825635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
826635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
827635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
828635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::transitionToCommittedForNewPage() {
829635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(m_frame);
830cb86952d254446a800421b5804f886f8d87cd875Grace Kloba
831cb86952d254446a800421b5804f886f8d87cd875Grace Kloba#ifdef ANDROID_META_SUPPORT
832cb86952d254446a800421b5804f886f8d87cd875Grace Kloba    // reset metadata settings for the main frame as they are not preserved cross page
833cb86952d254446a800421b5804f886f8d87cd875Grace Kloba    if (m_frame == m_frame->page()->mainFrame() && m_frame->settings())
834cb86952d254446a800421b5804f886f8d87cd875Grace Kloba        m_frame->settings()->resetMetadataSettings();
835cb86952d254446a800421b5804f886f8d87cd875Grace Kloba#endif
836cb86952d254446a800421b5804f886f8d87cd875Grace Kloba
837635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (m_frame->settings() && !m_frame->settings()->usesPageCache()) {
838635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_webFrame->transitionToCommitted(m_frame);
839635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
840635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
841635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
842635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Remember the old WebFrameView
843635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    WebFrameView* webFrameView = static_cast<WebFrameView*> (
844635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_frame->view()->platformWidget());
845635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Retain(webFrameView);
846635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
847635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Remove the old FrameView
848635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_frame->setView(NULL);
849635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
850635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Create a new FrameView and associate it with the saved webFrameView
8515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    RefPtr<FrameView> view = FrameView::create(m_frame);
8525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    webFrameView->setView(view.get());
853635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
854635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Release(webFrameView);
855635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
856635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Give the new FrameView to the Frame
857635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_frame->setView(view);
858635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
859635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (m_frame->ownerRenderer())
8605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        m_frame->ownerRenderer()->setWidget(view.get());
861635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
862635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_webFrame->transitionToCommitted(m_frame);
863635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
864635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canCachePage() const {
8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::download(ResourceHandle* handle, const ResourceRequest&,
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                const ResourceRequest&, const ResourceResponse&) {
8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the C++ side of the load listener and tell it to handle the download
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCoreResourceLoader* loader = handle->getInternal()->m_loader;
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    loader->downloadFile();
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWTF::PassRefPtr<WebCore::Frame> FrameLoaderClientAndroid::createFrame(const KURL& url, const String& name,
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        HTMLFrameOwnerElement* ownerElement, const String& referrer,
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        bool allowsScrolling, int marginWidth, int marginHeight)
8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* parent = ownerElement->document()->frame();
8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameLoaderClientAndroid* loaderC = new FrameLoaderClientAndroid(m_webFrame);
8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<Frame> pFrame = Frame::create(parent->page(), ownerElement, loaderC);
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* newFrame = pFrame.get();
8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    loaderC->setFrame(newFrame);
8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Append the subframe to the parent and set the name of the subframe. The name must be set after
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // appending the child so that the name becomes unique.
8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    parent->tree()->appendChild(newFrame);
8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->tree()->setName(name);
8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create a new FrameView and WebFrameView for the child frame to draw into.
8905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    RefPtr<FrameView> frameView = FrameView::create(newFrame);
89159d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    WebFrameView* webFrameView = new WebFrameView(frameView.get(),
8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            WebViewCore::getWebViewCore(parent->view()));
8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // frameView Retains webFrameView, so call Release for webFrameView
8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Release(webFrameView);
8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Attach the frameView to the newFrame.
8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->setView(frameView);
8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->init();
8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->selection()->setFocused(true);
8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("::WebCore:: createSubFrame returning %p", newFrame);
9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The creation of the frame may have run arbitrary JavaScript that removed it from the page already.
9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!pFrame->page())
9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
90459d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger
9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    parent->loader()->loadURLIntoChildFrame(url, referrer, pFrame.get());
9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // onLoad may cuase the frame to be removed from the document. Allow the RefPtr to delete the child frame.
9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!pFrame->tree()->parent())
9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NULL;
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pFrame.release();
9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// YouTube flash url path starts with /v/
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const char slash_v_slash[] = { '/', 'v', '/' };
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool isValidYouTubeVideo(const String& path)
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!charactersAreAllASCII(path.characters(), path.length()))
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned int len = path.length();
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (len <= sizeof(slash_v_slash)) // check for more than just /v/
9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CString str = path.lower().utf8();
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* data = str.data();
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (memcmp(data, slash_v_slash, sizeof(slash_v_slash)) != 0)
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Start after /v/
9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned int i = sizeof(slash_v_slash); i < len; i++) {
9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        char c = data[i];
9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Check for alpha-numeric characters only.
932635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (WTF::isASCIIAlphanumeric(c) || c == '_' || c == '-')
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The url can have more parameters such as &hl=en after the video id.
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Once we start seeing extra parameters we can return true.
9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return c == '&' && i > sizeof(slash_v_slash);
9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool isYouTubeUrl(const KURL& url, const String& mimeType)
9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
943635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    String host = url.host();
944635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool youtube = host.endsWith("youtube.com")
945635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            || host.endsWith("youtube-nocookie.com");
946635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return youtube && isValidYouTubeVideo(url.path())
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            && equalIgnoringCase(mimeType, "application/x-shockwave-flash");
9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9506d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei PopescuWTF::PassRefPtr<Widget> FrameLoaderClientAndroid::createPlugin(
9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const IntSize& size,
9528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HTMLPlugInElement* element,
9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const KURL& url,
9546d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu        const WTF::Vector<String>& names,
9556d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu        const WTF::Vector<String>& values,
9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const String& mimeType,
9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool loadManually) {
9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create an iframe for youtube urls.
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isYouTubeUrl(url, mimeType)) {
9606d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu        WTF::RefPtr<Frame> frame = createFrame(blankURL(), String(), element,
9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                String(), false, 0, 0);
9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (frame) {
9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // grab everything after /v/
9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String videoId = url.path().substring(sizeof(slash_v_slash));
9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Extract just the video id
9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unsigned videoIdEnd = 0;
9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (; videoIdEnd < videoId.length(); videoIdEnd++) {
9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (videoId[videoIdEnd] == '&') {
9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    videoId = videoId.left(videoIdEnd);
9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            AssetManager* am = globalAssetManager();
9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Asset* a = am->open("webkit/youtube.html",
9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Asset::ACCESS_BUFFER);
9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!a)
9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return NULL;
9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String s = String((const char*)a->getBuffer(false), a->getLength());
9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            s = s.replace("VIDEO_ID", videoId);
9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            delete a;
9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            loadDataIntoFrame(frame.get(),
982e372b0aa0721bf108058f04c43ad1365058369b2Steve Block                    KURL(ParsedURLString, "file:///android_asset/webkit/"), String(), s);
9836d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu            // Transfer ownership to a local refptr.
984deb338ee1849d227ba106f707fb53c0f18b49518Grace Kloba            WTF::RefPtr<Widget> widget(frame->view());
9856d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu            return widget.release();
9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NULL;
9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_PLUGINS
9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return PluginView::create(m_frame,
9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              size,
9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              element,
9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              url,
9948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              names,
9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              values,
9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              mimeType,
9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              loadManually);
9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NULL;
10008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::redirectDataToPlugin(Widget* pluginWidget) {
10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't support plugin yet
10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10086d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei PopescuWTF::PassRefPtr<Widget> FrameLoaderClientAndroid::createJavaAppletWidget(const IntSize&, HTMLAppletElement*,
10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        const KURL& baseURL, const WTF::Vector<String>& paramNames,
10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        const WTF::Vector<String>& paramValues) {
10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't support widget yet
10128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is used by the <OBJECT> element to determine the type of
10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the contents and work out if it can render it.
10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectObjectContentType FrameLoaderClientAndroid::objectContentType(const KURL& url,
10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        const String& mimeType) {
10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (mimeType.length() == 0)
10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Guess the mimeType from the extension
10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (url.hasPath())
10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
10258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String path = url.path();
10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int lastIndex = path.reverseFind('.');
10278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            static const String image("image/");
10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (lastIndex >= 0)
10298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
10308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                String mime(path.substring(lastIndex + 1));
10318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                mime.insert(image, 0);
10328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (Image::supportsType(mime))
10338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return ObjectContentImage;
10348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
10358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return ObjectContentFrame;
10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1038cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott
10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (Image::supportsType(mimeType))
10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return ObjectContentImage;
1041cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott
1042cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott    if (PluginDatabase::installedPlugins()->isMIMETypeRegistered(mimeType))
1043cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott        return ObjectContentOtherPlugin;
1044cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott
1045cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott    if (MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType))
1046cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott        return ObjectContentFrame;
1047cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott
1048cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott    return ObjectContentNone;
10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function allows the application to set the correct CSS media
10528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// style. Android could use it to set the media style 'handheld'. Safari
10538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// may use it to set the media style to 'print' when the user wants to print
10548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// a particular web page.
10558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::overrideMediaType() const {
10568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
10578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return String();
10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is used to re-attach Javascript<->native code classes.
10618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::windowObjectCleared() {
10628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
106359d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    LOGV("::WebCore:: windowObjectCleared called on frame %p for %s\n",
10648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    		m_frame, m_frame->loader()->url().string().ascii().data());
10658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->windowObjectCleared(m_frame);
10668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoaderClientAndroid::documentElementAvailable() {
10698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
10708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
10718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Jun-07 tip of tree merge:
10728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::blockedError(ResourceRequest const& request) {
10738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ResourceError(String(), InternalErrorFileDoesNotExist, String(), String());
10748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Nov-07 tip of tree merge:
10778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didPerformFirstNavigation() const {
107859d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // This seems to be just a notification that the UI can listen to, to
107959d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // know if the user has performed first navigation action.
108059d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // It is called from
10818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // void FrameLoader::addBackForwardItemClippedAtTarget(bool doClip)
108259d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // "Navigation" here means a transition from one page to another that
10838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // ends up in the back/forward list.
10848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::registerForIconNotification(bool listen) {
10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (listen)
10888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebIconDatabase::RegisterForIconNotification(this);
10898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebIconDatabase::UnregisterForIconNotification(this);
10918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is the WebIconDatabaseClient method for receiving a notification when we
10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// get the icon for the page.
10958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didAddIconForPageUrl(const String& pageUrl) {
10968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This call must happen before dispatchDidReceiveIcon since that method
10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // may register for icon notifications again since the icon data may have
10988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // to be read from disk.
10998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    registerForIconNotification(false);
1100e372b0aa0721bf108058f04c43ad1365058369b2Steve Block    KURL u(ParsedURLString, pageUrl);
11019e2ee40924101fa594b0b31d866f896154b47caaBen Murdoch    if (equalIgnoringFragmentIdentifier(u, m_frame->loader()->url())) {
11028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dispatchDidReceiveIcon();
11038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1105f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott
11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1107