FrameLoaderClientAndroid.cpp revision 6689e6511b5ef70e71d5496935bd55dda9e3e758
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
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. 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 */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_TAG "WebCore"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "android_graphics.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CString.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DocumentLoader.h"
32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Frame.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoader.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoaderClientAndroid.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameTree.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HTMLFormElement needed for a bad include
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLFormElement.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#ifdef ANDROID_PLUGINS
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Removed.
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginViewBridgeAndroid.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ProgressTracker.h"
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderPart.h"
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceError.h"
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectionController.h"
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkCanvas.h"
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkRect.h"
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextEncoding.h"
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h"
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HistoryItem.h"
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceHandle.h"
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceHandleInternal.h"
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreFrameBridge.h"
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreResourceLoader.h"
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebHistory.h"
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebIconDatabase.h"
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebFrameView.h"
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebViewCore.h"
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h"
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <utils/AssetManager.h>
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern android::AssetManager* globalAssetManager();
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android {
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const int EXTRA_LAYOUT_DELAY = 1000;
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoaderClientAndroid::FrameLoaderClientAndroid(WebFrame* webframe)
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_frame(NULL)
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_webFrame(webframe) {
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Retain(m_webFrame);
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoaderClientAndroid* FrameLoaderClientAndroid::get(const WebCore::Frame* frame)
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<FrameLoaderClientAndroid*> (frame->loader()->client());
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::frameLoaderDestroyed() {
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    registerForIconNotification(false);
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame = 0;
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Release(m_webFrame);
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete this;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::hasWebView() const {
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME,
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // there is one web view per page, or top frame.
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // as android's view is created from Java side, it is always there.
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::makeRepresentation(DocumentLoader*) {
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't use representation
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::forceLayout() {
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
1148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_frame->view()->forceLayout();
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, should we adjust view size here?
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->view()->adjustViewSize();
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::forceLayoutForNonHTML() {
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setCopiesOnScroll() {
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // this is a hint about whether we need to force redraws, or can
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // just copy the scrolled content. Since we always force a redraw
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // anyways, we can ignore this call.
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::detachedFromParent2() {
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, ready to detach frame from view
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::detachedFromParent3() {
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, ready to release view
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is responsible for associating the "id" with a given
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// subresource load.  The following functions that accept an "id" are
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// called for each subresource, so they should not be dispatched to the m_frame.
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::assignIdentifierToInitialRequest(unsigned long id,
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            DocumentLoader*, const ResourceRequest&) {
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillSendRequest(DocumentLoader*, unsigned long id,
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            ResourceRequest&, const ResourceResponse&) {
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool FrameLoaderClientAndroid::shouldUseCredentialStorage(DocumentLoader*, unsigned long  identifier)
153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
154635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return false;
156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
157635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveAuthenticationChallenge(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::dispatchDidCancelAuthenticationChallenge(DocumentLoader*,
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const AuthenticationChallenge&) {
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveResponse(DocumentLoader*,
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const ResourceResponse&) {
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveContentLength(DocumentLoader*,
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, int lengthReceived) {
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishLoading(DocumentLoader*,
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id) {
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailLoading(DocumentLoader* docLoader,
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const ResourceError&) {
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::dispatchDidLoadResourceFromMemoryCache(DocumentLoader*,
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            const ResourceRequest&, const ResourceResponse&, int length) {
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidHandleOnloadEvents() {
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveServerRedirectForProvisionalLoad() {
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Tell the load it was a redirect.
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->loadStarted(m_frame);
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCancelClientRedirect() {
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillPerformClientRedirect(const KURL&,
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                double interval, double fireDate) {
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidChangeLocationWithinPage() {
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillClose() {
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveIcon() {
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->tree() && m_frame->tree()->parent())
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::String url(m_frame->loader()->url().string());
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Try to obtain the icon image.
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::Image* icon = WebCore::iconDatabase()->iconForPageURL(
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            url, WebCore::IntSize(16, 16));
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the request fails, try the original request url.
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!icon)
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        icon = WebCore::iconDatabase()->iconForPageURL(
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_frame->loader()->originalRequestURL().string(),
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                WebCore::IntSize(16, 16));
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // There is a bug in webkit where cancelling an icon load is treated as a
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // failure. When this is fixed, we can ASSERT again that we have an icon.
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (icon) {
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOGV("Received icon (%p) for %s", icon,
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                url.utf8().data());
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->didReceiveIcon(icon);
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOGV("Icon data for %s unavailable, registering for notification...",
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                url.utf8().data());
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        registerForIconNotification();
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidStartProvisionalLoad() {
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveTitle(const String& title) {
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Used to check for FrameLoadTypeStandard but we only want to send the title for
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the top frame and not sub-frames.
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree() || !m_frame->tree()->parent()) {
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->setTitle(title);
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCommitLoad() {
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebViewCore::getWebViewCore(m_frame->view())->updateFrameGeneration(m_frame);
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
264635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void loadDataIntoFrame(Frame* frame, KURL baseUrl, const String& url,
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const String& data) {
266635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (baseUrl.isEmpty()) {
267635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        baseUrl = blankURL();
268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
269635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ResourceRequest request(baseUrl);
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CString cstr = data.utf8();
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<WebCore::SharedBuffer> buf = WebCore::SharedBuffer::create(cstr.data(), cstr.length());
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SubstituteData subData(buf, String("text/html"), String("utf-8"),
273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            KURL(KURL(), url));
274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    frame->loader()->load(request, subData, false);
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailProvisionalLoad(const ResourceError& error) {
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Ignore ErrorInterrupted since it is due to a policy interruption. This
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // is caused by a decision to download the main resource rather than
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // display it.
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (error.errorCode() == InternalErrorInterrupted
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            || error.errorCode() == InternalErrorCancelled) {
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If we decided to download the main resource or if the user cancelled
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // it, make sure we report that the load is done.
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        didFinishLoad();
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AssetManager* am = globalAssetManager();
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check to see if the error code was not generated internally
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrame::RAW_RES_ID id = WebFrame::NODOMAIN;
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ((error.errorCode() == ErrorFile ||
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            error.errorCode() == ErrorFileNotFound) &&
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (!error.localizedDescription().isEmpty())) {
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id = WebFrame::LOADERROR;
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String filename = m_webFrame->getRawResourceFilename(id);
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (filename.isEmpty())
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Grab the error page from the asset manager
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Asset* a = am->openNonAsset(
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            filename.utf8().data(), Asset::ACCESS_BUFFER);
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a)
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Take the failing url and encode html entities so javascript urls are not
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // executed.
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CString failingUrl = error.failingURL().utf8();
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WTF::Vector<char> url;
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int len = failingUrl.length();
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* data = failingUrl.data();
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < len; i++) {
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        char c = data[i];
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                || (c >= '0' && c <= '9'))
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            url.append(c);
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            char buf[16];
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int res = sprintf(buf, "&#%d;", c);
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            buf[res] = 0;
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            url.append(buf, res);
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Replace all occurances of %s with the failing url.
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String s = UTF8Encoding().decode((const char*)a->getBuffer(false), a->getLength());
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    s = s.replace("%s", String(url.data(), url.size()));
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Replace all occurances of %e with the error text
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    s = s.replace("%e", error.localizedDescription());
334ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create the request and the substitute data and tell the FrameLoader to
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // load with the replacement data.
337ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project    // use KURL(const char*) as KURL(const String& url) can trigger ASSERT for
338ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project    // invalidate URL string.
339ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project    loadDataIntoFrame(m_frame, KURL(data), error.failingURL(), s);
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Delete the asset.
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete a;
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailLoad(const ResourceError&) {
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // called when page is completed with error
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    didFinishLoad();
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishDocumentLoad() {
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // called when finishedParsing
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishLoad() {
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    didFinishLoad();
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFirstLayout() {
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->document()->setExtraLayoutDelay(EXTRA_LAYOUT_DELAY);
362635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // we need to do this here instead of dispatchDidFirstVisuallyNonEmptyLayout
363635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // so that about:blank will update the screen.
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Only need to notify Java side for the top frame
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebViewCore::getWebViewCore(m_frame->view())->didFirstLayout();
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
370635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFirstVisuallyNonEmptyLayout()
371635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
372635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
373635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
374635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrame* FrameLoaderClientAndroid::dispatchCreatePage() {
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_MULTIPLE_WINDOWS
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->settings() && m_frame->settings()->supportMultipleWindows())
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Always a user gesture since window.open maps to
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // ChromeClientAndroid::createWindow
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_webFrame->createWindow(false, true);
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If the client doesn't support multiple windows, just replace the
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // current frame's contents.
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_frame;
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchShow() {
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->view()->invalidate();
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool TreatAsAttachment(const String& content_disposition) {
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Some broken sites just send
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Content-Disposition: ; filename="file"
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // screen those out here.
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith(";"))
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith("inline", false))
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Some broken sites just send
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Content-Disposition: filename="file"
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // without a disposition token... screen those out.
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith("filename", false))
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Also in use is Content-Disposition: name="file"
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith("name", false))
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We have a content-disposition of "attachment" or unknown.
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // RFC 2183, section 2.8 says that an unknown disposition
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // value should be treated as "attachment"
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForMIMEType(FramePolicyFunction func,
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                const String& MIMEType, const ResourceRequest&) {
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(func);
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Default to Use (display internally).
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PolicyAction action = PolicyUse;
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check if we should Download instead.
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const ResourceResponse& response = m_frame->loader()->activeDocumentLoader()->response();
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const String& content_disposition = response.httpHeaderField("Content-Disposition");
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!content_disposition.isEmpty()) {
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Server wants to override our normal policy.
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (TreatAsAttachment(content_disposition)) {
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Check to see if we are a sub frame (main frame has no owner element)
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_frame->ownerElement() != 0)
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                action = PolicyIgnore;
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                action = PolicyDownload;
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Ask if it can be handled internally.
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!canShowMIMEType(MIMEType)) {
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Check to see if we are a sub frame (main frame has no owner element)
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_frame->ownerElement() != 0)
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                action = PolicyIgnore;
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                action = PolicyDownload;
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // A status code of 204 indicates no content change. Ignore the result.
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::DocumentLoader* docLoader = m_frame->loader()->activeDocumentLoader();
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (docLoader->response().httpStatusCode() == 204)
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        action = PolicyIgnore;
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    (m_frame->loader()->*func)(action);
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForNewWindowAction(FramePolicyFunction func,
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                const NavigationAction&, const ResourceRequest& req,
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                PassRefPtr<FormState> formState, const String& frameName) {
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we get to this point it means that a link has a target that was not
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // found by the frame tree. Instead of creating a new frame, return the
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // current frame in dispatchCreatePage.
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (canHandleRequest(req))
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (m_frame->loader()->*func)(PolicyUse);
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (m_frame->loader()->*func)(PolicyIgnore);
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::cancelPolicyCheck() {
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchUnableToImplementPolicy(const ResourceError&) {
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForNavigationAction(FramePolicyFunction func,
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                const NavigationAction& action, const ResourceRequest& request,
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                PassRefPtr<FormState> formState) {
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(func);
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (action.type() == NavigationTypeFormResubmitted) {
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->decidePolicyForFormResubmission(func);
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (m_frame->loader()->*func)(PolicyUse);
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillSubmitForm(FramePolicyFunction func, PassRefPtr<FormState>) {
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(func);
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    (m_frame->loader()->*func)(PolicyUse);
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidLoadMainResource(DocumentLoader*) {
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::revertToProvisionalState(DocumentLoader*) {
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setMainDocumentError(DocumentLoader* docLoader, const ResourceError& error) {
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!error.isNull() && error.errorCode() >= InternalErrorLast)
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->reportError(error.errorCode(),
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                error.localizedDescription(), error.failingURL());
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called right before the progress is updated.
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::willChangeEstimatedProgress() {
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called after the progress has been updated. The bad part
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// about this is that when a page is completed, this function is called after
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the progress has been reset to 0.
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didChangeEstimatedProgress() {
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This will give us the initial estimate when the page first starts to load.
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressStartedNotification() {
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->page())
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->setProgress(m_frame->page()->progress()->estimatedProgress());
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This will give us any updated progress including the final progress.
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressEstimateChangedNotification() {
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->page())
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->setProgress(m_frame->page()->progress()->estimatedProgress());
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is just a notification that the progress has finished. Don't call
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// setProgress(1) because postProgressEstimateChangedNotification will do so.
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressFinishedNotification() {
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // only need to notify Java for the top frame
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebViewCore::getWebViewCore(m_frame->view())->notifyProgressFinished();
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setMainFrameDocumentReady(bool) {
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // this is only interesting once we provide an external API for the DOM
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::startDownload(const ResourceRequest&) {
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::willChangeTitle(DocumentLoader*) {
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didChangeTitle(DocumentLoader* loader) {
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::finishedLoading(DocumentLoader* docLoader) {
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Telling the frame we received some data and passing 0 as the data is our
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // way to get work done that is normally done when the first bit of data is
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // received, even for the case of a document with no data (like about:blank)
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    committedLoad(docLoader, 0, 0);
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
570635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::updateGlobalHistory() {
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5726689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins
5736689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    DocumentLoader* docLoader = m_frame->loader()->documentLoader();
5746689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    ASSERT(docLoader);
5756689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins
5766689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    // Code copied from FrameLoader.cpp:createHistoryItem
5776689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    // Only add this URL to the database if it is a valid page
5786689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    if (docLoader->unreachableURL().isEmpty()
5796689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins            && docLoader->response().httpStatusCode() < 400) {
5806689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins        m_webFrame->updateVisitedHistory(docLoader->urlForHistory(), false);
5816689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    }
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoaderClientAndroid::updateGlobalHistoryRedirectLinks() {
585635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Note, do we need to do anything where there is no HistoryItem? If we call
586635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // updateGlobalHistory(), we will add bunch of "data:xxx" urls for gmail.com
587635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // which is not what we want. Opt to do nothing now.
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::shouldGoToHistoryItem(HistoryItem* item) const {
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // hmmm, seems like we might do a more thoughtful check
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return item != NULL;
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::committedLoad(DocumentLoader* loader, const char* data, int length) {
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String encoding = loader->overrideEncoding();
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool userChosen = !encoding.isNull();
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (encoding.isNull())
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        encoding = loader->response().textEncodingName();
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    loader->frameLoader()->setEncoding(encoding, userChosen);
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Document *doc = m_frame->document();
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (doc) {
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        loader->frameLoader()->addData(data, length);
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cancelledError(const ResourceRequest& request) {
610635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorCancelled, request.url(), String());
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cannotShowURLError(const ResourceRequest& request) {
614635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorCannotShowUrl, request.url(), String());
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::interruptForPolicyChangeError(const ResourceRequest& request) {
618635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorInterrupted, request.url(), String());
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cannotShowMIMETypeError(const ResourceResponse& request) {
622635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorCannotShowMimeType, request.url(), String());
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::fileDoesNotExistError(const ResourceResponse& request) {
626635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorFileDoesNotExist, request.url(), String());
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::pluginWillHandleLoadError(const ResourceResponse& request) {
630635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorPluginWillHandleLoadError, request.url(), String());
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::shouldFallBack(const ResourceError&) {
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canHandleRequest(const ResourceRequest& request) const {
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't allow hijacking of intrapage navigation
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (WebCore::equalIgnoringRef(request.url(), m_frame->loader()->url()))
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't allow hijacking of iframe urls that are http or https
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (request.url().protocol().startsWith("http", false) &&
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_frame->tree() && m_frame->tree()->parent())
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_webFrame->canHandleRequest(request)) {
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_META_SUPPORT
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // reset metadata settings for the top frame as they are not preserved cross page
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_frame->tree()->parent() && m_frame->settings())
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_frame->settings()->resetMetadataSettings();
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canShowMIMEType(const String& mimeType) const {
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This looks like it has to do with whether or not a type can be
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // shown "internally" (i.e. inside the browser) regardless of whether
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // or not the browser is doing the rendering, e.g. a full page plugin.
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (MIMETypeRegistry::isSupportedImageResourceMIMEType(mimeType) ||
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType) ||
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            MIMETypeRegistry::isSupportedJavaScriptMIMEType(mimeType) ||
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PluginDatabase::installedPlugins()->isMIMETypeRegistered(mimeType))
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::representationExistsForURLScheme(const String&) const {
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't use representation
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::generatedMIMETypeForURLScheme(const String& URLScheme) const {
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, copy from Apple's port
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String mimetype("x-apple-web-kit/");
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mimetype.append(URLScheme.lower());
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return mimetype;
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::frameLoadCompleted() {
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // copied from Apple port, without this back with sub-frame will trigger ASSERT
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::saveViewStateToItem(HistoryItem* item) {
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_HISTORY_CLIENT
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(item);
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We should have added a bridge when the child item was added to its
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // parent.
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebHistoryItem* bridge = item->bridge();
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(bridge);
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // store the current scale (only) for the top frame
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bridge->setScale(WebViewCore::getWebViewCore(m_frame->view())->scale());
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::notifyHistoryItemChanged(item);
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::restoreViewState() {
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_HISTORY_CLIENT
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view());
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HistoryItem* item = m_frame->loader()->currentHistoryItem();
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // restore the scale (only) for the top frame
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        webViewCore->restoreScale(item->bridge()->scale());
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_HISTORY_CLIENT
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidAddHistoryItem(HistoryItem* item) const {
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->addHistoryItem(item);
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidRemoveHistoryItem(HistoryItem* item, int index) const {
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->removeHistoryItem(index);
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidChangeHistoryIndex(
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BackForwardList* list) const {
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->updateHistoryIndex(list->backListCount());
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::provisionalLoadStarted() {
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->loadStarted(m_frame);
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didFinishLoad() {
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->document()->setExtraLayoutDelay(0);
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->didFinishLoad(m_frame);
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::prepareForDataSourceReplacement() {
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->loader()->detachChildren();
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<DocumentLoader> FrameLoaderClientAndroid::createDocumentLoader(
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const ResourceRequest& request, const SubstituteData& data) {
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<DocumentLoader> loader = DocumentLoader::create(request, data);
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return loader.release();
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setTitle(const String& title, const KURL& url) {
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Not needed. dispatchDidReceiveTitle is called immediately after this.
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // url is used to update the Apple port history items.
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::userAgent(const KURL& u) {
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_webFrame->userAgentForURL(&u);
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::savePlatformDataToCachedFrame(WebCore::CachedFrame*) {
769635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
770635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
771635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
772635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::transitionToCommittedFromCachedFrame(WebCore::CachedFrame*) {
773635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
774635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
775635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
776635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::transitionToCommittedForNewPage() {
777635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(m_frame);
778635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (m_frame->settings() && !m_frame->settings()->usesPageCache()) {
779635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_webFrame->transitionToCommitted(m_frame);
780635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
781635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
782635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
783635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Remember the old WebFrameView
784635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    WebFrameView* webFrameView = static_cast<WebFrameView*> (
785635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_frame->view()->platformWidget());
786635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Retain(webFrameView);
787635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
788635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Remove the old FrameView
789635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_frame->setView(NULL);
790635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
791635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Create a new FrameView and associate it with the saved webFrameView
792635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    FrameView* view = new FrameView(m_frame);
793635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    webFrameView->setView(view);
794635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
795635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Release(webFrameView);
796635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
797635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Give the new FrameView to the Frame
798635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_frame->setView(view);
799635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
800635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Deref since FrameViews are created with a ref of 1
801635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    view->deref();
802635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
803635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (m_frame->ownerRenderer())
804635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_frame->ownerRenderer()->setWidget(view);
805635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
806635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_frame->view()->initScrollbars();
807635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
808635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_webFrame->transitionToCommitted(m_frame);
809635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
810635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canCachePage() const {
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::download(ResourceHandle* handle, const ResourceRequest&,
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                const ResourceRequest&, const ResourceResponse&) {
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the C++ side of the load listener and tell it to handle the download
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCoreResourceLoader* loader = handle->getInternal()->m_loader;
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    loader->downloadFile();
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWTF::PassRefPtr<WebCore::Frame> FrameLoaderClientAndroid::createFrame(const KURL& url, const String& name,
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        HTMLFrameOwnerElement* ownerElement, const String& referrer,
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        bool allowsScrolling, int marginWidth, int marginHeight)
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* parent = ownerElement->document()->frame();
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameLoaderClientAndroid* loaderC = new FrameLoaderClientAndroid(m_webFrame);
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<Frame> pFrame = Frame::create(parent->page(), ownerElement, loaderC);
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* newFrame = pFrame.get();
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    loaderC->setFrame(newFrame);
8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Append the subframe to the parent and set the name of the subframe. The name must be set after
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // appending the child so that the name becomes unique.
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    parent->tree()->appendChild(newFrame);
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->tree()->setName(name);
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create a new FrameView and WebFrameView for the child frame to draw into.
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameView* frameView = new WebCore::FrameView(newFrame);
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrameView* webFrameView = new WebFrameView(frameView,
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            WebViewCore::getWebViewCore(parent->view()));
8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // frameView Retains webFrameView, so call Release for webFrameView
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Release(webFrameView);
8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Attach the frameView to the newFrame.
8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->setView(frameView);
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // setView() refs the frameView so call deref on the frameView
8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    frameView->deref();
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->init();
8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->selection()->setFocused(true);
8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("::WebCore:: createSubFrame returning %p", newFrame);
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The creation of the frame may have run arbitrary JavaScript that removed it from the page already.
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!pFrame->page())
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    parent->loader()->loadURLIntoChildFrame(url, referrer, pFrame.get());
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // onLoad may cuase the frame to be removed from the document. Allow the RefPtr to delete the child frame.
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!pFrame->tree()->parent())
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NULL;
8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pFrame.release();
8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// YouTube flash url path starts with /v/
8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const char slash_v_slash[] = { '/', 'v', '/' };
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool isValidYouTubeVideo(const String& path)
8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!charactersAreAllASCII(path.characters(), path.length()))
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned int len = path.length();
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (len <= sizeof(slash_v_slash)) // check for more than just /v/
8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CString str = path.lower().utf8();
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* data = str.data();
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (memcmp(data, slash_v_slash, sizeof(slash_v_slash)) != 0)
8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Start after /v/
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned int i = sizeof(slash_v_slash); i < len; i++) {
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        char c = data[i];
8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Check for alpha-numeric characters only.
880635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (WTF::isASCIIAlphanumeric(c) || c == '_' || c == '-')
8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The url can have more parameters such as &hl=en after the video id.
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Once we start seeing extra parameters we can return true.
8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return c == '&' && i > sizeof(slash_v_slash);
8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool isYouTubeUrl(const KURL& url, const String& mimeType)
8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
891635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    String host = url.host();
892635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool youtube = host.endsWith("youtube.com")
893635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            || host.endsWith("youtube-nocookie.com");
894635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return youtube && isValidYouTubeVideo(url.path())
8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            && equalIgnoringCase(mimeType, "application/x-shockwave-flash");
8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWidget* FrameLoaderClientAndroid::createPlugin(
8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const IntSize& size,
9008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HTMLPlugInElement* element,
9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const KURL& url,
9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const WTF::Vector<String, 0u>& names,
9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const WTF::Vector<String, 0u>& values,
9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const String& mimeType,
9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool loadManually) {
9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create an iframe for youtube urls.
9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isYouTubeUrl(url, mimeType)) {
9088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        RefPtr<Frame> frame = createFrame(blankURL(), String(), element,
9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                String(), false, 0, 0);
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (frame) {
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // grab everything after /v/
9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String videoId = url.path().substring(sizeof(slash_v_slash));
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Extract just the video id
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unsigned videoIdEnd = 0;
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (; videoIdEnd < videoId.length(); videoIdEnd++) {
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (videoId[videoIdEnd] == '&') {
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    videoId = videoId.left(videoIdEnd);
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            AssetManager* am = globalAssetManager();
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Asset* a = am->open("webkit/youtube.html",
9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Asset::ACCESS_BUFFER);
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!a)
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return NULL;
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String s = String((const char*)a->getBuffer(false), a->getLength());
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            s = s.replace("VIDEO_ID", videoId);
9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            delete a;
9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            loadDataIntoFrame(frame.get(),
930635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    KURL("file:///android_asset/webkit/"), String(), s);
9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return frame->view();
9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NULL;
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_PLUGINS
9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return PluginView::create(m_frame,
9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              size,
9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              element,
9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              url,
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              names,
9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              values,
9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              mimeType,
9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              loadManually);
9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NULL;
9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::redirectDataToPlugin(Widget* pluginWidget) {
9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't support plugin yet
9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianWidget* FrameLoaderClientAndroid::createJavaAppletWidget(const IntSize&, HTMLAppletElement*,
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        const KURL& baseURL, const WTF::Vector<String>& paramNames,
9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        const WTF::Vector<String>& paramValues) {
9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't support widget yet
9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is used by the <OBJECT> element to determine the type of
9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the contents and work out if it can render it.
9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectObjectContentType FrameLoaderClientAndroid::objectContentType(const KURL& url,
9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        const String& mimeType) {
9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (mimeType.length() == 0)
9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Guess the mimeType from the extension
9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (url.hasPath())
9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String path = url.path();
9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int lastIndex = path.reverseFind('.');
9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            static const String image("image/");
9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (lastIndex >= 0)
9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                String mime(path.substring(lastIndex + 1));
9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                mime.insert(image, 0);
9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (Image::supportsType(mime))
9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return ObjectContentImage;
9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
9828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return ObjectContentFrame;
9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
984cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott
9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (Image::supportsType(mimeType))
9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return ObjectContentImage;
987cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott
988cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott    if (PluginDatabase::installedPlugins()->isMIMETypeRegistered(mimeType))
989cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott        return ObjectContentOtherPlugin;
990cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott
991cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott    if (MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType))
992cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott        return ObjectContentFrame;
993cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott
994cfeaf82a9a355ac3a44601ef00cd31b58aff9355Patrick Scott    return ObjectContentNone;
9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function allows the application to set the correct CSS media
9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// style. Android could use it to set the media style 'handheld'. Safari
9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// may use it to set the media style to 'print' when the user wants to print
10008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// a particular web page.
10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::overrideMediaType() const {
10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
10038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return String();
10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is used to re-attach Javascript<->native code classes.
10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::windowObjectCleared() {
10088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("::WebCore:: windowObjectCleared called on frame %p for %s\n",
10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    		m_frame, m_frame->loader()->url().string().ascii().data());
10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->windowObjectCleared(m_frame);
10128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoaderClientAndroid::documentElementAvailable() {
10158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
10168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Jun-07 tip of tree merge:
10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::blockedError(ResourceRequest const& request) {
10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ResourceError(String(), InternalErrorFileDoesNotExist, String(), String());
10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Nov-07 tip of tree merge:
10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didPerformFirstNavigation() const {
10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This seems to be just a notification that the UI can listen to, to
10258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // know if the user has performed first navigation action.
10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // It is called from
10278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // void FrameLoader::addBackForwardItemClippedAtTarget(bool doClip)
10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // "Navigation" here means a transition from one page to another that
10298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // ends up in the back/forward list.
10308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::registerForIconNotification(bool listen) {
10338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (listen)
10348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebIconDatabase::RegisterForIconNotification(this);
10358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
10368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebIconDatabase::UnregisterForIconNotification(this);
10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is the WebIconDatabaseClient method for receiving a notification when we
10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// get the icon for the page.
10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didAddIconForPageUrl(const String& pageUrl) {
10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This call must happen before dispatchDidReceiveIcon since that method
10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // may register for icon notifications again since the icon data may have
10448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // to be read from disk.
10458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    registerForIconNotification(false);
10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    KURL u(pageUrl);
10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (equalIgnoringRef(u, m_frame->loader()->url())) {
10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dispatchDidReceiveIcon();
10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1052