#include "core/editing/Caret.h"
#include "core/editing/UndoStack.h"
#include "core/events/Event.h"
-#include "core/events/ThreadLocalEventNames.h"
#include "core/fetch/ResourceFetcher.h"
#include "core/frame/DOMTimer.h"
-#include "core/frame/DOMWindow.h"
-#include "core/frame/Frame.h"
+#include "core/frame/FrameConsole.h"
#include "core/frame/FrameHost.h"
#include "core/frame/FrameView.h"
+#include "core/frame/LocalDOMWindow.h"
+#include "core/frame/LocalFrame.h"
+#include "core/frame/RemoteFrame.h"
+#include "core/frame/RemoteFrameView.h"
+#include "core/frame/Settings.h"
#include "core/inspector/InspectorController.h"
#include "core/inspector/InspectorInstrumentation.h"
#include "core/loader/FrameLoader.h"
#include "core/loader/HistoryItem.h"
-#include "core/loader/ProgressTracker.h"
#include "core/page/AutoscrollController.h"
#include "core/page/Chrome.h"
#include "core/page/ChromeClient.h"
#include "core/page/DragController.h"
#include "core/page/FocusController.h"
#include "core/page/FrameTree.h"
-#include "core/page/PageGroup.h"
#include "core/page/PageLifecycleNotifier.h"
#include "core/page/PointerLockController.h"
-#include "core/frame/Settings.h"
+#include "core/page/StorageClient.h"
#include "core/page/ValidationMessageClient.h"
#include "core/page/scrolling/ScrollingCoordinator.h"
#include "core/rendering/RenderView.h"
#include "wtf/StdLibExtras.h"
#include "wtf/text/Base64.h"
-namespace WebCore {
-
-static HashSet<Page*>* allPages;
+namespace blink {
DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, pageCounter, ("Page"));
-void Page::networkStateChanged(bool online)
+// static
+HashSet<Page*>& Page::allPages()
{
- if (!allPages)
- return;
+ DEFINE_STATIC_LOCAL(HashSet<Page*>, allPages, ());
+ return allPages;
+}
+
+// static
+HashSet<Page*>& Page::ordinaryPages()
+{
+ DEFINE_STATIC_LOCAL(HashSet<Page*>, ordinaryPages, ());
+ return ordinaryPages;
+}
+
- Vector<RefPtr<Frame> > frames;
+void Page::networkStateChanged(bool online)
+{
+ WillBeHeapVector<RefPtrWillBeMember<LocalFrame>> frames;
// Get all the frames of all the pages in all the page groups
- HashSet<Page*>::iterator end = allPages->end();
- for (HashSet<Page*>::iterator it = allPages->begin(); it != end; ++it) {
- for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree().traverseNext())
- frames.append(frame);
- InspectorInstrumentation::networkStateChanged(*it, online);
+ for (Page* page : allPages()) {
+ for (Frame* frame = page->mainFrame(); frame; frame = frame->tree().traverseNext()) {
+ // FIXME: There is currently no way to dispatch events to out-of-process frames.
+ if (frame->isLocalFrame())
+ frames.append(toLocalFrame(frame));
+ }
+ InspectorInstrumentation::networkStateChanged(page, online);
}
AtomicString eventName = online ? EventTypeNames::online : EventTypeNames::offline;
frames[i]->domWindow()->dispatchEvent(Event::create(eventName));
}
-float deviceScaleFactor(Frame* frame)
+float deviceScaleFactor(LocalFrame* frame)
{
if (!frame)
return 1;
Page::Page(PageClients& pageClients)
: SettingsDelegate(Settings::create())
+ , m_animator(PageAnimator::create(*this))
, m_autoscrollController(AutoscrollController::create(*this))
, m_chrome(Chrome::create(this, pageClients.chromeClient))
, m_dragCaretController(DragCaretController::create())
, m_contextMenuController(ContextMenuController::create(this, pageClients.contextMenuClient))
, m_inspectorController(InspectorController::create(this, pageClients.inspectorClient))
, m_pointerLockController(PointerLockController::create(this))
- , m_historyController(adoptPtr(new HistoryController(this)))
- , m_progress(ProgressTracker::create())
, m_undoStack(UndoStack::create())
- , m_backForwardClient(pageClients.backForwardClient)
+ , m_mainFrame(nullptr)
, m_editorClient(pageClients.editorClient)
- , m_validationMessageClient(0)
, m_spellCheckerClient(pageClients.spellCheckerClient)
- , m_subframeCount(0)
+ , m_storageClient(pageClients.storageClient)
, m_openedByDOM(false)
, m_tabKeyCyclesThroughElements(true)
, m_defersLoading(false)
- , m_pageScaleFactor(1)
, m_deviceScaleFactor(1)
- , m_group(0)
, m_timerAlignmentInterval(DOMTimer::visiblePageAlignmentInterval())
, m_visibilityState(PageVisibilityStateVisible)
, m_isCursorVisible(true)
-#ifndef NDEBUG
+#if ENABLE(ASSERT)
, m_isPainting(false)
#endif
, m_frameHost(FrameHost::create(*this))
{
ASSERT(m_editorClient);
- if (!allPages)
- allPages = new HashSet<Page*>;
-
- ASSERT(!allPages->contains(this));
- allPages->add(this);
+ ASSERT(!allPages().contains(this));
+ allPages().add(this);
#ifndef NDEBUG
pageCounter.increment();
Page::~Page()
{
- m_mainFrame->setView(0);
- clearPageGroup();
- allPages->remove(this);
-
- for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext()) {
- frame->willDetachFrameHost();
- frame->detachFromFrameHost();
- }
-
- m_inspectorController->inspectedPageDestroyed();
-
- if (m_scrollingCoordinator)
- m_scrollingCoordinator->pageDestroyed();
+ // willBeDestroyed() must be called before Page destruction.
+ ASSERT(!m_mainFrame);
+}
-#ifndef NDEBUG
- pageCounter.decrement();
-#endif
+void Page::makeOrdinary()
+{
+ ASSERT(!ordinaryPages().contains(this));
+ ordinaryPages().add(this);
}
ViewportDescription Page::viewportDescription() const
{
- return mainFrame() && mainFrame()->document() ? mainFrame()->document()->viewportDescription() : ViewportDescription();
+ return mainFrame() && mainFrame()->isLocalFrame() && deprecatedLocalMainFrame()->document() ? deprecatedLocalMainFrame()->document()->viewportDescription() : ViewportDescription();
}
ScrollingCoordinator* Page::scrollingCoordinator()
{
- if (!m_scrollingCoordinator && m_settings->scrollingCoordinatorEnabled())
+ if (!m_scrollingCoordinator && m_settings->acceleratedCompositingEnabled())
m_scrollingCoordinator = ScrollingCoordinator::create(this);
return m_scrollingCoordinator.get();
return String();
}
-PassRefPtr<ClientRectList> Page::nonFastScrollableRects(const Frame* frame)
+PassRefPtrWillBeRawPtr<ClientRectList> Page::nonFastScrollableRects(const LocalFrame* frame)
{
- if (Document* document = m_mainFrame->document())
- document->updateLayout();
+ if (m_mainFrame->isLocalFrame() && deprecatedLocalMainFrame()->document())
+ deprecatedLocalMainFrame()->document()->updateLayout();
Vector<IntRect> rects;
if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
return ClientRectList::create(quads);
}
-void Page::setMainFrame(PassRefPtr<Frame> mainFrame)
+void Page::setMainFrame(Frame* mainFrame)
{
- ASSERT(!m_mainFrame); // Should only be called during initialization
+ // Should only be called during initialization or swaps between local and
+ // remote frames.
+ // FIXME: Unfortunately we can't assert on this at the moment, because this
+ // is called in the base constructor for both LocalFrame and RemoteFrame,
+ // when the vtables for the derived classes have not yet been setup.
m_mainFrame = mainFrame;
}
void Page::documentDetached(Document* document)
{
+ m_multisamplingChangedObservers.clear();
m_pointerLockController->documentDetached(document);
m_contextMenuController->documentDetached(document);
if (m_validationMessageClient)
m_openedByDOM = true;
}
-void Page::clearPageGroup()
+void Page::scheduleForcedStyleRecalcForAllPages()
{
- if (!m_group)
- return;
- m_group->removePage(this);
- m_group = 0;
+ for (const Page* page : allPages())
+ for (Frame* frame = page->mainFrame(); frame; frame = frame->tree().traverseNext()) {
+ if (frame->isLocalFrame())
+ toLocalFrame(frame)->document()->setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::PlatformColorChange));
+ }
}
-void Page::setGroupType(PageGroupType type)
+void Page::setNeedsRecalcStyleInAllFrames()
{
- clearPageGroup();
-
- switch (type) {
- case PrivatePageGroup:
- m_group = PageGroup::create();
- break;
- case SharedPageGroup:
- m_group = PageGroup::sharedGroup();
- break;
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext()) {
+ if (frame->isLocalFrame())
+ toLocalFrame(frame)->document()->styleResolverChanged();
}
-
- m_group->addPage(this);
-}
-
-void Page::scheduleForcedStyleRecalcForAllPages()
-{
- if (!allPages)
- return;
- HashSet<Page*>::iterator end = allPages->end();
- for (HashSet<Page*>::iterator it = allPages->begin(); it != end; ++it)
- for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree().traverseNext())
- frame->document()->setNeedsStyleRecalc();
}
-void Page::setNeedsRecalcStyleInAllFrames()
+void Page::setNeedsLayoutInAllFrames()
{
- for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext())
- frame->document()->styleResolverChanged(RecalcStyleDeferred);
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext()) {
+ if (!frame->isLocalFrame())
+ continue;
+ if (FrameView* view = toLocalFrame(frame)->view()) {
+ view->setNeedsLayout();
+ view->scheduleRelayout();
+ }
+ }
}
void Page::refreshPlugins(bool reload)
{
- if (!allPages)
+ if (allPages().isEmpty())
return;
PluginData::refresh();
- Vector<RefPtr<Frame> > framesNeedingReload;
-
- HashSet<Page*>::iterator end = allPages->end();
- for (HashSet<Page*>::iterator it = allPages->begin(); it != end; ++it) {
- Page* page = *it;
+ WillBeHeapVector<RefPtrWillBeMember<LocalFrame>> framesNeedingReload;
+ for (const Page* page : allPages()) {
// Clear out the page's plug-in data.
if (page->m_pluginData)
- page->m_pluginData = 0;
+ page->m_pluginData = nullptr;
if (!reload)
continue;
- for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree().traverseNext()) {
- if (frame->document()->containsPlugins())
- framesNeedingReload.append(frame);
+ for (Frame* frame = page->mainFrame(); frame; frame = frame->tree().traverseNext()) {
+ if (frame->isLocalFrame() && toLocalFrame(frame)->document()->containsPlugins())
+ framesNeedingReload.append(toLocalFrame(frame));
}
}
for (size_t i = 0; i < framesNeedingReload.size(); ++i)
- framesNeedingReload[i]->loader().reload();
+ framesNeedingReload[i]->loader().reload(NormalReload);
}
PluginData* Page::pluginData() const
{
- if (!mainFrame()->loader().allowPlugins(NotAboutToInstantiatePlugin))
- return 0;
+ if (!mainFrame()->isLocalFrame()
+ || !deprecatedLocalMainFrame()->loader().allowPlugins(NotAboutToInstantiatePlugin))
+ return nullptr;
if (!m_pluginData)
m_pluginData = PluginData::create(this);
return m_pluginData.get();
Frame* frame = mainFrame();
do {
- frame->document()->markers()->removeMarkers(DocumentMarker::TextMatch);
+ if (frame->isLocalFrame())
+ toLocalFrame(frame)->document()->markers().removeMarkers(DocumentMarker::TextMatch);
frame = incrementFrame(frame, true, false);
} while (frame);
}
+void Page::setValidationMessageClient(PassOwnPtrWillBeRawPtr<ValidationMessageClient> client)
+{
+ m_validationMessageClient = client;
+}
+
void Page::setDefersLoading(bool defers)
{
if (defers == m_defersLoading)
return;
m_defersLoading = defers;
- m_historyController->setDefersLoading(defers);
- for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext())
- frame->loader().setDefersLoading(defers);
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext()) {
+ if (frame->isLocalFrame())
+ toLocalFrame(frame)->loader().setDefersLoading(defers);
+ }
}
void Page::setPageScaleFactor(float scale, const IntPoint& origin)
{
- FrameView* view = mainFrame()->view();
+ if (!mainFrame()->isLocalFrame())
+ return;
- if (scale != m_pageScaleFactor) {
- m_pageScaleFactor = scale;
+ FrameView* view = deprecatedLocalMainFrame()->view();
+ PinchViewport& viewport = frameHost().pinchViewport();
- if (view)
+ if (scale != viewport.scale()) {
+ viewport.setScale(scale);
+
+ if (view && !settings().pinchVirtualViewportEnabled())
view->setVisibleContentScaleFactor(scale);
- mainFrame()->deviceOrPageScaleFactorChanged();
+ deprecatedLocalMainFrame()->deviceOrPageScaleFactorChanged();
m_chrome->client().deviceOrPageScaleFactorChanged();
+ // FIXME: In virtual-viewport pinch mode, scale doesn't change the fixed-pos viewport;
+ // remove once it's the only pinch mode in town.
if (view)
- view->setViewportConstrainedObjectsNeedLayout();
+ view->viewportConstrainedVisibleContentSizeChanged(true, true);
+
+ deprecatedLocalMainFrame()->loader().saveScrollState();
}
if (view && view->scrollPosition() != origin)
view->notifyScrollPositionChanged(origin);
}
+float Page::pageScaleFactor() const
+{
+ return frameHost().pinchViewport().scale();
+}
+
void Page::setDeviceScaleFactor(float scaleFactor)
{
if (m_deviceScaleFactor == scaleFactor)
m_deviceScaleFactor = scaleFactor;
setNeedsRecalcStyleInAllFrames();
- if (mainFrame()) {
- mainFrame()->deviceOrPageScaleFactorChanged();
+ if (mainFrame() && mainFrame()->isLocalFrame()) {
+ deprecatedLocalMainFrame()->deviceOrPageScaleFactorChanged();
m_chrome->client().deviceOrPageScaleFactorChanged();
}
}
-void Page::setPagination(const Pagination& pagination)
+void Page::setDeviceColorProfile(const Vector<char>& profile)
{
- if (m_pagination == pagination)
- return;
-
- m_pagination = pagination;
-
- setNeedsRecalcStyleInAllFrames();
+ // FIXME: implement.
}
-void Page::allVisitedStateChanged(PageGroup* group)
+void Page::resetDeviceColorProfile()
{
- ASSERT(group);
- if (!allPages)
- return;
+ // FIXME: implement.
+}
- HashSet<Page*>::iterator pagesEnd = allPages->end();
- for (HashSet<Page*>::iterator it = allPages->begin(); it != pagesEnd; ++it) {
- Page* page = *it;
- if (page->m_group != group)
- continue;
- for (Frame* frame = page->m_mainFrame.get(); frame; frame = frame->tree().traverseNext())
- frame->document()->visitedLinkState().invalidateStyleForAllLinks();
+void Page::allVisitedStateChanged()
+{
+ for (const Page* page : ordinaryPages()) {
+ for (Frame* frame = page->m_mainFrame; frame; frame = frame->tree().traverseNext()) {
+ if (frame->isLocalFrame())
+ toLocalFrame(frame)->document()->visitedLinkState().invalidateStyleForAllLinks();
+ }
}
}
-void Page::visitedStateChanged(PageGroup* group, LinkHash linkHash)
+void Page::visitedStateChanged(LinkHash linkHash)
{
- ASSERT(group);
- if (!allPages)
- return;
-
- HashSet<Page*>::iterator pagesEnd = allPages->end();
- for (HashSet<Page*>::iterator it = allPages->begin(); it != pagesEnd; ++it) {
- Page* page = *it;
- if (page->m_group != group)
- continue;
- for (Frame* frame = page->m_mainFrame.get(); frame; frame = frame->tree().traverseNext())
- frame->document()->visitedLinkState().invalidateStyleForLink(linkHash);
+ for (const Page* page : ordinaryPages()) {
+ for (Frame* frame = page->m_mainFrame; frame; frame = frame->tree().traverseNext()) {
+ if (frame->isLocalFrame())
+ toLocalFrame(frame)->document()->visitedLinkState().invalidateStyleForLink(linkHash);
+ }
}
}
StorageNamespace* Page::sessionStorage(bool optionalCreate)
{
if (!m_sessionStorage && optionalCreate)
- m_sessionStorage = StorageNamespace::sessionStorageNamespace(this);
+ m_sessionStorage = m_storageClient->createSessionStorageNamespace();
return m_sessionStorage.get();
}
m_timerAlignmentInterval = interval;
for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNextWithWrap(false)) {
- if (frame->document())
- frame->document()->didChangeTimerAlignmentInterval();
+ if (frame->isLocalFrame() && toLocalFrame(frame)->document())
+ toLocalFrame(frame)->document()->didChangeTimerAlignmentInterval();
}
}
return m_timerAlignmentInterval;
}
-#if !ASSERT_DISABLED
-void Page::checkSubframeCountConsistency() const
-{
- ASSERT(m_subframeCount >= 0);
-
- int subframeCount = 0;
- for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext())
- ++subframeCount;
-
- ASSERT(m_subframeCount + 1 == subframeCount);
-}
-#endif
-
void Page::setVisibilityState(PageVisibilityState visibilityState, bool isInitialState)
{
if (m_visibilityState == visibilityState)
return;
m_visibilityState = visibilityState;
- if (visibilityState == WebCore::PageVisibilityStateHidden)
- setTimerAlignmentInterval(DOMTimer::hiddenPageAlignmentInterval());
- else
+ if (visibilityState == blink::PageVisibilityStateVisible)
setTimerAlignmentInterval(DOMTimer::visiblePageAlignmentInterval());
+ else
+ setTimerAlignmentInterval(DOMTimer::hiddenPageAlignmentInterval());
if (!isInitialState)
lifecycleNotifier().notifyPageVisibilityChanged();
- if (!isInitialState && m_mainFrame)
- m_mainFrame->dispatchVisibilityStateChangeEvent();
+ if (!isInitialState && m_mainFrame && m_mainFrame->isLocalFrame())
+ deprecatedLocalMainFrame()->didChangeVisibilityState();
}
PageVisibilityState Page::visibilityState() const
return m_visibilityState;
}
+bool Page::isCursorVisible() const
+{
+ return m_isCursorVisible && settings().deviceSupportsMouse();
+}
+
void Page::addMultisamplingChangedObserver(MultisamplingChangedObserver* observer)
{
m_multisamplingChangedObservers.add(observer);
setNeedsRecalcStyleInAllFrames();
break;
case SettingsDelegate::ViewportDescriptionChange:
- if (mainFrame())
- mainFrame()->document()->updateViewportDescription();
+ if (mainFrame() && mainFrame()->isLocalFrame())
+ deprecatedLocalMainFrame()->document()->updateViewportDescription();
break;
case SettingsDelegate::MediaTypeChange:
- m_mainFrame->view()->setMediaType(AtomicString(settings().mediaTypeOverride()));
- setNeedsRecalcStyleInAllFrames();
+ if (m_mainFrame->isLocalFrame()) {
+ deprecatedLocalMainFrame()->view()->setMediaType(AtomicString(settings().mediaTypeOverride()));
+ setNeedsRecalcStyleInAllFrames();
+ }
break;
case SettingsDelegate::DNSPrefetchingChange:
- for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext())
- frame->document()->initDNSPrefetch();
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext()) {
+ if (frame->isLocalFrame())
+ toLocalFrame(frame)->document()->initDNSPrefetch();
+ }
break;
case SettingsDelegate::MultisamplingChange: {
- HashSet<MultisamplingChangedObserver*>::iterator stop = m_multisamplingChangedObservers.end();
- for (HashSet<MultisamplingChangedObserver*>::iterator it = m_multisamplingChangedObservers.begin(); it != stop; ++it)
- (*it)->multisamplingChanged(m_settings->openGLMultisamplingEnabled());
+ for (MultisamplingChangedObserver* observer : m_multisamplingChangedObservers)
+ observer->multisamplingChanged(m_settings->openGLMultisamplingEnabled());
break;
}
case SettingsDelegate::ImageLoadingChange:
for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext()) {
- frame->document()->fetcher()->setImagesEnabled(settings().imagesEnabled());
- frame->document()->fetcher()->setAutoLoadImages(settings().loadsImagesAutomatically());
+ if (frame->isLocalFrame()) {
+ toLocalFrame(frame)->document()->fetcher()->setImagesEnabled(settings().imagesEnabled());
+ toLocalFrame(frame)->document()->fetcher()->setAutoLoadImages(settings().loadsImagesAutomatically());
+ }
}
break;
case SettingsDelegate::TextAutosizingChange:
- // FIXME: I wonder if this needs to traverse frames like in WebViewImpl::resize, or whether there is only one document per Settings instance?
+ if (!mainFrame() || !mainFrame()->isLocalFrame())
+ break;
+ if (TextAutosizer* textAutosizer = deprecatedLocalMainFrame()->document()->textAutosizer())
+ textAutosizer->updatePageInfoInAllFrames();
+ break;
+ case SettingsDelegate::ScriptEnableChange:
+ m_inspectorController->scriptsEnabled(settings().scriptEnabled());
+ break;
+ case SettingsDelegate::FontFamilyChange:
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext()) {
+ if (frame->isLocalFrame())
+ toLocalFrame(frame)->document()->styleEngine()->updateGenericFontFamilySettings();
+ }
+ setNeedsRecalcStyleInAllFrames();
+ break;
+ case SettingsDelegate::AcceleratedCompositingChange:
+ updateAcceleratedCompositingSettings();
+ break;
+ case SettingsDelegate::MediaQueryChange:
for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext()) {
- TextAutosizer* textAutosizer = frame->document()->textAutosizer();
- if (textAutosizer)
- textAutosizer->recalculateMultipliers();
+ if (frame->isLocalFrame())
+ toLocalFrame(frame)->document()->mediaQueryAffectingValueChanged();
}
setNeedsRecalcStyleInAllFrames();
break;
+ case SettingsDelegate::AccessibilityStateChange:
+ if (!mainFrame() || !mainFrame()->isLocalFrame())
+ break;
+ deprecatedLocalMainFrame()->document()->axObjectCacheOwner().clearAXObjectCache();
+ }
+}
+
+void Page::updateAcceleratedCompositingSettings()
+{
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext()) {
+ if (!frame->isLocalFrame())
+ continue;
+ if (FrameView* view = toLocalFrame(frame)->view())
+ view->updateAcceleratedCompositingSettings();
}
}
-void Page::didCommitLoad(Frame* frame)
+void Page::didCommitLoad(LocalFrame* frame)
{
lifecycleNotifier().notifyDidCommitLoad(frame);
- if (m_mainFrame == frame)
+ if (m_mainFrame == frame) {
+ frame->console().clearMessages();
useCounter().didCommitLoad();
+ m_inspectorController->didCommitLoadForMainFrame();
+ UserGestureIndicator::clearProcessedUserGestureSinceLoad();
+ }
+}
+
+void Page::acceptLanguagesChanged()
+{
+ WillBeHeapVector<RefPtrWillBeMember<LocalFrame>> frames;
+
+ // Even though we don't fire an event from here, the LocalDOMWindow's will fire
+ // an event so we keep the frames alive until we are done.
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext()) {
+ if (frame->isLocalFrame())
+ frames.append(toLocalFrame(frame));
+ }
+
+ for (unsigned i = 0; i < frames.size(); ++i)
+ frames[i]->domWindow()->acceptLanguagesChanged();
}
PageLifecycleNotifier& Page::lifecycleNotifier()
return static_cast<PageLifecycleNotifier&>(LifecycleContext<Page>::lifecycleNotifier());
}
-PassOwnPtr<LifecycleNotifier<Page> > Page::createLifecycleNotifier()
+PassOwnPtr<LifecycleNotifier<Page>> Page::createLifecycleNotifier()
{
return PageLifecycleNotifier::create(this);
}
+void Page::trace(Visitor* visitor)
+{
+#if ENABLE(OILPAN)
+ visitor->trace(m_animator);
+ visitor->trace(m_dragCaretController);
+ visitor->trace(m_dragController);
+ visitor->trace(m_focusController);
+ visitor->trace(m_contextMenuController);
+ visitor->trace(m_inspectorController);
+ visitor->trace(m_pointerLockController);
+ visitor->trace(m_undoStack);
+ visitor->trace(m_mainFrame);
+ visitor->trace(m_validationMessageClient);
+ visitor->trace(m_multisamplingChangedObservers);
+ visitor->trace(m_frameHost);
+ HeapSupplementable<Page>::trace(visitor);
+#endif
+ LifecycleContext<Page>::trace(visitor);
+}
+
+void Page::willBeDestroyed()
+{
+ // Destroy inspector first, since it uses frame and view during destruction.
+ m_inspectorController->willBeDestroyed();
+
+ RefPtrWillBeRawPtr<Frame> mainFrame = m_mainFrame;
+
+ mainFrame->detach();
+
+ if (mainFrame->isLocalFrame()) {
+ toLocalFrame(mainFrame.get())->setView(nullptr);
+ } else {
+ ASSERT(m_mainFrame->isRemoteFrame());
+ toRemoteFrame(mainFrame.get())->setView(nullptr);
+ }
+
+ allPages().remove(this);
+ if (ordinaryPages().contains(this))
+ ordinaryPages().remove(this);
+
+ if (m_scrollingCoordinator)
+ m_scrollingCoordinator->willBeDestroyed();
+
+#ifndef NDEBUG
+ pageCounter.decrement();
+#endif
+
+ m_chrome->willBeDestroyed();
+ if (m_validationMessageClient)
+ m_validationMessageClient->willBeDestroyed();
+ m_mainFrame = nullptr;
+}
+
Page::PageClients::PageClients()
- : chromeClient(0)
- , contextMenuClient(0)
- , editorClient(0)
- , dragClient(0)
- , inspectorClient(0)
- , backForwardClient(0)
- , spellCheckerClient(0)
+ : chromeClient(nullptr)
+ , contextMenuClient(nullptr)
+ , editorClient(nullptr)
+ , dragClient(nullptr)
+ , inspectorClient(nullptr)
+ , spellCheckerClient(nullptr)
+ , storageClient(nullptr)
{
}
{
}
-} // namespace WebCore
+} // namespace blink