18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All Rights Reserved.
3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h"
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "BackForwardController.h"
24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "BackForwardList.h"
25231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "Base64.h"
265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "CSSStyleSelector.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Chrome.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ChromeClient.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ContextMenuClient.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ContextMenuController.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DOMWindow.h"
32a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "DeviceMotionController.h"
33e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "DeviceOrientationController.h"
34cad810f21b803229eb11403f9209855525a25d57Steve Block#include "DocumentMarkerController.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DragController.h"
365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "EditorClient.h"
37231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "Event.h"
38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "EventNames.h"
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ExceptionCode.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FileSystem.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FocusController.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoader.h"
440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "FrameLoaderClient.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameTree.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h"
475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "HTMLElement.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HistoryItem.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "InspectorController.h"
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InspectorInstrumentation.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Logging.h"
52692e5dbf12901edacf14812a6fae25462920af42Steve Block#include "MediaCanStartListener.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Navigator.h"
545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "NetworkStateNotifier.h"
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PageGroup.h"
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginData.h"
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "PluginHalter.h"
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "PluginView.h"
59a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "PluginViewBase.h"
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ProgressTracker.h"
610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "RenderTheme.h"
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "RenderWidget.h"
63967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "RuntimeEnabledFeatures.h"
645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "ScriptController.h"
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectionController.h"
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h"
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "SharedBuffer.h"
680617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "SpeechInput.h"
69967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "SpeechInputClient.h"
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextResourceDecoder.h"
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Widget.h"
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/HashMap.h>
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/RefCountedLeakCounter.h>
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/StdLibExtras.h>
75f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/text/StringHash.h>
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
77a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if ENABLE(ACCELERATED_2D_CANVAS)
78a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "SharedGraphicsContext3D.h"
79a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif
80a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DOM_STORAGE)
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "StorageArea.h"
830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "StorageNamespace.h"
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
86635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML)
87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLPageState.h"
88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
90370b559b082915acb99b185ed8c8e317fc654db6Steve Block#if ENABLE(CLIENT_BASED_GEOLOCATION)
91370b559b082915acb99b185ed8c8e317fc654db6Steve Block#include "GeolocationController.h"
92370b559b082915acb99b185ed8c8e317fc654db6Steve Block#endif
93370b559b082915acb99b185ed8c8e317fc654db6Steve Block
9429a61d852e0ccad2dbbc64aadf491685cae3ca7dLeon Clarke#if PLATFORM(ANDROID) && ENABLE(APPLICATION_INSTALLED)
9529a61d852e0ccad2dbbc64aadf491685cae3ca7dLeon Clarke#include "PackageNotifier.h"
969fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu#endif
979fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic HashSet<Page*>* allPages;
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic WTF::RefCountedLeakCounter pageCounter("Page");
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void networkStateChanged()
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<RefPtr<Frame> > frames;
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get all the frames of all the pages in all the page groups
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HashSet<Page*>::iterator end = allPages->end();
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (HashSet<Page*>::iterator it = allPages->begin(); it != end; ++it) {
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree()->traverseNext())
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            frames.append(frame);
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        InspectorInstrumentation::networkStateChanged(*it);
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AtomicString eventName = networkStateNotifier().onLine() ? eventNames().onlineEvent : eventNames().offlineEvent;
1195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    for (unsigned i = 0; i < frames.size(); i++)
120231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        frames[i]->document()->dispatchWindowEvent(Event::create(eventName, false, false));
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1239fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu#if PLATFORM(ANDROID) && ENABLE(APPLICATION_INSTALLED)
1249fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescustatic void onPackageResultAvailable()
1259fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu{
1269fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    HashSet<Page*>::iterator end = allPages->end();
1279fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    for (HashSet<Page*>::iterator it = allPages->begin(); it != end; ++it) {
1289fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu        for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree()->traverseNext())
1299fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu            frame->domWindow()->navigator()->onPackageResult();
1309fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    }
1319fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu}
1329fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu#endif
1339fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
1340617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenPage::Page(const PageClients& pageClients)
13528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    : m_chrome(adoptPtr(new Chrome(this, pageClients.chromeClient)))
13628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , m_dragCaretController(adoptPtr(new SelectionController(0, true)))
137231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(DRAG_SUPPORT)
13828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , m_dragController(adoptPtr(new DragController(this, pageClients.dragClient)))
139231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
14028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , m_focusController(adoptPtr(new FocusController(this)))
141231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(CONTEXT_MENUS)
14228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , m_contextMenuController(adoptPtr(new ContextMenuController(this, pageClients.contextMenuClient)))
143231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
144231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(INSPECTOR)
14528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , m_inspectorController(adoptPtr(new InspectorController(this, pageClients.inspectorClient)))
146231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
147370b559b082915acb99b185ed8c8e317fc654db6Steve Block#if ENABLE(CLIENT_BASED_GEOLOCATION)
1486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    , m_geolocationController(adoptPtr(new GeolocationController(this, pageClients.geolocationClient)))
149370b559b082915acb99b185ed8c8e317fc654db6Steve Block#endif
150e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#if ENABLE(DEVICE_ORIENTATION)
151dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    , m_deviceMotionController(RuntimeEnabledFeatures::deviceMotionEnabled() ? new DeviceMotionController(pageClients.deviceMotionClient) : 0)
1520617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    , m_deviceOrientationController(RuntimeEnabledFeatures::deviceOrientationEnabled() ? new DeviceOrientationController(this, pageClients.deviceOrientationClient) : 0)
153967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif
154967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if ENABLE(INPUT_SPEECH)
1550617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    , m_speechInputClient(pageClients.speechInputClient)
156e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#endif
15728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , m_settings(adoptPtr(new Settings(this)))
15828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , m_progress(adoptPtr(new ProgressTracker))
15928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , m_backForwardController(adoptPtr(new BackForwardController(this, pageClients.backForwardClient)))
1600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    , m_theme(RenderTheme::themeForPage(this))
1610617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    , m_editorClient(pageClients.editorClient)
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_frameCount(0)
163231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    , m_openedByDOM(false)
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_tabKeyCyclesThroughElements(true)
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_defersLoading(false)
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_inLowQualityInterpolationMode(false)
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_cookieEnabled(true)
168635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    , m_areMemoryCacheClientCallsEnabled(true)
169635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    , m_mediaVolume(1)
1705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    , m_javaScriptURLsAreAllowed(true)
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_didLoadUserStyleSheet(false)
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_userStyleSheetModificationTime(0)
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_group(0)
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_debugger(0)
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_customHTMLTokenizerTimeDelay(-1)
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_customHTMLTokenizerChunkSize(-1)
177692e5dbf12901edacf14812a6fae25462920af42Steve Block    , m_canStartMedia(true)
178db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    , m_viewMode(ViewModeWindowed)
17981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_minimumTimerInterval(Settings::defaultMinDOMTimerInterval())
1802bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_isEditable(false)
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allPages) {
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        allPages = new HashSet<Page*>;
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        networkStateNotifier().setNetworkStateChangedFunction(networkStateChanged);
1869fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu#if PLATFORM(ANDROID) && ENABLE(APPLICATION_INSTALLED)
1879fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu        packageNotifier().setOnResultAvailable(onPackageResultAvailable);
1889fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu#endif
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!allPages->contains(this));
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    allPages->add(this);
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1940617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (pageClients.pluginHalterClient) {
1950617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        m_pluginHalter.set(new PluginHalter(pageClients.pluginHalterClient));
196cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        m_pluginHalter->setPluginAllowedRunTime(m_settings->pluginAllowedRunTime());
197cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
198231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    pageCounter.increment();
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPage::~Page()
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_mainFrame->setView(0);
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setGroupName(String());
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    allPages->remove(this);
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        frame->pageDestroyed();
2128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
2132bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_scrollableAreaSet) {
2142bde8e466a4451c7319e3a072d118917957d6554Steve Block        ScrollableAreaSet::const_iterator end = m_scrollableAreaSet->end();
2152bde8e466a4451c7319e3a072d118917957d6554Steve Block        for (ScrollableAreaSet::const_iterator it = m_scrollableAreaSet->begin(); it != end; ++it)
2162bde8e466a4451c7319e3a072d118917957d6554Steve Block            (*it)->disconnectFromPage();
2172bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
2182bde8e466a4451c7319e3a072d118917957d6554Steve Block
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_editorClient->pageDestroyed();
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    InspectorInstrumentation::inspectedPageDestroyed(this);
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    backForward()->close();
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    pageCounter.decrement();
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cancel keepAlive timers, to ensure we release all Frames before exiting.
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // It's safe to do this because we prohibit closing a Page while JavaScript
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // is executing.
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame::cancelAllKeepAlive();
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
235db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockstruct ViewModeInfo {
236db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    const char* name;
237db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    Page::ViewMode type;
238db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block};
239db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockstatic const int viewModeMapSize = 5;
240db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockstatic ViewModeInfo viewModeMap[viewModeMapSize] = {
241db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    {"windowed", Page::ViewModeWindowed},
242db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    {"floating", Page::ViewModeFloating},
243db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    {"fullscreen", Page::ViewModeFullscreen},
244db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    {"maximized", Page::ViewModeMaximized},
245db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    {"minimized", Page::ViewModeMinimized}
246db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block};
247db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
248db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockPage::ViewMode Page::stringToViewMode(const String& text)
249db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{
250db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    for (int i = 0; i < viewModeMapSize; ++i) {
251db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        if (text == viewModeMap[i].name)
252db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return viewModeMap[i].type;
253db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    }
254db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    return Page::ViewModeInvalid;
255db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block}
256db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
257db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid Page::setViewMode(ViewMode viewMode)
258db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{
259db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    if (viewMode == m_viewMode || viewMode == ViewModeInvalid)
260db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        return;
261db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
262db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    m_viewMode = viewMode;
263db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
264db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    if (!m_mainFrame)
265db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        return;
266db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
267db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    if (m_mainFrame->view())
268db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        m_mainFrame->view()->forceLayout();
269db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
270db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    if (m_mainFrame->document())
2715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_mainFrame->document()->styleSelectorChanged(RecalcStyleImmediately);
272db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block}
273db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Page::setMainFrame(PassRefPtr<Frame> mainFrame)
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!m_mainFrame); // Should only be called during initialization
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_mainFrame = mainFrame;
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
280231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool Page::openedByDOM() const
281231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
282231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return m_openedByDOM;
283231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
284231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
285231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid Page::setOpenedByDOM()
286231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
287231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_openedByDOM = true;
288231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
289231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
290e458d70a0d18538346f41b503114c9ebe6b2ce12Leon ClarkeBackForwardList* Page::backForwardList() const
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
29228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return m_backForwardController->client();
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Page::goBack()
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
29728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    HistoryItem* item = backForward()->backItem();
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (item) {
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        goToItem(item, FrameLoadTypeBack);
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Page::goForward()
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
30828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    HistoryItem* item = backForward()->forwardItem();
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (item) {
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        goToItem(item, FrameLoadTypeForward);
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
317231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool Page::canGoBackOrForward(int distance) const
318231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
319231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (distance == 0)
320231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return true;
32128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (distance > 0 && distance <= backForward()->forwardCount())
322231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return true;
32328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (distance < 0 && -distance <= backForward()->backCount())
324231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return true;
325231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return false;
326231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
327231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
328231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid Page::goBackOrForward(int distance)
329231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
330231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (distance == 0)
331231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
332231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
33328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    HistoryItem* item = backForward()->itemAtIndex(distance);
334231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!item) {
335231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (distance > 0) {
33628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            if (int forwardCount = backForward()->forwardCount())
33728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                item = backForward()->itemAtIndex(forwardCount);
338231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } else {
33928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            if (int backCount = backForward()->backCount())
34028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                item = backForward()->itemAtIndex(-backCount);
341231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
342231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
343231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
34428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    ASSERT(item);
34528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (!item)
34628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return;
34728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
34828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    goToItem(item, FrameLoadTypeIndexedBackForward);
349231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
350231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Page::goToItem(HistoryItem* item, FrameLoadType type)
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
353f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (defersLoading())
354f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return;
35528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
35628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // stopAllLoaders may end up running onload handlers, which could cause further history traversals that may lead to the passed in HistoryItem
35728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // being deref()-ed. Make sure we can still use it with HistoryController::goToItem later.
35828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    RefPtr<HistoryItem> protector(item);
359643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
36081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_mainFrame->loader()->history()->shouldStopLoadingForHistoryItem(item))
36181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_mainFrame->loader()->stopAllLoaders();
36281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
363cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    m_mainFrame->loader()->history()->goToItem(item, type);
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
366231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockint Page::getHistoryLength()
367231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
36828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return backForward()->backCount() + 1 + backForward()->forwardCount();
369231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
370231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Page::setGroupName(const String& name)
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_group && !m_group->name().isEmpty()) {
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(m_group != m_singlePageGroup.get());
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(!m_singlePageGroup);
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_group->removePage(this);
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (name.isEmpty())
3808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_group = m_singlePageGroup.get();
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_singlePageGroup.clear();
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_group = PageGroup::pageGroup(name);
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_group->addPage(this);
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst String& Page::groupName() const
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
390635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(String, nullString, ());
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_group ? m_group->name() : nullString;
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Page::initGroup()
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!m_singlePageGroup);
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!m_group);
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_singlePageGroup.set(new PageGroup(this));
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_group = m_singlePageGroup.get();
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid Page::scheduleForcedStyleRecalcForAllPages()
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allPages)
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HashSet<Page*>::iterator end = allPages->end();
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (HashSet<Page*>::iterator it = allPages->begin(); it != end; ++it)
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree()->traverseNext())
4095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            frame->document()->scheduleForcedStyleRecalc();
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4122bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid Page::setNeedsRecalcStyleInAllFrames()
4132bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4142bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
4152bde8e466a4451c7319e3a072d118917957d6554Steve Block        frame->document()->styleSelectorChanged(DeferRecalcStyle);
4162bde8e466a4451c7319e3a072d118917957d6554Steve Block}
4172bde8e466a4451c7319e3a072d118917957d6554Steve Block
418a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid Page::updateViewportArguments()
419a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
420a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!mainFrame() || !mainFrame()->document() || mainFrame()->document()->viewportArguments() == m_viewportArguments)
421a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
422a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
423a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_viewportArguments = mainFrame()->document()->viewportArguments();
424a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    chrome()->dispatchViewportDataDidChange(m_viewportArguments);
425a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
426a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Page::refreshPlugins(bool reload)
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allPages)
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PluginData::refresh();
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<RefPtr<Frame> > framesNeedingReload;
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HashSet<Page*>::iterator end = allPages->end();
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (HashSet<Page*>::iterator it = allPages->begin(); it != end; ++it) {
4385af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        Page* page = *it;
4395af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
4405af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        // Clear out the page's plug-in data.
441cad810f21b803229eb11403f9209855525a25d57Steve Block        if (page->m_pluginData)
442f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            page->m_pluginData = 0;
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4445af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (!reload)
4455af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            continue;
4465af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
4475af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree()->traverseNext()) {
44806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (frame->loader()->subframeLoader()->containsPlugins())
4495af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                framesNeedingReload.append(frame);
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (size_t i = 0; i < framesNeedingReload.size(); ++i)
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        framesNeedingReload[i]->loader()->reload();
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPluginData* Page::pluginData() const
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
45906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (!mainFrame()->loader()->subframeLoader()->allowPlugins(NotAboutToInstantiatePlugin))
460635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return 0;
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_pluginData)
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_pluginData = PluginData::create(this);
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_pluginData.get();
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monseninline MediaCanStartListener* Page::takeAnyMediaCanStartListener()
4670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext()) {
4696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        if (MediaCanStartListener* listener = frame->document()->takeAnyMediaCanStartListener())
4706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            return listener;
4716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
4726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return 0;
473692e5dbf12901edacf14812a6fae25462920af42Steve Block}
474692e5dbf12901edacf14812a6fae25462920af42Steve Block
475692e5dbf12901edacf14812a6fae25462920af42Steve Blockvoid Page::setCanStartMedia(bool canStartMedia)
476692e5dbf12901edacf14812a6fae25462920af42Steve Block{
477692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (m_canStartMedia == canStartMedia)
478692e5dbf12901edacf14812a6fae25462920af42Steve Block        return;
479692e5dbf12901edacf14812a6fae25462920af42Steve Block
480692e5dbf12901edacf14812a6fae25462920af42Steve Block    m_canStartMedia = canStartMedia;
481692e5dbf12901edacf14812a6fae25462920af42Steve Block
48221939df44de1705786c545cd1bf519d47250322dBen Murdoch    while (m_canStartMedia) {
4836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        MediaCanStartListener* listener = takeAnyMediaCanStartListener();
4846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        if (!listener)
48521939df44de1705786c545cd1bf519d47250322dBen Murdoch            break;
48621939df44de1705786c545cd1bf519d47250322dBen Murdoch        listener->mediaCanStart();
48721939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
4880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic Frame* incrementFrame(Frame* curr, bool forward, bool wrapFlag)
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return forward
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ? curr->tree()->traverseNextWithWrap(wrapFlag)
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        : curr->tree()->traversePreviousWithWrap(wrapFlag);
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Page::findString(const String& target, TextCaseSensitivity caseSensitivity, FindDirection direction, bool shouldWrap)
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
499f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return findString(target, (caseSensitivity == TextCaseInsensitive ? CaseInsensitive : 0) | (direction == FindDirectionBackward ? Backwards : 0) | (shouldWrap ? WrapAround : 0));
500f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
501f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
502f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool Page::findString(const String& target, FindOptions options)
503f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (target.isEmpty() || !mainFrame())
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
507f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    bool shouldWrap = options & WrapAround;
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = focusController()->focusedOrMainFrame();
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* startFrame = frame;
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    do {
511f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (frame->editor()->findString(target, (options & ~WrapAround) | StartInSelection)) {
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (frame != startFrame)
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                startFrame->selection()->clear();
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            focusController()->setFocusedFrame(frame);
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
517f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        frame = incrementFrame(frame, !(options & Backwards), shouldWrap);
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } while (frame && frame != startFrame);
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Search contents of startFrame, on the other side of the selection that we did earlier.
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We cheat a bit and just research with wrap on
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (shouldWrap && !startFrame->selection()->isNone()) {
523f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        bool found = startFrame->editor()->findString(target, options | WrapAround | StartInSelection);
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        focusController()->setFocusedFrame(frame);
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return found;
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned int Page::markAllMatchesForText(const String& target, TextCaseSensitivity caseSensitivity, bool shouldHighlight, unsigned limit)
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
533f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return markAllMatchesForText(target, caseSensitivity == TextCaseInsensitive ? CaseInsensitive : 0, shouldHighlight, limit);
534f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
535f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
536f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochunsigned int Page::markAllMatchesForText(const String& target, FindOptions options, bool shouldHighlight, unsigned limit)
537f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (target.isEmpty() || !mainFrame())
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned matches = 0;
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = mainFrame();
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    do {
5455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        frame->editor()->setMarkedTextMatchesAreHighlighted(shouldHighlight);
546f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        matches += frame->editor()->countMatchesForText(target, options, limit ? (limit - matches) : 0, true);
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        frame = incrementFrame(frame, true, false);
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } while (frame);
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return matches;
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Page::unmarkAllTextMatches()
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!mainFrame())
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = mainFrame();
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    do {
560e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        frame->document()->markers()->removeMarkers(DocumentMarker::TextMatch);
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        frame = incrementFrame(frame, true, false);
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } while (frame);
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianconst VisibleSelection& Page::selection() const
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return focusController()->focusedOrMainFrame()->selection()->selection();
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Page::setDefersLoading(bool defers)
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
572d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!m_settings->loadDeferringEnabled())
573d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
574d0825bca7fe65beaee391d30da42e937db621564Steve Block
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (defers == m_defersLoading)
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_defersLoading = defers;
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        frame->loader()->setDefersLoading(defers);
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Page::clearUndoRedoOperations()
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_editorClient->clearUndoRedoOperations();
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Page::inLowQualityImageInterpolationMode() const
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_inLowQualityInterpolationMode;
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Page::setInLowQualityImageInterpolationMode(bool mode)
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_inLowQualityInterpolationMode = mode;
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
598635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Page::setMediaVolume(float volume)
599635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
600635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (volume < 0 || volume > 1)
601635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
602635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
603635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (m_mediaVolume == volume)
604635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
605635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
606635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_mediaVolume = volume;
607635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext()) {
6088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        frame->document()->mediaVolumeDidChange();
6098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
6108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
6118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
6128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid Page::didMoveOnscreen()
6138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
6148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext()) {
6158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (frame->view())
6168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            frame->view()->didMoveOnscreen();
6178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
6188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
6198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
6208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid Page::willMoveOffscreen()
6218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
6228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext()) {
6238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (frame->view())
6248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            frame->view()->willMoveOffscreen();
625635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
626635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
627635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Page::userStyleSheetLocationChanged()
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
630231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // FIXME: Eventually we will move to a model of just being handed the sheet
631231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // text instead of loading the URL ourselves.
632231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    KURL url = m_settings->userStyleSheetLocation();
633231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (url.isLocalFile())
634231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_userStyleSheetPath = url.fileSystemPath();
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_userStyleSheetPath = String();
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_didLoadUserStyleSheet = false;
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_userStyleSheet = String();
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_userStyleSheetModificationTime = 0;
641a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
642231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Data URLs with base64-encoded UTF-8 style sheets are common. We can process them
643231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // synchronously and avoid using a loader.
644a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (url.protocolIsData() && url.string().startsWith("data:text/css;charset=utf-8;base64,")) {
645231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_didLoadUserStyleSheet = true;
646231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
647231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        Vector<char> styleSheetAsUTF8;
648a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (base64Decode(decodeURLEscapeSequences(url.string().substring(35)), styleSheetAsUTF8, IgnoreWhitespace))
649643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_userStyleSheet = String::fromUTF8(styleSheetAsUTF8.data(), styleSheetAsUTF8.size());
650231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
651a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
652231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext()) {
653231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (frame->document())
6545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            frame->document()->updatePageUserSheet();
655231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst String& Page::userStyleSheet() const
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
660231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_userStyleSheetPath.isEmpty())
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_userStyleSheet;
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    time_t modTime;
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!getFileModificationTime(m_userStyleSheetPath, modTime)) {
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The stylesheet either doesn't exist, was just deleted, or is
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // otherwise unreadable. If we've read the stylesheet before, we should
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // throw away that data now as it no longer represents what's on disk.
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_userStyleSheet = String();
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_userStyleSheet;
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the stylesheet hasn't changed since the last time we read it, we can
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // just return the old data.
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_didLoadUserStyleSheet && modTime <= m_userStyleSheetModificationTime)
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_userStyleSheet;
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_didLoadUserStyleSheet = true;
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_userStyleSheet = String();
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_userStyleSheetModificationTime = modTime;
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: It would be better to load this asynchronously to avoid blocking
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the process, but we will first need to create an asynchronous loading
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // mechanism that is not tied to a particular Frame. We will also have to
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // determine what our behavior should be before the stylesheet is loaded
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // and what should happen when it finishes loading, especially with respect
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // to when the load event fires, when Document::close is called, and when
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // layout/paint are allowed to happen.
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<SharedBuffer> data = SharedBuffer::createWithContentsOfFile(m_userStyleSheetPath);
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!data)
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_userStyleSheet;
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RefPtr<TextResourceDecoder> decoder = TextResourceDecoder::create("text/css");
6938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_userStyleSheet = decoder->decode(data->data(), data->size());
6948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_userStyleSheet += decoder->flush();
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_userStyleSheet;
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Page::removeAllVisitedLinks()
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allPages)
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HashSet<PageGroup*> groups;
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HashSet<Page*>::iterator pagesEnd = allPages->end();
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (HashSet<Page*>::iterator it = allPages->begin(); it != pagesEnd; ++it) {
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (PageGroup* group = (*it)->groupPtr())
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            groups.add(group);
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HashSet<PageGroup*>::iterator groupsEnd = groups.end();
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (HashSet<PageGroup*>::iterator it = groups.begin(); it != groupsEnd; ++it)
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (*it)->removeVisitedLinks();
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Page::allVisitedStateChanged(PageGroup* group)
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(group);
7170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!allPages)
7180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
7190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HashSet<Page*>::iterator pagesEnd = allPages->end();
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (HashSet<Page*>::iterator it = allPages->begin(); it != pagesEnd; ++it) {
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Page* page = *it;
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (page->m_group != group)
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (Frame* frame = page->m_mainFrame.get(); frame; frame = frame->tree()->traverseNext()) {
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (CSSStyleSelector* styleSelector = frame->document()->styleSelector())
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                styleSelector->allVisitedStateChanged();
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
732635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Page::visitedStateChanged(PageGroup* group, LinkHash visitedLinkHash)
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(group);
7350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!allPages)
7360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
7370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HashSet<Page*>::iterator pagesEnd = allPages->end();
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (HashSet<Page*>::iterator it = allPages->begin(); it != pagesEnd; ++it) {
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Page* page = *it;
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (page->m_group != group)
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (Frame* frame = page->m_mainFrame.get(); frame; frame = frame->tree()->traverseNext()) {
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (CSSStyleSelector* styleSelector = frame->document()->styleSelector())
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                styleSelector->visitedStateChanged(visitedLinkHash);
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Page::setDebuggerForAllPages(JSC::Debugger* debugger)
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(allPages);
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HashSet<Page*>::iterator end = allPages->end();
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (HashSet<Page*>::iterator it = allPages->begin(); it != end; ++it)
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (*it)->setDebugger(debugger);
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Page::setDebugger(JSC::Debugger* debugger)
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_debugger == debugger)
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_debugger = debugger;
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (Frame* frame = m_mainFrame.get(); frame; frame = frame->tree()->traverseNext())
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        frame->script()->attachDebugger(m_debugger);
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
770a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochSharedGraphicsContext3D* Page::sharedGraphicsContext3D()
771a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
772a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if ENABLE(ACCELERATED_2D_CANVAS)
773a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!m_sharedGraphicsContext3D)
774a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_sharedGraphicsContext3D = SharedGraphicsContext3D::create(chrome());
775a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
776a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return m_sharedGraphicsContext3D.get();
777a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#else
778a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return 0;
779a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif
780a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
781a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DOM_STORAGE)
7830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochStorageNamespace* Page::sessionStorage(bool optionalCreate)
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_sessionStorage && optionalCreate)
786dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_sessionStorage = StorageNamespace::sessionStorageNamespace(this, m_settings->sessionStorageQuota());
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_sessionStorage.get();
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid Page::setSessionStorage(PassRefPtr<StorageNamespace> newStorage)
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_sessionStorage = newStorage;
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
797635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML)
798635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectWMLPageState* Page::wmlPageState()
799635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
800635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!m_wmlPageState)
801635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_wmlPageState.set(new WMLPageState(this));
802635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return m_wmlPageState.get();
803635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
804635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
805635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Page::setCustomHTMLTokenizerTimeDelay(double customHTMLTokenizerTimeDelay)
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (customHTMLTokenizerTimeDelay < 0) {
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_customHTMLTokenizerTimeDelay = -1;
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_customHTMLTokenizerTimeDelay = customHTMLTokenizerTimeDelay;
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Page::setCustomHTMLTokenizerChunkSize(int customHTMLTokenizerChunkSize)
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (customHTMLTokenizerChunkSize < 0) {
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_customHTMLTokenizerChunkSize = -1;
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_customHTMLTokenizerChunkSize = customHTMLTokenizerChunkSize;
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
824635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Page::setMemoryCacheClientCallsEnabled(bool enabled)
825635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
826635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (m_areMemoryCacheClientCallsEnabled == enabled)
827635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
828635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
829635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_areMemoryCacheClientCallsEnabled = enabled;
830635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!enabled)
831635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
832635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
833635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    for (RefPtr<Frame> frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
834635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        frame->loader()->tellClientAboutPastMemoryCacheLoads();
835635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
836635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
8375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid Page::setJavaScriptURLsAreAllowed(bool areAllowed)
8385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
8395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_javaScriptURLsAreAllowed = areAllowed;
8405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
8415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
8425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool Page::javaScriptURLsAreAllowed() const
8435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
8445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return m_javaScriptURLsAreAllowed;
8455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
8465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
84781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid Page::setMinimumTimerInterval(double minimumTimerInterval)
84881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
84981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    double oldTimerInterval = m_minimumTimerInterval;
85081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_minimumTimerInterval = minimumTimerInterval;
85181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNextWithWrap(false)) {
85281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (frame->document())
85381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            frame->document()->adjustMinimumTimerInterval(oldTimerInterval);
85481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
85581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
85681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
85781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochdouble Page::minimumTimerInterval() const
85881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
85981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return m_minimumTimerInterval;
86081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
86181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
8620617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#if ENABLE(INPUT_SPEECH)
8630617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenSpeechInput* Page::speechInput()
8640617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
8650617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    ASSERT(m_speechInputClient);
8660617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!m_speechInput.get())
8670617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        m_speechInput.set(new SpeechInput(m_speechInputClient));
8680617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return m_speechInput.get();
8690617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
8700617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#endif
8710617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
872f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid Page::dnsPrefetchingStateChanged()
873f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
874f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
875f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        frame->document()->initDNSPrefetch();
876f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
877f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
878dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid Page::privateBrowsingStateChanged()
879dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
880dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool privateBrowsingEnabled = m_settings->privateBrowsingEnabled();
881dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
88281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
88381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        frame->document()->privateBrowsingStateDidChange();
88481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
885dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Collect the PluginViews in to a vector to ensure that action the plug-in takes
886dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // from below privateBrowsingStateChanged does not affect their lifetime.
887a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    Vector<RefPtr<PluginViewBase>, 32> pluginViewBases;
888dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext()) {
889dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        FrameView* view = frame->view();
890dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!view)
891dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return;
892dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
893dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        const HashSet<RefPtr<Widget> >* children = view->children();
894dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ASSERT(children);
895dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
896dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        HashSet<RefPtr<Widget> >::const_iterator end = children->end();
897dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        for (HashSet<RefPtr<Widget> >::const_iterator it = children->begin(); it != end; ++it) {
898dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            Widget* widget = (*it).get();
899a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (widget->isPluginViewBase())
900a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                pluginViewBases.append(static_cast<PluginViewBase*>(widget));
901dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
902dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
903dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
904a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    for (size_t i = 0; i < pluginViewBases.size(); ++i)
905a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        pluginViewBases[i]->privateBrowsingStateChanged(privateBrowsingEnabled);
906dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
907dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
908231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid Page::pluginAllowedRunTimeChanged()
909231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
910231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_pluginHalter)
911231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_pluginHalter->setPluginAllowedRunTime(m_settings->pluginAllowedRunTime());
912231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
913231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
914231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid Page::didStartPlugin(HaltablePlugin* obj)
915231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
916231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_pluginHalter)
917231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_pluginHalter->didStartPlugin(obj);
918231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
919231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
920231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid Page::didStopPlugin(HaltablePlugin* obj)
921231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
922231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_pluginHalter)
923231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_pluginHalter->didStopPlugin(obj);
924231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
925231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
9262bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid Page::addScrollableArea(ScrollableArea* scrollableArea)
9272bde8e466a4451c7319e3a072d118917957d6554Steve Block{
9282bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_scrollableAreaSet)
9292bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_scrollableAreaSet = adoptPtr(new ScrollableAreaSet);
9302bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_scrollableAreaSet->add(scrollableArea);
9312bde8e466a4451c7319e3a072d118917957d6554Steve Block}
9322bde8e466a4451c7319e3a072d118917957d6554Steve Block
9332bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid Page::removeScrollableArea(ScrollableArea* scrollableArea)
9342bde8e466a4451c7319e3a072d118917957d6554Steve Block{
9352bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_scrollableAreaSet)
9362bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
9372bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_scrollableAreaSet->remove(scrollableArea);
9382bde8e466a4451c7319e3a072d118917957d6554Steve Block}
9392bde8e466a4451c7319e3a072d118917957d6554Steve Block
9402bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool Page::containsScrollableArea(ScrollableArea* scrollableArea) const
9412bde8e466a4451c7319e3a072d118917957d6554Steve Block{
9422bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_scrollableAreaSet)
9432bde8e466a4451c7319e3a072d118917957d6554Steve Block        return false;
9442bde8e466a4451c7319e3a072d118917957d6554Steve Block    return m_scrollableAreaSet->contains(scrollableArea);
9452bde8e466a4451c7319e3a072d118917957d6554Steve Block}
9462bde8e466a4451c7319e3a072d118917957d6554Steve Block
947d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !ASSERT_DISABLED
948d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid Page::checkFrameCountConsistency() const
949d0825bca7fe65beaee391d30da42e937db621564Steve Block{
950d0825bca7fe65beaee391d30da42e937db621564Steve Block    ASSERT(m_frameCount >= 0);
951d0825bca7fe65beaee391d30da42e937db621564Steve Block
952d0825bca7fe65beaee391d30da42e937db621564Steve Block    int frameCount = 0;
953d0825bca7fe65beaee391d30da42e937db621564Steve Block    for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
954d0825bca7fe65beaee391d30da42e937db621564Steve Block        ++frameCount;
955d0825bca7fe65beaee391d30da42e937db621564Steve Block
956d0825bca7fe65beaee391d30da42e937db621564Steve Block    ASSERT(m_frameCount + 1 == frameCount);
957d0825bca7fe65beaee391d30da42e937db621564Steve Block}
958d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
95928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
96028040489d744e0c5d475a88663056c9040ed5320Teng-Hui ZhuPage::PageClients::PageClients()
96128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    : chromeClient(0)
96228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , contextMenuClient(0)
96328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , editorClient(0)
96428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , dragClient(0)
96528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , inspectorClient(0)
96628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , pluginHalterClient(0)
9676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    , geolocationClient(0)
96828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , deviceMotionClient(0)
96928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , deviceOrientationClient(0)
97028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , speechInputClient(0)
97128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
97228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
97328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
97428040489d744e0c5d475a88663056c9040ed5320Teng-Hui ZhuPage::PageClients::~PageClients()
97528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
97628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
97728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
979