Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / page / Page.cpp
index 9a04916..9d3755e 100644 (file)
 #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);
+    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()) {
+            // FIXME: There is currently no way to dispatch events to out-of-process frames.
+            if (frame->isLocalFrame())
+                frames.append(toLocalFrame(frame));
+        }
         InspectorInstrumentation::networkStateChanged(*it, online);
     }
 
@@ -87,7 +101,7 @@ void Page::networkStateChanged(bool online)
         frames[i]->domWindow()->dispatchEvent(Event::create(eventName));
 }
 
-float deviceScaleFactor(Frame* frame)
+float deviceScaleFactor(LocalFrame* frame)
 {
     if (!frame)
         return 1;
@@ -99,6 +113,7 @@ float deviceScaleFactor(Frame* frame)
 
 Page::Page(PageClients& pageClients)
     : SettingsDelegate(Settings::create())
+    , m_animator(this)
     , m_autoscrollController(AutoscrollController::create(*this))
     , m_chrome(Chrome::create(this, pageClients.chromeClient))
     , m_dragCaretController(DragCaretController::create())
@@ -107,35 +122,29 @@ Page::Page(PageClients& pageClients)
     , 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_mainFrame(nullptr)
     , m_backForwardClient(pageClients.backForwardClient)
     , m_editorClient(pageClients.editorClient)
-    , m_validationMessageClient(0)
     , m_spellCheckerClient(pageClients.spellCheckerClient)
+    , m_storageClient(pageClients.storageClient)
     , m_subframeCount(0)
     , 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();
@@ -144,33 +153,24 @@ Page::Page(PageClients& pageClients)
 
 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();
@@ -184,10 +184,10 @@ String Page::mainThreadScrollingReasonsAsText()
     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())
@@ -199,14 +199,19 @@ PassRefPtr<ClientRectList> Page::nonFastScrollableRects(const Frame* frame)
     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)
@@ -223,69 +228,59 @@ void Page::setOpenedByDOM()
     m_openedByDOM = true;
 }
 
-void Page::clearPageGroup()
+void Page::scheduleForcedStyleRecalcForAllPages()
 {
-    if (!m_group)
-        return;
-    m_group->removePage(this);
-    m_group = 0;
+    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()) {
+            if (frame->isLocalFrame())
+                toLocalFrame(frame)->document()->setNeedsStyleRecalc(SubtreeStyleChange);
+        }
 }
 
-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;
+    WillBeHeapVector<RefPtrWillBeMember<LocalFrame> > framesNeedingReload;
 
-    HashSet<Page*>::iterator end = allPages->end();
-    for (HashSet<Page*>::iterator it = allPages->begin(); it != end; ++it) {
+    HashSet<Page*>::iterator end = allPages().end();
+    for (HashSet<Page*>::iterator it = allPages().begin(); it != end; ++it) {
         Page* page = *it;
 
         // 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);
+            if (frame->isLocalFrame() && toLocalFrame(frame)->document()->containsPlugins())
+                framesNeedingReload.append(toLocalFrame(frame));
         }
     }
 
@@ -295,7 +290,7 @@ void Page::refreshPlugins(bool reload)
 
 PluginData* Page::pluginData() const
 {
-    if (!mainFrame()->loader().allowPlugins(NotAboutToInstantiatePlugin))
+    if (!deprecatedLocalMainFrame()->loader().allowPlugins(NotAboutToInstantiatePlugin))
         return 0;
     if (!m_pluginData)
         m_pluginData = PluginData::create(this);
@@ -316,43 +311,63 @@ void Page::unmarkAllTextMatches()
 
     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)
@@ -361,58 +376,50 @@ void Page::setDeviceScaleFactor(float 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) {
+void Page::allVisitedStateChanged()
+{
+    HashSet<Page*>::iterator pagesEnd = ordinaryPages().end();
+    for (HashSet<Page*>::iterator it = ordinaryPages().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();
+        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) {
+    HashSet<Page*>::iterator pagesEnd = ordinaryPages().end();
+    for (HashSet<Page*>::iterator it = ordinaryPages().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 (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();
 }
 
@@ -423,8 +430,8 @@ void Page::setTimerAlignmentInterval(double interval)
 
     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();
     }
 }
 
@@ -433,7 +440,7 @@ double Page::timerAlignmentInterval() const
     return m_timerAlignmentInterval;
 }
 
-#if !ASSERT_DISABLED
+#if ENABLE(ASSERT)
 void Page::checkSubframeCountConsistency() const
 {
     ASSERT(m_subframeCount >= 0);
@@ -452,16 +459,16 @@ void Page::setVisibilityState(PageVisibilityState visibilityState, bool isInitia
         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
@@ -469,6 +476,11 @@ 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);
@@ -486,46 +498,98 @@ void Page::settingsChanged(SettingsDelegate::ChangeType changeType)
         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)
+        WillBeHeapHashSet<RawPtrWillBeWeakMember<MultisamplingChangedObserver> >::iterator stop = m_multisamplingChangedObservers.end();
+        for (WillBeHeapHashSet<RawPtrWillBeWeakMember<MultisamplingChangedObserver> >::iterator it = m_multisamplingChangedObservers.begin(); it != stop; ++it)
             (*it)->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()) {
-            TextAutosizer* textAutosizer = frame->document()->textAutosizer();
-            if (textAutosizer)
-                textAutosizer->recalculateMultipliers();
+            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()) {
+            if (frame->isLocalFrame())
+                toLocalFrame(frame)->document()->mediaQueryAffectingValueChanged();
+        }
+        setNeedsRecalcStyleInAllFrames();
+        break;
+    }
+}
+
+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()
@@ -538,6 +602,58 @@ PassOwnPtr<LifecycleNotifier<Page> > Page::createLifecycleNotifier()
     return PageLifecycleNotifier::create(this);
 }
 
+void Page::trace(Visitor* visitor)
+{
+#if ENABLE(OILPAN)
+    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)
@@ -546,6 +662,7 @@ Page::PageClients::PageClients()
     , inspectorClient(0)
     , backForwardClient(0)
     , spellCheckerClient(0)
+    , storageClient(0)
 {
 }
 
@@ -553,4 +670,4 @@ Page::PageClients::~PageClients()
 {
 }
 
-} // namespace WebCore
+} // namespace blink