FrameLoaderClientAndroid.cpp revision 211634993282bd9d5c18b26d70e7909aa4a3cfdc
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright 2007, The Android Open Source Project
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  * Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  * Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
163298a7d84b96ade73c6b170671711a8f2792ae59Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
253298a7d84b96ade73c6b170671711a8f2792ae59Steve Block
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_TAG "WebCore"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
2977dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "FrameLoaderClientAndroid.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3177dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "BackForwardList.h"
328ec4217018562da37ecf4144e582fa848b807263Grace Kloba#include "CachedFrame.h"
338ec4217018562da37ecf4144e582fa848b807263Grace Kloba#include "CachedFramePlatformDataAndroid.h"
345b71639dd156f6224bbb25ed257ac70374641f6bSteve Block#include "Chrome.h"
355b71639dd156f6224bbb25ed257ac70374641f6bSteve Block#include "ChromeClientAndroid.h"
36b20ea4938e919d82254b11885220c8564546d1caPatrick Scott#include "DOMImplementation.h"
3777dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "Document.h"
3877dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "DocumentLoader.h"
3995a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch#include "EditorClientAndroid.h"
40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Frame.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoader.h"
425ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain Merrick#include "FrameNetworkingContextAndroid.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameTree.h"
4477dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "FrameView.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLFrameOwnerElement.h"
478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "HTMLPlugInElement.h"
4877dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "HistoryItem.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IconDatabase.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MIMETypeRegistry.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NotImplemented.h"
523bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen#include "PackageNotifier.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h"
54334e51bc2ff9bf7fc55fa67dc8a6d9257501a32eLeon Scroggins#include "PlatformBridge.h"
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformGraphicsContext.h"
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginDatabase.h"
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginView.h"
59585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch#include "PluginViewBase.h"
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ProgressTracker.h"
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderPart.h"
629dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott#include "RenderView.h"
639dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott#include "RenderWidget.h"
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceError.h"
6577dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "ResourceHandle.h"
6677dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "ResourceHandleInternal.h"
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectionController.h"
6877dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "Settings.h"
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkCanvas.h"
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkRect.h"
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextEncoding.h"
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreFrameBridge.h"
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebCoreResourceLoader.h"
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebHistory.h"
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebIconDatabase.h"
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebFrameView.h"
771f9212cd9a5e957562b12e8c3294b7f357fa1f85Huahui Wu#include "WebViewClientError.h"
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebViewCore.h"
7995a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch#include "autofill/WebAutoFill.h"
8077dd3843724f8ca0ae8084012c79af6ffbaef528Steve Block#include "android_graphics.h"
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <utils/AssetManager.h>
8379768700a853c40c66ff0b0591957958667fdd9eSteve Block#include <wtf/text/CString.h>
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern android::AssetManager* globalAssetManager();
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android {
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const int EXTRA_LAYOUT_DELAY = 1000;
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoaderClientAndroid::FrameLoaderClientAndroid(WebFrame* webframe)
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_frame(NULL)
933e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    , m_webFrame(webframe)
943e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    , m_manualLoader(NULL)
959dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott    , m_hasSentResponseToPlugin(false)
969dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott    , m_onDemandPluginsEnabled(false) {
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Retain(m_webFrame);
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoaderClientAndroid* FrameLoaderClientAndroid::get(const WebCore::Frame* frame)
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<FrameLoaderClientAndroid*> (frame->loader()->client());
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::frameLoaderDestroyed() {
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    registerForIconNotification(false);
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame = 0;
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Release(m_webFrame);
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete this;
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::hasWebView() const {
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME,
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // there is one web view per page, or top frame.
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // as android's view is created from Java side, it is always there.
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::makeRepresentation(DocumentLoader*) {
1209dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott    m_onDemandPluginsEnabled = false;
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't use representation
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::forceLayout() {
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
1278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_frame->view()->forceLayout();
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, should we adjust view size here?
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->view()->adjustViewSize();
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::forceLayoutForNonHTML() {
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setCopiesOnScroll() {
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // this is a hint about whether we need to force redraws, or can
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // just copy the scrolled content. Since we always force a redraw
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // anyways, we can ignore this call.
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::detachedFromParent2() {
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, ready to detach frame from view
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::detachedFromParent3() {
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, ready to release view
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is responsible for associating the "id" with a given
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// subresource load.  The following functions that accept an "id" are
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// called for each subresource, so they should not be dispatched to the m_frame.
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::assignIdentifierToInitialRequest(unsigned long id,
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            DocumentLoader*, const ResourceRequest&) {
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillSendRequest(DocumentLoader*, unsigned long id,
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            ResourceRequest&, const ResourceResponse&) {
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
165635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool FrameLoaderClientAndroid::shouldUseCredentialStorage(DocumentLoader*, unsigned long  identifier)
166635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
168635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return false;
169635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
170635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveAuthenticationChallenge(DocumentLoader*,
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const AuthenticationChallenge&) {
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCancelAuthenticationChallenge(DocumentLoader*,
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const AuthenticationChallenge&) {
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveResponse(DocumentLoader*,
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const ResourceResponse&) {
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveContentLength(DocumentLoader*,
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, int lengthReceived) {
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishLoading(DocumentLoader*,
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id) {
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailLoading(DocumentLoader* docLoader,
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned long id, const ResourceError&) {
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::dispatchDidLoadResourceFromMemoryCache(DocumentLoader*,
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            const ResourceRequest&, const ResourceResponse&, int length) {
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidHandleOnloadEvents() {
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveServerRedirectForProvisionalLoad() {
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Tell the load it was a redirect.
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->loadStarted(m_frame);
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCancelClientRedirect() {
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillPerformClientRedirect(const KURL&,
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                double interval, double fireDate) {
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidChangeLocationWithinPage() {
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2296a011ab807deb276b9924d501a4219542092958cSteve Blockvoid FrameLoaderClientAndroid::dispatchDidPushStateWithinPage()
2306a011ab807deb276b9924d501a4219542092958cSteve Block{
2316a011ab807deb276b9924d501a4219542092958cSteve Block    notImplemented();
2326a011ab807deb276b9924d501a4219542092958cSteve Block}
2336a011ab807deb276b9924d501a4219542092958cSteve Block
2346a011ab807deb276b9924d501a4219542092958cSteve Blockvoid FrameLoaderClientAndroid::dispatchDidReplaceStateWithinPage()
2356a011ab807deb276b9924d501a4219542092958cSteve Block{
2366a011ab807deb276b9924d501a4219542092958cSteve Block    notImplemented();
2376a011ab807deb276b9924d501a4219542092958cSteve Block}
2386a011ab807deb276b9924d501a4219542092958cSteve Block
2396a011ab807deb276b9924d501a4219542092958cSteve Blockvoid FrameLoaderClientAndroid::dispatchDidPopStateWithinPage()
2406a011ab807deb276b9924d501a4219542092958cSteve Block{
2416a011ab807deb276b9924d501a4219542092958cSteve Block    notImplemented();
2426a011ab807deb276b9924d501a4219542092958cSteve Block}
2436a011ab807deb276b9924d501a4219542092958cSteve Block
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillClose() {
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveIcon() {
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->tree() && m_frame->tree()->parent())
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
25245b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    WTF::String url(m_frame->loader()->url().string());
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Try to obtain the icon image.
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::Image* icon = WebCore::iconDatabase()->iconForPageURL(
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            url, WebCore::IntSize(16, 16));
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the request fails, try the original request url.
2575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!icon) {
2585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        DocumentLoader* docLoader = m_frame->loader()->activeDocumentLoader();
2595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        KURL originalURL = docLoader->originalRequest().url();
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        icon = WebCore::iconDatabase()->iconForPageURL(
2615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                   originalURL, WebCore::IntSize(16, 16));
2625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // There is a bug in webkit where cancelling an icon load is treated as a
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // failure. When this is fixed, we can ASSERT again that we have an icon.
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (icon) {
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOGV("Received icon (%p) for %s", icon,
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                url.utf8().data());
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->didReceiveIcon(icon);
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOGV("Icon data for %s unavailable, registering for notification...",
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                url.utf8().data());
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        registerForIconNotification();
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
276c6fbc06882c120f5f51090203775eb0421550d13Patrick Scottvoid FrameLoaderClientAndroid::dispatchDidReceiveTouchIconURL(const String& url, bool precomposed) {
277f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott    ASSERT(m_frame);
278f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott    // Do not report sub frame touch icons
279f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott    if (m_frame->tree() && m_frame->tree()->parent())
280f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott        return;
281c6fbc06882c120f5f51090203775eb0421550d13Patrick Scott    m_webFrame->didReceiveTouchIconURL(url, precomposed);
282f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott}
283f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidStartProvisionalLoad() {
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidReceiveTitle(const String& title) {
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Used to check for FrameLoadTypeStandard but we only want to send the title for
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the top frame and not sub-frames.
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree() || !m_frame->tree()->parent()) {
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->setTitle(title);
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidCommitLoad() {
29895a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch#if ENABLE(WEB_AUTOFILL)
29995a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch    if (m_frame == m_frame->page()->mainFrame()) {
30095a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch        EditorClientAndroid* editorC = static_cast<EditorClientAndroid*>(m_frame->page()->editorClient());
30195a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch        WebAutoFill* autoFill = editorC->getAutoFill();
30295a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch        autoFill->reset();
30395a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch    }
30495a009844dd8e8b8d3d92d7ef14c31bd48468423Ben Murdoch#endif
30546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    verifiedOk();
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void loadDataIntoFrame(Frame* frame, KURL baseUrl, const String& url,
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const String& data) {
310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (baseUrl.isEmpty()) {
311635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        baseUrl = blankURL();
312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
313635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ResourceRequest request(baseUrl);
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CString cstr = data.utf8();
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<WebCore::SharedBuffer> buf = WebCore::SharedBuffer::create(cstr.data(), cstr.length());
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SubstituteData subData(buf, String("text/html"), String("utf-8"),
317635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            KURL(KURL(), url));
318635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    frame->loader()->load(request, subData, false);
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailProvisionalLoad(const ResourceError& error) {
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Ignore ErrorInterrupted since it is due to a policy interruption. This
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // is caused by a decision to download the main resource rather than
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // display it.
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (error.errorCode() == InternalErrorInterrupted
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            || error.errorCode() == InternalErrorCancelled) {
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If we decided to download the main resource or if the user cancelled
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // it, make sure we report that the load is done.
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        didFinishLoad();
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AssetManager* am = globalAssetManager();
33559d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check to see if the error code was not generated internally
337334e51bc2ff9bf7fc55fa67dc8a6d9257501a32eLeon Scroggins    WebCore::PlatformBridge::rawResId id = WebCore::PlatformBridge::NoDomain;
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ((error.errorCode() == ErrorFile ||
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            error.errorCode() == ErrorFileNotFound) &&
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (!error.localizedDescription().isEmpty())) {
341334e51bc2ff9bf7fc55fa67dc8a6d9257501a32eLeon Scroggins        id = WebCore::PlatformBridge::LoadError;
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String filename = m_webFrame->getRawResourceFilename(id);
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (filename.isEmpty())
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Grab the error page from the asset manager
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Asset* a = am->openNonAsset(
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            filename.utf8().data(), Asset::ACCESS_BUFFER);
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!a)
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Take the failing url and encode html entities so javascript urls are not
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // executed.
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CString failingUrl = error.failingURL().utf8();
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WTF::Vector<char> url;
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int len = failingUrl.length();
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* data = failingUrl.data();
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < len; i++) {
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        char c = data[i];
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                || (c >= '0' && c <= '9'))
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            url.append(c);
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            char buf[16];
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int res = sprintf(buf, "&#%d;", c);
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            buf[res] = 0;
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            url.append(buf, res);
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Replace all occurances of %s with the failing url.
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String s = UTF8Encoding().decode((const char*)a->getBuffer(false), a->getLength());
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    s = s.replace("%s", String(url.data(), url.size()));
37559d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Replace all occurances of %e with the error text
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    s = s.replace("%e", error.localizedDescription());
378ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create the request and the substitute data and tell the FrameLoader to
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // load with the replacement data.
381ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project    // use KURL(const char*) as KURL(const String& url) can trigger ASSERT for
382ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project    // invalidate URL string.
383e372b0aa0721bf108058f04c43ad1365058369b2Steve Block    loadDataIntoFrame(m_frame, KURL(ParsedURLString, data), error.failingURL(), s);
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Delete the asset.
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete a;
38785248e3a39ad1010d9df785fc0d82162fe7d2d27Leon Scroggins III
38885248e3a39ad1010d9df785fc0d82162fe7d2d27Leon Scroggins III    // Report that the load is finished, since it failed.
38985248e3a39ad1010d9df785fc0d82162fe7d2d27Leon Scroggins III    didFinishLoad();
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFailLoad(const ResourceError&) {
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // called when page is completed with error
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    didFinishLoad();
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishDocumentLoad() {
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // called when finishedParsing
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFinishLoad() {
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    didFinishLoad();
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFirstLayout() {
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4088b2ec69eaf97dd8a817342ca54044d74da6b4b19Grace Kloba    // set EXTRA_LAYOUT_DELAY if the loader is not completed yet
4098b2ec69eaf97dd8a817342ca54044d74da6b4b19Grace Kloba    if (!m_frame->loader()->isComplete())
4108b2ec69eaf97dd8a817342ca54044d74da6b4b19Grace Kloba        m_frame->document()->setExtraLayoutDelay(EXTRA_LAYOUT_DELAY);
411635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // we need to do this here instead of dispatchDidFirstVisuallyNonEmptyLayout
412635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // so that about:blank will update the screen.
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Only need to notify Java side for the top frame
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebViewCore::getWebViewCore(m_frame->view())->didFirstLayout();
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
419635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidFirstVisuallyNonEmptyLayout()
420635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
421635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
422635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
423635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
424f1f796b0c3a725a520ac41959a0db7855480e9deJohn ReckFrame* FrameLoaderClientAndroid::dispatchCreatePage(const NavigationAction&) {
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_MULTIPLE_WINDOWS
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->settings() && m_frame->settings()->supportMultipleWindows())
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Always a user gesture since window.open maps to
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // ChromeClientAndroid::createWindow
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_webFrame->createWindow(false, true);
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If the client doesn't support multiple windows, just replace the
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // current frame's contents.
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_frame;
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchShow() {
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->view()->invalidate();
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool TreatAsAttachment(const String& content_disposition) {
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Some broken sites just send
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Content-Disposition: ; filename="file"
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // screen those out here.
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith(";"))
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith("inline", false))
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Some broken sites just send
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Content-Disposition: filename="file"
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // without a disposition token... screen those out.
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith("filename", false))
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Also in use is Content-Disposition: name="file"
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (content_disposition.startsWith("name", false))
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We have a content-disposition of "attachment" or unknown.
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // RFC 2183, section 2.8 says that an unknown disposition
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // value should be treated as "attachment"
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForMIMEType(FramePolicyFunction func,
4717df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott                                const String& MIMEType, const ResourceRequest& request) {
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(func);
4747df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (!func)
4757df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
4761e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott
4771e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott    PolicyChecker* policy = m_frame->loader()->policyChecker();
4781e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott
4797df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (request.isNull()) {
4801e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott        (policy->*func)(PolicyIgnore);
4817df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
4827df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    }
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Default to Use (display internally).
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PolicyAction action = PolicyUse;
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check if we should Download instead.
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const ResourceResponse& response = m_frame->loader()->activeDocumentLoader()->response();
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const String& content_disposition = response.httpHeaderField("Content-Disposition");
4881e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott    if (!content_disposition.isEmpty() &&
4891e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott            TreatAsAttachment(content_disposition)) {
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Server wants to override our normal policy.
4911e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott        // Check to see if we are a sub frame (main frame has no owner element)
4921e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott        if (m_frame->ownerElement() != 0)
4931e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott            action = PolicyIgnore;
4941e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott        else
4951e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott            action = PolicyDownload;
4961e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott        (policy->*func)(action);
4971e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott        return;
4981e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott    }
4991e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott
5001e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott    // Ask if it can be handled internally.
5011e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott    if (!canShowMIMEType(MIMEType)) {
5021e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott        // Check to see if we are a sub frame (main frame has no owner element)
5031e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott        if (m_frame->ownerElement() != 0)
5041e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott            action = PolicyIgnore;
5051e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott        else
5061e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott            action = PolicyDownload;
5071e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott        (policy->*func)(action);
5081e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott        return;
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // A status code of 204 indicates no content change. Ignore the result.
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::DocumentLoader* docLoader = m_frame->loader()->activeDocumentLoader();
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (docLoader->response().httpStatusCode() == 204)
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        action = PolicyIgnore;
5141e51c8e2be1aabe013c4595352e2e1edc16ae0dePatrick Scott    (policy->*func)(action);
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForNewWindowAction(FramePolicyFunction func,
518b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch                                const NavigationAction& action, const ResourceRequest& request,
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                PassRefPtr<FormState> formState, const String& frameName) {
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5217df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    ASSERT(func);
5227df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (!func)
5237df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
524b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
5257df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (request.isNull()) {
526035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyIgnore);
5277df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
5287df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    }
529b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
530b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch    if (action.type() == NavigationTypeFormSubmitted || action.type() == NavigationTypeFormResubmitted)
531b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch        m_frame->loader()->resetMultipleFormSubmissionProtection();
532b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we get to this point it means that a link has a target that was not
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // found by the frame tree. Instead of creating a new frame, return the
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // current frame in dispatchCreatePage.
5367df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (canHandleRequest(request))
537035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyUse);
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
539035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyIgnore);
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::cancelPolicyCheck() {
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchUnableToImplementPolicy(const ResourceError&) {
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDecidePolicyForNavigationAction(FramePolicyFunction func,
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                const NavigationAction& action, const ResourceRequest& request,
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                PassRefPtr<FormState> formState) {
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(func);
5557df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (!func)
5567df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
5577df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    if (request.isNull()) {
558035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyIgnore);
5597df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott        return;
5607df3d98b242a15afb526fe8a7c8b0a5d28415f33Patrick Scott    }
561b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
562b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch    // Reset multiple form submission protection. If this is a resubmission, we check with the
563b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch    // user and reset the protection if they choose to resubmit the form (see WebCoreFrameBridge.cpp)
564b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch    if (action.type() == NavigationTypeFormSubmitted)
565b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch        m_frame->loader()->resetMultipleFormSubmissionProtection();
566b3dd806a1bdd3101bd82696ed615e8ffe2091a2eBen Murdoch
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (action.type() == NavigationTypeFormResubmitted) {
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->decidePolicyForFormResubmission(func);
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
570eae4493cc3434169fc14b44b851dac62db492aa5Patrick Scott    } else
571035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block        (m_frame->loader()->policyChecker()->*func)(PolicyUse);
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchWillSubmitForm(FramePolicyFunction func, PassRefPtr<FormState>) {
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(func);
577035acba057f2c7a0f9dbdf27af5c67f80f1614f2Steve Block    (m_frame->loader()->policyChecker()->*func)(PolicyUse);
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::dispatchDidLoadMainResource(DocumentLoader*) {
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::revertToProvisionalState(DocumentLoader*) {
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setMainDocumentError(DocumentLoader* docLoader, const ResourceError& error) {
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
5903e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    if (m_manualLoader) {
5913e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        m_manualLoader->didFail(error);
5923e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        m_manualLoader = NULL;
5933e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        m_hasSentResponseToPlugin = false;
5943e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    } else {
5951f9212cd9a5e957562b12e8c3294b7f357fa1f85Huahui Wu        if (!error.isNull() && error.errorCode() >= InternalErrorLast && error.errorCode() != ERROR_OK)
5963e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott            m_webFrame->reportError(error.errorCode(),
5973e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott                    error.localizedDescription(), error.failingURL());
5983e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    }
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called right before the progress is updated.
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::willChangeEstimatedProgress() {
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is called after the progress has been updated. The bad part
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// about this is that when a page is completed, this function is called after
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the progress has been reset to 0.
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didChangeEstimatedProgress() {
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This will give us the initial estimate when the page first starts to load.
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressStartedNotification() {
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->page())
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->setProgress(m_frame->page()->progress()->estimatedProgress());
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This will give us any updated progress including the final progress.
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressEstimateChangedNotification() {
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frame->page())
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_webFrame->setProgress(m_frame->page()->progress()->estimatedProgress());
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is just a notification that the progress has finished. Don't call
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// setProgress(1) because postProgressEstimateChangedNotification will do so.
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::postProgressFinishedNotification() {
63059d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    WebViewCore* core =  WebViewCore::getWebViewCore(m_frame->view());
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // only need to notify Java for the top frame
63359d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger        core->notifyProgressFinished();
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
63559d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // notify plugins that the frame has loaded
63659d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    core->notifyPluginsOnFrameLoad(m_frame);
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setMainFrameDocumentReady(bool) {
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // this is only interesting once we provide an external API for the DOM
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::startDownload(const ResourceRequest&) {
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::willChangeTitle(DocumentLoader*) {
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didChangeTitle(DocumentLoader* loader) {
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::finishedLoading(DocumentLoader* docLoader) {
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Telling the frame we received some data and passing 0 as the data is our
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // way to get work done that is normally done when the first bit of data is
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // received, even for the case of a document with no data (like about:blank)
6603e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    if (!m_manualLoader) {
6613e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        committedLoad(docLoader, 0, 0);
6623e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        return;
6633e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    }
6643e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott
6653e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    m_manualLoader->didFinishLoading();
6663e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    m_manualLoader = NULL;
6673e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott    m_hasSentResponseToPlugin = false;
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
670635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::updateGlobalHistory() {
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
6726689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins
6736689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    DocumentLoader* docLoader = m_frame->loader()->documentLoader();
6746689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    ASSERT(docLoader);
6756689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins
6766689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    // Code copied from FrameLoader.cpp:createHistoryItem
6776689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    // Only add this URL to the database if it is a valid page
6786689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    if (docLoader->unreachableURL().isEmpty()
6796689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins            && docLoader->response().httpStatusCode() < 400) {
6806689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins        m_webFrame->updateVisitedHistory(docLoader->urlForHistory(), false);
68148c46b2d3efc59f2883218d8e713d403b658ff2bPatrick Scott        if (!docLoader->serverRedirectSourceForHistory().isNull())
682e372b0aa0721bf108058f04c43ad1365058369b2Steve Block            m_webFrame->updateVisitedHistory(KURL(ParsedURLString, docLoader->serverRedirectDestinationForHistory()), false);
6836689e6511b5ef70e71d5496935bd55dda9e3e758Leon Scroggins    }
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoaderClientAndroid::updateGlobalHistoryRedirectLinks() {
687635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Note, do we need to do anything where there is no HistoryItem? If we call
688635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // updateGlobalHistory(), we will add bunch of "data:xxx" urls for gmail.com
689635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // which is not what we want. Opt to do nothing now.
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::shouldGoToHistoryItem(HistoryItem* item) const {
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // hmmm, seems like we might do a more thoughtful check
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return item != NULL;
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
698b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Blockvoid FrameLoaderClientAndroid::didDisplayInsecureContent()
699b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block{
700b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block    notImplemented();
701b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block}
702b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block
703b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Blockvoid FrameLoaderClientAndroid::didRunInsecureContent(SecurityOrigin*)
704b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block{
705b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block    notImplemented();
706b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block}
707b20ad8a215a2ab055647d0a026a8141b4bde7ca2Steve Block
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::committedLoad(DocumentLoader* loader, const char* data, int length) {
7099abe77efade00cb2e8add0327bd1b1a9cbe3af97Steve Block    if (!m_manualLoader)
7109abe77efade00cb2e8add0327bd1b1a9cbe3af97Steve Block        loader->commitData(data, length);
7119abe77efade00cb2e8add0327bd1b1a9cbe3af97Steve Block    else {
7123e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        if (!m_hasSentResponseToPlugin) {
7133e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott            m_manualLoader->didReceiveResponse(loader->response());
7143e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott            // Failure could cause the main document to have an error causing
7153e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott            // the manual loader to be reset.
7163e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott            if (!m_manualLoader)
7173e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott                return;
7183e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott            m_hasSentResponseToPlugin = true;
7193e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        }
7203e4177eb7f1f222c844cea8262cd04d71d2eb547Patrick Scott        m_manualLoader->didReceiveData(data, length);
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cancelledError(const ResourceRequest& request) {
725635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorCancelled, request.url(), String());
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cannotShowURLError(const ResourceRequest& request) {
729635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorCannotShowUrl, request.url(), String());
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::interruptForPolicyChangeError(const ResourceRequest& request) {
733635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorInterrupted, request.url(), String());
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::cannotShowMIMETypeError(const ResourceResponse& request) {
737635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorCannotShowMimeType, request.url(), String());
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::fileDoesNotExistError(const ResourceResponse& request) {
741635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorFileDoesNotExist, request.url(), String());
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::pluginWillHandleLoadError(const ResourceResponse& request) {
745635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ResourceError(String(), InternalErrorPluginWillHandleLoadError, request.url(), String());
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::shouldFallBack(const ResourceError&) {
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canHandleRequest(const ResourceRequest& request) const {
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't allow hijacking of intrapage navigation
75659d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    if (WebCore::equalIgnoringFragmentIdentifier(request.url(), m_frame->loader()->url()))
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't allow hijacking of iframe urls that are http or https
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (request.url().protocol().startsWith("http", false) &&
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_frame->tree() && m_frame->tree()->parent())
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
764cb86952d254446a800421b5804f886f8d87cd875Grace Kloba    return m_webFrame->canHandleRequest(request);
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canShowMIMEType(const String& mimeType) const {
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This looks like it has to do with whether or not a type can be
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // shown "internally" (i.e. inside the browser) regardless of whether
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // or not the browser is doing the rendering, e.g. a full page plugin.
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (MIMETypeRegistry::isSupportedImageResourceMIMEType(mimeType) ||
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType) ||
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            MIMETypeRegistry::isSupportedJavaScriptMIMEType(mimeType) ||
7740981d957132dc87d7cd48ae62a37002cb37c811dGrace Kloba            (m_frame && m_frame->settings()
7750981d957132dc87d7cd48ae62a37002cb37c811dGrace Kloba                    && m_frame->settings()->arePluginsEnabled()
7760981d957132dc87d7cd48ae62a37002cb37c811dGrace Kloba                    && PluginDatabase::installedPlugins()->isMIMETypeRegistered(
7770981d957132dc87d7cd48ae62a37002cb37c811dGrace Kloba                            mimeType)) ||
7785165094157ce50696d79167abc1125fc4b38b545Patrick Scott            (DOMImplementation::isTextMIMEType(mimeType) &&
7795165094157ce50696d79167abc1125fc4b38b545Patrick Scott             !mimeType.startsWith("text/vnd")) ||
780b20ea4938e919d82254b11885220c8564546d1caPatrick Scott            DOMImplementation::isXMLMIMEType(mimeType))
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7858398c067254e66df9f726716f95aee2a0ca7b39aSteve Blockbool FrameLoaderClientAndroid::canShowMIMETypeAsHTML(const String& mimeType) const {
7868398c067254e66df9f726716f95aee2a0ca7b39aSteve Block    return false;
7878398c067254e66df9f726716f95aee2a0ca7b39aSteve Block}
7888398c067254e66df9f726716f95aee2a0ca7b39aSteve Block
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::representationExistsForURLScheme(const String&) const {
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't use representation
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::generatedMIMETypeForURLScheme(const String& URLScheme) const {
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME, copy from Apple's port
7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String mimetype("x-apple-web-kit/");
7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mimetype.append(URLScheme.lower());
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return mimetype;
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::frameLoadCompleted() {
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // copied from Apple port, without this back with sub-frame will trigger ASSERT
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::saveViewStateToItem(HistoryItem* item) {
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(item);
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // store the current scale (only) for the top frame
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
812211634993282bd9d5c18b26d70e7909aa4a3cfdcPatrick Scott        // We should have added a bridge when the child item was added to its
813211634993282bd9d5c18b26d70e7909aa4a3cfdcPatrick Scott        // parent.
814211634993282bd9d5c18b26d70e7909aa4a3cfdcPatrick Scott        AndroidWebHistoryBridge* bridge = item->bridge();
815211634993282bd9d5c18b26d70e7909aa4a3cfdcPatrick Scott        ASSERT(bridge);
816a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view());
817c4683829d0d4932156a97ce14ea15deed71bf21dShimeng (Simon) Wang        bridge->setScale(webViewCore->scale());
818c4683829d0d4932156a97ce14ea15deed71bf21dShimeng (Simon) Wang        bridge->setTextWrapScale(webViewCore->textWrapScale());
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::notifyHistoryItemChanged(item);
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::restoreViewState() {
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view());
82667ed0edeb2ad5bb22ec778472b78d41e7eb3b68aSteve Block    HistoryItem* item = m_frame->loader()->history()->currentItem();
827be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch    AndroidWebHistoryBridge* bridge = item->bridge();
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // restore the scale (only) for the top frame
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_frame->tree()->parent()) {
830c05b3a990126a5a1de357c025e25e6acd4e4e185Grace Kloba        webViewCore->restoreScale(bridge->scale(), bridge->textWrapScale());
8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
834be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdochvoid FrameLoaderClientAndroid::dispatchDidAddBackForwardItem(HistoryItem* item) const {
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->addHistoryItem(item);
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
839be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdochvoid FrameLoaderClientAndroid::dispatchDidRemoveBackForwardItem(HistoryItem* item) const {
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
841be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch    m_webFrame->removeHistoryItem(0);
8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
844be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdochvoid FrameLoaderClientAndroid::dispatchDidChangeBackForwardIndex() const {
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
846be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch    BackForwardList* list = m_frame->page()->backForwardList();
847be33b78f63b17f1b6f5a36a503d797d5f9b941eeBen Murdoch    ASSERT(list);
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->updateHistoryIndex(list->backListCount());
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::provisionalLoadStarted() {
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->loadStarted(m_frame);
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didFinishLoad() {
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame->document()->setExtraLayoutDelay(0);
8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->didFinishLoad(m_frame);
8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::prepareForDataSourceReplacement() {
8635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    verifiedOk();
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<DocumentLoader> FrameLoaderClientAndroid::createDocumentLoader(
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const ResourceRequest& request, const SubstituteData& data) {
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<DocumentLoader> loader = DocumentLoader::create(request, data);
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return loader.release();
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::setTitle(const String& title, const KURL& url) {
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Not needed. dispatchDidReceiveTitle is called immediately after this.
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // url is used to update the Apple port history items.
8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    verifiedOk();
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::userAgent(const KURL& u) {
8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_webFrame->userAgentForURL(&u);
8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8828ec4217018562da37ecf4144e582fa848b807263Grace Klobavoid FrameLoaderClientAndroid::savePlatformDataToCachedFrame(WebCore::CachedFrame* cachedFrame) {
8838ec4217018562da37ecf4144e582fa848b807263Grace Kloba    CachedFramePlatformDataAndroid* platformData = new CachedFramePlatformDataAndroid(m_frame->settings());
8848ec4217018562da37ecf4144e582fa848b807263Grace Kloba    cachedFrame->setCachedFramePlatformData(platformData);
885635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
886635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
8878ec4217018562da37ecf4144e582fa848b807263Grace Klobavoid FrameLoaderClientAndroid::transitionToCommittedFromCachedFrame(WebCore::CachedFrame* cachedFrame) {
8888ec4217018562da37ecf4144e582fa848b807263Grace Kloba    CachedFramePlatformDataAndroid* platformData = reinterpret_cast<CachedFramePlatformDataAndroid*>(cachedFrame->cachedFramePlatformData());
8898ec4217018562da37ecf4144e582fa848b807263Grace Kloba#ifdef ANDROID_META_SUPPORT
8908ec4217018562da37ecf4144e582fa848b807263Grace Kloba   platformData->restoreMetadata(m_frame->settings());
8918ec4217018562da37ecf4144e582fa848b807263Grace Kloba#endif
892ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba   m_webFrame->transitionToCommitted(m_frame);
893635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
894635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
895635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoaderClientAndroid::transitionToCommittedForNewPage() {
896635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(m_frame);
897cb86952d254446a800421b5804f886f8d87cd875Grace Kloba
898cb86952d254446a800421b5804f886f8d87cd875Grace Kloba#ifdef ANDROID_META_SUPPORT
899cb86952d254446a800421b5804f886f8d87cd875Grace Kloba    // reset metadata settings for the main frame as they are not preserved cross page
900cb86952d254446a800421b5804f886f8d87cd875Grace Kloba    if (m_frame == m_frame->page()->mainFrame() && m_frame->settings())
901cb86952d254446a800421b5804f886f8d87cd875Grace Kloba        m_frame->settings()->resetMetadataSettings();
902cb86952d254446a800421b5804f886f8d87cd875Grace Kloba#endif
903cb86952d254446a800421b5804f886f8d87cd875Grace Kloba
9048ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // Save the old WebViewCore before creating a new FrameView. There is one
9058ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // WebViewCore per page. Each frame, including the main frame and sub frame,
9068ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // has a 1:1 FrameView and WebFrameView.
9078ec4217018562da37ecf4144e582fa848b807263Grace Kloba    WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view());
9088ec4217018562da37ecf4144e582fa848b807263Grace Kloba    Retain(webViewCore);
9098ec4217018562da37ecf4144e582fa848b807263Grace Kloba
910ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba    // Save the old WebFrameView's bounds and apply them to the new WebFrameView
911bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen    WebFrameView* oldWebFrameView = static_cast<WebFrameView*> (m_frame->view()->platformWidget());
912bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen    IntRect bounds = oldWebFrameView->getBounds();
91327d79a6495971cad26199bdf5dc79abcb1ff1c9eGrace Kloba    IntRect visBounds = oldWebFrameView->getVisibleBounds();
914bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen    IntRect windowBounds = oldWebFrameView->getWindowBounds();
915bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen    WebCore::FrameView* oldFrameView = oldWebFrameView->view();
916a0e12fbb7d3eec607b7988fb8ff873305583acc4Steve Block    const float oldZoomFactor = oldFrameView->frame()->textZoomFactor();
91727d79a6495971cad26199bdf5dc79abcb1ff1c9eGrace Kloba    m_frame->createView(bounds.size(), oldFrameView->baseBackgroundColor(), oldFrameView->isTransparent(),
91827d79a6495971cad26199bdf5dc79abcb1ff1c9eGrace Kloba            oldFrameView->fixedLayoutSize(), oldFrameView->useFixedLayout());
919a0e12fbb7d3eec607b7988fb8ff873305583acc4Steve Block    if (oldZoomFactor != 1.0f && oldZoomFactor != m_frame->textZoomFactor()) {
920a0e12fbb7d3eec607b7988fb8ff873305583acc4Steve Block        m_frame->setTextZoomFactor(oldZoomFactor);
9215c54c95ab6356ebcbf2ef44a299c3765d97eed6eShimeng (Simon) Wang    }
922bf8327f47de10e9f3d583f226176772f8662b830Kristian Monsen
9238ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // Create a new WebFrameView for the new FrameView
9248ec4217018562da37ecf4144e582fa848b807263Grace Kloba    WebFrameView* newFrameView = new WebFrameView(m_frame->view(), webViewCore);
925ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba    newFrameView->setLocation(bounds.x(), bounds.y());
926ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba    newFrameView->setSize(bounds.width(), bounds.height());
92727d79a6495971cad26199bdf5dc79abcb1ff1c9eGrace Kloba    newFrameView->setVisibleSize(visBounds.width(), visBounds.height());
928ae5392bee4a0f78e4b30aac8c4448025e727df39Grace Kloba    newFrameView->setWindowBounds(windowBounds.x(), windowBounds.y(), windowBounds.width(), windowBounds.height());
9298ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // newFrameView attaches itself to FrameView which Retains the reference, so
9308ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // call Release for newFrameView
9318ec4217018562da37ecf4144e582fa848b807263Grace Kloba    Release(newFrameView);
9328ec4217018562da37ecf4144e582fa848b807263Grace Kloba    // WebFrameView Retains webViewCore, so call Release for webViewCore
9338ec4217018562da37ecf4144e582fa848b807263Grace Kloba    Release(webViewCore);
934635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
935635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_webFrame->transitionToCommitted(m_frame);
936635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
937635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
938f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reckvoid FrameLoaderClientAndroid::dispatchDidBecomeFrameset(bool)
939f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck{
940f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck}
941f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck
9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoaderClientAndroid::canCachePage() const {
9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::download(ResourceHandle* handle, const ResourceRequest&,
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                const ResourceRequest&, const ResourceResponse&) {
9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the C++ side of the load listener and tell it to handle the download
94980e68b43c3da64848db8edc7d8e8fe095888e42eAndrei Popescu    handle->getInternal()->m_loader->downloadFile();
9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWTF::PassRefPtr<WebCore::Frame> FrameLoaderClientAndroid::createFrame(const KURL& url, const String& name,
9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        HTMLFrameOwnerElement* ownerElement, const String& referrer,
9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        bool allowsScrolling, int marginWidth, int marginHeight)
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* parent = ownerElement->document()->frame();
9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameLoaderClientAndroid* loaderC = new FrameLoaderClientAndroid(m_webFrame);
9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<Frame> pFrame = Frame::create(parent->page(), ownerElement, loaderC);
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* newFrame = pFrame.get();
9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    loaderC->setFrame(newFrame);
9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Append the subframe to the parent and set the name of the subframe. The name must be set after
9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // appending the child so that the name becomes unique.
9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    parent->tree()->appendChild(newFrame);
9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->tree()->setName(name);
9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create a new FrameView and WebFrameView for the child frame to draw into.
9665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    RefPtr<FrameView> frameView = FrameView::create(newFrame);
96759d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    WebFrameView* webFrameView = new WebFrameView(frameView.get(),
9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            WebViewCore::getWebViewCore(parent->view()));
9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // frameView Retains webFrameView, so call Release for webFrameView
9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Release(webFrameView);
9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Attach the frameView to the newFrame.
9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->setView(frameView);
9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->init();
9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFrame->selection()->setFocused(true);
9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGV("::WebCore:: createSubFrame returning %p", newFrame);
9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The creation of the frame may have run arbitrary JavaScript that removed it from the page already.
9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!pFrame->page())
9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
98059d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger
9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    parent->loader()->loadURLIntoChildFrame(url, referrer, pFrame.get());
9828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // onLoad may cuase the frame to be removed from the document. Allow the RefPtr to delete the child frame.
9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!pFrame->tree()->parent())
9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NULL;
9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pFrame.release();
9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// YouTube flash url path starts with /v/
9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const char slash_v_slash[] = { '/', 'v', '/' };
992b2743d4d2391f76c75e6ec82f8fdc185d103b43aKristian Monsenstatic const char slash_e_slash[] = { '/', 'e', '/' };
9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool isValidYouTubeVideo(const String& path)
9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!charactersAreAllASCII(path.characters(), path.length()))
9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned int len = path.length();
9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (len <= sizeof(slash_v_slash)) // check for more than just /v/
10008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CString str = path.lower().utf8();
10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* data = str.data();
1003b2743d4d2391f76c75e6ec82f8fdc185d103b43aKristian Monsen    // Youtube flash url can start with /v/ or /e/
10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (memcmp(data, slash_v_slash, sizeof(slash_v_slash)) != 0)
1005b2743d4d2391f76c75e6ec82f8fdc185d103b43aKristian Monsen        if (memcmp(data, slash_e_slash, sizeof(slash_e_slash)) != 0)
1006b2743d4d2391f76c75e6ec82f8fdc185d103b43aKristian Monsen            return false;
10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Start after /v/
10088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned int i = sizeof(slash_v_slash); i < len; i++) {
10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        char c = data[i];
10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Check for alpha-numeric characters only.
1011635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (WTF::isASCIIAlphanumeric(c) || c == '_' || c == '-')
10128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The url can have more parameters such as &hl=en after the video id.
10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Once we start seeing extra parameters we can return true.
10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return c == '&' && i > sizeof(slash_v_slash);
10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool isYouTubeUrl(const KURL& url, const String& mimeType)
10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1022635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    String host = url.host();
1023635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool youtube = host.endsWith("youtube.com")
1024635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            || host.endsWith("youtube-nocookie.com");
1025635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return youtube && isValidYouTubeVideo(url.path())
10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            && equalIgnoringCase(mimeType, "application/x-shockwave-flash");
10278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10293bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsenstatic bool isYouTubeInstalled() {
10303bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen    return WebCore::packageNotifier().isPackageInstalled("com.google.android.youtube");
10313bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen}
10323bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen
1033585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch// Use PluginViewBase rather than an Android specific sub class as we do not require any
1034585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch// Android specific functionality; this just renders a placeholder which will later
1035585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch// activate the real plugin.
1036585ee724ef91cab37349b10b022e608510a7f763Ben Murdochclass PluginToggleWidget : public PluginViewBase {
10378216a0e796895ec6e736aebbeacee9567ae85515Patrick Scottpublic:
10388216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    PluginToggleWidget(Frame* parent, const IntSize& size,
10398216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott            HTMLPlugInElement* elem, const KURL& url,
10408216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott            const WTF::Vector<String>& paramNames,
10418216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott            const WTF::Vector<String>& paramValues, const String& mimeType,
10428216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott            bool loadManually)
1043585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch        : PluginViewBase(0)
1044585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch        , m_parent(parent)
10458216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        , m_size(size)
10468216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        , m_element(elem)
10478216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        , m_url(url)
10488216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        , m_paramNames(paramNames)
10498216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        , m_paramValues(paramValues)
10508216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        , m_mimeType(mimeType)
10518216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        , m_loadManually(loadManually)
10528216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    {
10538216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        resize(size);
10548216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    }
10558216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott
10568216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    virtual void paint(GraphicsContext* ctx, const IntRect& rect)
10578216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    {
10588216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        // Most of this code is copied from PluginView::paintMissingPluginIcon
10598216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        // with slight modification.
10608216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott
10618216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        static RefPtr<Image> image;
10621c95c29b31ed45a394643094162e01796c0c5122Patrick Scott        if (!image) {
10638216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott            image = Image::loadPlatformResource("togglePlugin");
10648216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        }
10658216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott
10668216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        IntRect imageRect(x(), y(), image->width(), image->height());
10678216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott
10688216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        int xOffset = (width() - imageRect.width()) >> 1;
10698216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        int yOffset = (height() - imageRect.height()) >> 1;
10708216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott
10718216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        imageRect.move(xOffset, yOffset);
10728216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott
10738216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        if (!rect.intersects(imageRect))
10748216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott            return;
10758216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott
10768216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        // FIXME: We need to clip similarly to paintMissingPluginIcon but it is
10778216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        // way screwed up right now. It has something to do with how we tell
10788216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        // webkit the scroll position and it causes the placeholder to get
10798216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        // clipped very badly. http://b/issue?id=2533303
10808216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott
10818216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        ctx->save();
10828216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        ctx->clip(frameRect());
10831c95c29b31ed45a394643094162e01796c0c5122Patrick Scott
1084b73606ba44efcb32effeb03603d2eaa402455062Ben Murdoch        ctx->setFillColor(Color::white, ColorSpaceDeviceRGB);
10850e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang        ctx->fillRect(frameRect());
10860e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang        if (frameRect().contains(imageRect)) {
10870e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang            // Leave a 2 pixel padding.
10880e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang            const int pixelWidth = 2;
10890e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang            IntRect innerRect = frameRect();
10900e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang            innerRect.inflate(-pixelWidth);
10910e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang            // Draw a 2 pixel light gray border.
1092b73606ba44efcb32effeb03603d2eaa402455062Ben Murdoch            ctx->setStrokeColor(Color::lightGray, ColorSpaceDeviceRGB);
10930e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang            ctx->strokeRect(innerRect, pixelWidth);
10940e264b005307cf90741d94b1619940fec20da11aShimeng (Simon) Wang        }
10951c95c29b31ed45a394643094162e01796c0c5122Patrick Scott
10961c95c29b31ed45a394643094162e01796c0c5122Patrick Scott        // Draw the image in the center
1097b73606ba44efcb32effeb03603d2eaa402455062Ben Murdoch        ctx->drawImage(image.get(), ColorSpaceDeviceRGB, imageRect.location());
10988216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        ctx->restore();
10998216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    }
11008216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott
11018216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    virtual void handleEvent(Event* event)
11028216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    {
11038216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        if (event->type() != eventNames().clickEvent)
11048216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott            return;
11058216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott
11069dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott        Frame* frame = m_parent->page()->mainFrame();
11079dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott        while (frame) {
11089dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott            RenderView* view = frame->contentRenderer();
11099dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott            const HashSet<RenderWidget*> widgets = view->widgets();
11109dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott            HashSet<RenderWidget*>::const_iterator it = widgets.begin();
11119dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott            HashSet<RenderWidget*>::const_iterator end = widgets.end();
11129dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott            for (; it != end; ++it) {
11139dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott                Widget* widget = (*it)->widget();
11149dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott                // PluginWidget is used only with PluginToggleWidget
1115585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch                if (widget->isPluginViewBase()) {
11169dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott                    PluginToggleWidget* ptw =
11179dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott                            static_cast<PluginToggleWidget*>(widget);
11189dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott                    ptw->swapPlugin(*it);
11199dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott                }
11209dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott            }
11219dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott            frame = frame->tree()->traverseNext();
11229dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott        }
11239dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott    }
11249dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott
11259dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott    void swapPlugin(RenderWidget* renderer) {
11269dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott        typedef FrameLoaderClientAndroid FLCA;
11279dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott        FLCA* client = static_cast<FLCA*>(m_parent->loader()->client());
11289dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott        client->enableOnDemandPlugins();
11298216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        WTF::PassRefPtr<PluginView> prpWidget =
11308216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                PluginView::create(m_parent.get(),
11318216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                                   m_size,
11328216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                                   m_element,
11338216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                                   m_url,
11348216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                                   m_paramNames,
11358216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                                   m_paramValues,
11368216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                                   m_mimeType,
11378216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                                   m_loadManually);
11388216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        RefPtr<Widget> myProtector(this);
11398216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        prpWidget->focusPluginElement();
11408216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        renderer->setWidget(prpWidget);
11418216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    }
11428216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott
11438216a0e796895ec6e736aebbeacee9567ae85515Patrick Scottprivate:
1144585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch    void invalidateRect(const IntRect& rect) { }
1145585ee724ef91cab37349b10b022e608510a7f763Ben Murdoch
11468216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    RefPtr<Frame>       m_parent;
11478216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    IntSize             m_size;
11488216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    HTMLPlugInElement*  m_element;
11498216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    KURL                m_url;
11508216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    WTF::Vector<String> m_paramNames;
11518216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    WTF::Vector<String> m_paramValues;
11528216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    String              m_mimeType;
11538216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    bool                m_loadManually;
11548216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott};
11558216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott
11566d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei PopescuWTF::PassRefPtr<Widget> FrameLoaderClientAndroid::createPlugin(
11578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const IntSize& size,
11588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HTMLPlugInElement* element,
11598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const KURL& url,
11606d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu        const WTF::Vector<String>& names,
11616d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu        const WTF::Vector<String>& values,
11628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const String& mimeType,
11638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool loadManually) {
11648216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    WTF::PassRefPtr<PluginView> prpWidget = 0;
11658216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott#ifdef ANDROID_PLUGINS
11668216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    // This is copied from PluginView.cpp. We need to determine if a plugin
11678216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    // will be found before doing some of the work in PluginView.
11688216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    String mimeTypeCopy = mimeType;
11698216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    PluginPackage* plugin =
11708216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott            PluginDatabase::installedPlugins()->findPlugin(url, mimeTypeCopy);
11718216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    if (!plugin && PluginDatabase::installedPlugins()->refresh()) {
11728216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        mimeTypeCopy = mimeType;
11738216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        plugin = PluginDatabase::installedPlugins()->findPlugin(url,
11748216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                                                                mimeTypeCopy);
11758216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    }
11768216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    Settings* settings = m_frame->settings();
11778216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    // Do the placeholder if plugins are on-demand and there is a plugin for the
11788216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    // given mime type.
11799dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott    if (settings && settings->arePluginsOnDemand() && plugin &&
11809dbbb4da177ba7592aaf8d18fbd85a9525bbb5f7Patrick Scott            !m_onDemandPluginsEnabled) {
11818216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        return adoptRef(new PluginToggleWidget(m_frame, size, element, url,
11828216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                    names, values, mimeType, loadManually));
11838216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    }
11848216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    prpWidget = PluginView::create(m_frame,
11858216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                                   size,
11868216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                                   element,
11878216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                                   url,
11888216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                                   names,
11898216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                                   values,
11908216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                                   mimeType,
11918216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott                                   loadManually);
11928216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    // Return the plugin if it was loaded successfully. Otherwise, fallback to
11938216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    // the youtube placeholder if possible. No need to check prpWidget as
11948216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    // PluginView::create will create a PluginView for missing plugins.
11958216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    // Note: this check really only checks if the plugin was found and not if
11968216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    // the plugin was loaded.
11978216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    if (prpWidget->status() == PluginStatusLoadedSuccessfully)
11988216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott        return prpWidget;
11998216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott#endif
12008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create an iframe for youtube urls.
12013bc49c8c3d13a6745cc535c7e6a57da60bb83a09Kristian Monsen    if (isYouTubeUrl(url, mimeType) && isYouTubeInstalled()) {
12026d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu        WTF::RefPtr<Frame> frame = createFrame(blankURL(), String(), element,
12038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                String(), false, 0, 0);
12048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (frame) {
12058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // grab everything after /v/
12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String videoId = url.path().substring(sizeof(slash_v_slash));
12078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Extract just the video id
12088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unsigned videoIdEnd = 0;
12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (; videoIdEnd < videoId.length(); videoIdEnd++) {
12108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (videoId[videoIdEnd] == '&') {
12118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    videoId = videoId.left(videoIdEnd);
12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
12138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
12148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
12158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            AssetManager* am = globalAssetManager();
12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Asset* a = am->open("webkit/youtube.html",
12178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Asset::ACCESS_BUFFER);
12188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!a)
12198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return NULL;
12208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String s = String((const char*)a->getBuffer(false), a->getLength());
12218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            s = s.replace("VIDEO_ID", videoId);
12228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            delete a;
12238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            loadDataIntoFrame(frame.get(),
1224e372b0aa0721bf108058f04c43ad1365058369b2Steve Block                    KURL(ParsedURLString, "file:///android_asset/webkit/"), String(), s);
12256d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu            // Transfer ownership to a local refptr.
1226deb338ee1849d227ba106f707fb53c0f18b49518Grace Kloba            WTF::RefPtr<Widget> widget(frame->view());
12276d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei Popescu            return widget.release();
12288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
12298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12308216a0e796895ec6e736aebbeacee9567ae85515Patrick Scott    return prpWidget;
12318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::redirectDataToPlugin(Widget* pluginWidget) {
12343d2cfdc4c24631a2b60467b7dd03bb88f10be9b7Patrick Scott    // Do not redirect data if the Widget is our plugin placeholder.
12353d2cfdc4c24631a2b60467b7dd03bb88f10be9b7Patrick Scott    if (pluginWidget->isPluginView()) {
12363d2cfdc4c24631a2b60467b7dd03bb88f10be9b7Patrick Scott        m_manualLoader = static_cast<PluginView*>(pluginWidget);
12373d2cfdc4c24631a2b60467b7dd03bb88f10be9b7Patrick Scott    }
12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12406d289e80ffb2e1dcc0a3bdce9f2bf7fa3263745dAndrei PopescuWTF::PassRefPtr<Widget> FrameLoaderClientAndroid::createJavaAppletWidget(const IntSize&, HTMLAppletElement*,
12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        const KURL& baseURL, const WTF::Vector<String>& paramNames,
12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        const WTF::Vector<String>& paramValues) {
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // don't support widget yet
12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12488f53f0666f20844fa87c63e5f823470c12fc2721Kristian Monsenvoid FrameLoaderClientAndroid::didTransferChildFrameToNewDocument(WebCore::Page*)
12495b71639dd156f6224bbb25ed257ac70374641f6bSteve Block{
12505b71639dd156f6224bbb25ed257ac70374641f6bSteve Block    ASSERT(m_frame);
12518e56126c98940dc57a03335780d4233e8c19b09fSteve Block    // m_webFrame points to the WebFrame for the page that our frame previously
12525b71639dd156f6224bbb25ed257ac70374641f6bSteve Block    // belonged to. If the frame now belongs to a new page, we need to update
12535b71639dd156f6224bbb25ed257ac70374641f6bSteve Block    // m_webFrame to point to the WebFrame for the new page.
12545b71639dd156f6224bbb25ed257ac70374641f6bSteve Block    Page* newPage = m_frame->page();
12555b71639dd156f6224bbb25ed257ac70374641f6bSteve Block    if (newPage != m_webFrame->page()) {
12565b71639dd156f6224bbb25ed257ac70374641f6bSteve Block        ChromeClientAndroid* chromeClient = static_cast<ChromeClientAndroid*>(newPage->chrome()->client());
12575b71639dd156f6224bbb25ed257ac70374641f6bSteve Block        Release(m_webFrame);
12585b71639dd156f6224bbb25ed257ac70374641f6bSteve Block        m_webFrame = chromeClient->webFrame();
12595b71639dd156f6224bbb25ed257ac70374641f6bSteve Block        Retain(m_webFrame);
12605b71639dd156f6224bbb25ed257ac70374641f6bSteve Block    }
12615b71639dd156f6224bbb25ed257ac70374641f6bSteve Block}
12625b71639dd156f6224bbb25ed257ac70374641f6bSteve Block
1263f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reckvoid FrameLoaderClientAndroid::transferLoadingResourceFromPage(unsigned long, DocumentLoader*, const ResourceRequest&, Page*)
1264f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck{
1265f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck    notImplemented();
1266f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck}
1267f1f796b0c3a725a520ac41959a0db7855480e9deJohn Reck
12688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is used by the <OBJECT> element to determine the type of
12698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the contents and work out if it can render it.
12708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectObjectContentType FrameLoaderClientAndroid::objectContentType(const KURL& url,
12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        const String& mimeType) {
12726916255e3bc5760bcaac2ec7d5057e057bd3de6aPatrick Scott    return FrameLoader::defaultObjectContentType(url, mimeType);
12738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function allows the application to set the correct CSS media
12768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// style. Android could use it to set the media style 'handheld'. Safari
12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// may use it to set the media style to 'print' when the user wants to print
12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// a particular web page.
12798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoaderClientAndroid::overrideMediaType() const {
12808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lowPriority_notImplemented();
12818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return String();
12828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is used to re-attach Javascript<->native code classes.
1285031c32d25a37eec52b946918d7648750f8e59a1fSteve Blockvoid FrameLoaderClientAndroid::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld* world)
1286031c32d25a37eec52b946918d7648750f8e59a1fSteve Block{
1287031c32d25a37eec52b946918d7648750f8e59a1fSteve Block    if (world != mainThreadNormalWorld())
1288031c32d25a37eec52b946918d7648750f8e59a1fSteve Block        return;
1289031c32d25a37eec52b946918d7648750f8e59a1fSteve Block
12908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_frame);
129159d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    LOGV("::WebCore:: windowObjectCleared called on frame %p for %s\n",
12928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    		m_frame, m_frame->loader()->url().string().ascii().data());
12938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_webFrame->windowObjectCleared(m_frame);
12948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoaderClientAndroid::documentElementAvailable() {
12978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
12988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
12998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Jun-07 tip of tree merge:
13008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoaderClientAndroid::blockedError(ResourceRequest const& request) {
13018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ResourceError(String(), InternalErrorFileDoesNotExist, String(), String());
13028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// functions new to Nov-07 tip of tree merge:
13058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didPerformFirstNavigation() const {
130659d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // This seems to be just a notification that the UI can listen to, to
130759d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // know if the user has performed first navigation action.
130859d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // It is called from
13098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // void FrameLoader::addBackForwardItemClippedAtTarget(bool doClip)
131059d6f2367e5fd0e25609fed4b5bb77b0c740d677Derek Sollenberger    // "Navigation" here means a transition from one page to another that
13118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // ends up in the back/forward list.
13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::registerForIconNotification(bool listen) {
13158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (listen)
13168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebIconDatabase::RegisterForIconNotification(this);
13178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
13188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebIconDatabase::UnregisterForIconNotification(this);
13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is the WebIconDatabaseClient method for receiving a notification when we
13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// get the icon for the page.
13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoaderClientAndroid::didAddIconForPageUrl(const String& pageUrl) {
13248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This call must happen before dispatchDidReceiveIcon since that method
13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // may register for icon notifications again since the icon data may have
13268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // to be read from disk.
13278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    registerForIconNotification(false);
1328e372b0aa0721bf108058f04c43ad1365058369b2Steve Block    KURL u(ParsedURLString, pageUrl);
13299e2ee40924101fa594b0b31d866f896154b47caaBen Murdoch    if (equalIgnoringFragmentIdentifier(u, m_frame->loader()->url())) {
13308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dispatchDidReceiveIcon();
13318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1333f1c0bbb9bf698154c206e842f94b72d277a96094Patrick Scott
13344c02d6a0244d7e6a7172e1f72aa514c7f68b1ceaBen Murdochvoid FrameLoaderClientAndroid::dispatchDidChangeIcons() {
13354c02d6a0244d7e6a7172e1f72aa514c7f68b1ceaBen Murdoch    notImplemented();
13364c02d6a0244d7e6a7172e1f72aa514c7f68b1ceaBen Murdoch}
13374c02d6a0244d7e6a7172e1f72aa514c7f68b1ceaBen Murdoch
13385ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain MerrickPassRefPtr<FrameNetworkingContext> FrameLoaderClientAndroid::createNetworkingContext()
13395ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain Merrick{
13405ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain Merrick    return FrameNetworkingContextAndroid::create(getFrame());
13415ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain Merrick}
13425ff0cae98f72d38d027120bffdeaa3fe3b5afd57Iain Merrick
13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1344