summaryrefslogtreecommitdiff
path: root/chromium/third_party/WebKit/Source/core/page/Page.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/page/Page.cpp')
-rw-r--r--chromium/third_party/WebKit/Source/core/page/Page.cpp394
1 files changed, 101 insertions, 293 deletions
diff --git a/chromium/third_party/WebKit/Source/core/page/Page.cpp b/chromium/third_party/WebKit/Source/core/page/Page.cpp
index d1b954d47f6..4f2de052953 100644
--- a/chromium/third_party/WebKit/Source/core/page/Page.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/Page.cpp
@@ -22,12 +22,17 @@
#include "core/dom/ClientRectList.h"
#include "core/dom/DocumentMarkerController.h"
-#include "core/dom/Event.h"
-#include "core/dom/EventNames.h"
#include "core/dom/StyleEngine.h"
#include "core/dom/VisitedLinkState.h"
#include "core/editing/Caret.h"
-#include "core/history/BackForwardController.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/FrameView.h"
#include "core/history/HistoryItem.h"
#include "core/inspector/InspectorController.h"
#include "core/inspector/InspectorInstrumentation.h"
@@ -35,24 +40,23 @@
#include "core/loader/ProgressTracker.h"
#include "core/page/AutoscrollController.h"
#include "core/page/Chrome.h"
+#include "core/page/ChromeClient.h"
#include "core/page/ContextMenuController.h"
-#include "core/page/DOMTimer.h"
#include "core/page/DragController.h"
#include "core/page/FocusController.h"
-#include "core/page/Frame.h"
#include "core/page/FrameTree.h"
-#include "core/page/FrameView.h"
#include "core/page/PageConsole.h"
#include "core/page/PageGroup.h"
#include "core/page/PageLifecycleNotifier.h"
#include "core/page/PointerLockController.h"
-#include "core/page/Settings.h"
+#include "core/frame/Settings.h"
#include "core/page/ValidationMessageClient.h"
#include "core/page/scrolling/ScrollingCoordinator.h"
-#include "core/platform/network/NetworkStateNotifier.h"
-#include "core/plugins/PluginData.h"
#include "core/rendering/RenderView.h"
+#include "core/rendering/TextAutosizer.h"
#include "core/storage/StorageNamespace.h"
+#include "core/workers/SharedWorkerRepositoryClient.h"
+#include "platform/plugins/PluginData.h"
#include "wtf/HashMap.h"
#include "wtf/RefCountedLeakCounter.h"
#include "wtf/StdLibExtras.h"
@@ -64,21 +68,24 @@ static HashSet<Page*>* allPages;
DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, pageCounter, ("Page"));
-static void networkStateChanged()
+void Page::networkStateChanged(bool online)
{
+ if (!allPages)
+ return;
+
Vector<RefPtr<Frame> > 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())
+ for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree().traverseNext())
frames.append(frame);
- InspectorInstrumentation::networkStateChanged(*it);
+ InspectorInstrumentation::networkStateChanged(*it, online);
}
- AtomicString eventName = networkStateNotifier().onLine() ? eventNames().onlineEvent : eventNames().offlineEvent;
+ AtomicString eventName = online ? EventTypeNames::online : EventTypeNames::offline;
for (unsigned i = 0; i < frames.size(); i++)
- frames[i]->document()->dispatchWindowEvent(Event::create(eventName));
+ frames[i]->domWindow()->dispatchEvent(Event::create(eventName));
}
float deviceScaleFactor(Frame* frame)
@@ -92,7 +99,8 @@ float deviceScaleFactor(Frame* frame)
}
Page::Page(PageClients& pageClients)
- : m_autoscrollController(AutoscrollController::create())
+ : SettingsDelegate(Settings::create())
+ , m_autoscrollController(AutoscrollController::create(*this))
, m_chrome(Chrome::create(this, pageClients.chromeClient))
, m_dragCaretController(DragCaretController::create())
, m_dragController(DragController::create(this, pageClients.dragClient))
@@ -100,24 +108,24 @@ Page::Page(PageClients& pageClients)
, m_contextMenuController(ContextMenuController::create(this, pageClients.contextMenuClient))
, m_inspectorController(InspectorController::create(this, pageClients.inspectorClient))
, m_pointerLockController(PointerLockController::create(this))
- , m_settings(Settings::create(this))
+ , m_historyController(adoptPtr(new HistoryController(this)))
, m_progress(ProgressTracker::create())
- , m_backForwardController(BackForwardController::create(this, pageClients.backForwardClient))
+ , m_undoStack(UndoStack::create())
+ , m_backForwardClient(pageClients.backForwardClient)
, m_editorClient(pageClients.editorClient)
, m_validationMessageClient(0)
+ , m_sharedWorkerRepositoryClient(0)
+ , m_spellCheckerClient(pageClients.spellCheckerClient)
, m_subframeCount(0)
, m_openedByDOM(false)
, m_tabKeyCyclesThroughElements(true)
, m_defersLoading(false)
, m_pageScaleFactor(1)
, m_deviceScaleFactor(1)
- , m_didLoadUserStyleSheet(false)
, m_group(0)
, m_timerAlignmentInterval(DOMTimer::visiblePageAlignmentInterval())
, m_visibilityState(PageVisibilityStateVisible)
, m_isCursorVisible(true)
- , m_layoutMilestones(0)
- , m_isCountingRelevantRepaintedObjects(false)
#ifndef NDEBUG
, m_isPainting(false)
#endif
@@ -125,12 +133,9 @@ Page::Page(PageClients& pageClients)
{
ASSERT(m_editorClient);
- if (!allPages) {
+ if (!allPages)
allPages = new HashSet<Page*>;
- networkStateNotifier().setNetworkStateChangedFunction(networkStateChanged);
- }
-
ASSERT(!allPages->contains(this));
allPages->add(this);
@@ -145,7 +150,7 @@ Page::~Page()
clearPageGroup();
allPages->remove(this);
- for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext()) {
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext()) {
frame->willDetachPage();
frame->detachFromPage();
}
@@ -160,65 +165,11 @@ Page::~Page()
#endif
}
-ViewportArguments Page::viewportArguments() const
-{
- return mainFrame() && mainFrame()->document() ? mainFrame()->document()->viewportArguments() : ViewportArguments();
-}
-
-bool Page::autoscrollInProgress() const
-{
- return m_autoscrollController->autoscrollInProgress();
-}
-
-bool Page::autoscrollInProgress(const RenderBox* renderer) const
-{
- return m_autoscrollController->autoscrollInProgress(renderer);
-}
-
-bool Page::panScrollInProgress() const
-{
- return m_autoscrollController->panScrollInProgress();
-}
-
-void Page::startAutoscrollForSelection(RenderObject* renderer)
-{
- return m_autoscrollController->startAutoscrollForSelection(renderer);
-}
-
-void Page::stopAutoscrollIfNeeded(RenderObject* renderer)
-{
- m_autoscrollController->stopAutoscrollIfNeeded(renderer);
-}
-
-
-void Page::stopAutoscrollTimer()
-{
- m_autoscrollController->stopAutoscrollTimer();
-}
-
-void Page::updateAutoscrollRenderer()
-{
- m_autoscrollController->updateAutoscrollRenderer();
-}
-
-void Page::updateDragAndDrop(Node* dropTargetNode, const IntPoint& eventPosition, double eventTime)
-{
- m_autoscrollController->updateDragAndDrop(dropTargetNode, eventPosition, eventTime);
-}
-
-#if OS(WIN)
-void Page::handleMouseReleaseForPanScrolling(Frame* frame, const PlatformMouseEvent& point)
+ViewportDescription Page::viewportDescription() const
{
- m_autoscrollController->handleMouseReleaseForPanScrolling(frame, point);
+ return mainFrame() && mainFrame()->document() ? mainFrame()->document()->viewportDescription() : ViewportDescription();
}
-void Page::startPanScrolling(RenderBox* renderer, const IntPoint& point)
-{
- m_autoscrollController->startPanScrolling(renderer, point);
-}
-#endif
-
-
ScrollingCoordinator* Page::scrollingCoordinator()
{
if (!m_scrollingCoordinator && m_settings->scrollingCoordinatorEnabled())
@@ -229,9 +180,6 @@ ScrollingCoordinator* Page::scrollingCoordinator()
String Page::mainThreadScrollingReasonsAsText()
{
- if (Document* document = m_mainFrame->document())
- document->updateLayout();
-
if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
return scrollingCoordinator->mainThreadScrollingReasonsAsText();
@@ -265,6 +213,8 @@ void Page::documentDetached(Document* document)
m_contextMenuController->documentDetached(document);
if (m_validationMessageClient)
m_validationMessageClient->documentDetached(*document);
+ if (m_sharedWorkerRepositoryClient)
+ m_sharedWorkerRepositoryClient->documentDetached(document);
}
bool Page::openedByDOM() const
@@ -277,18 +227,6 @@ void Page::setOpenedByDOM()
m_openedByDOM = true;
}
-void Page::goToItem(HistoryItem* item)
-{
- // stopAllLoaders may end up running onload handlers, which could cause further history traversals that may lead to the passed in HistoryItem
- // being deref()-ed. Make sure we can still use it with HistoryController::goToItem later.
- RefPtr<HistoryItem> protector(item);
-
- if (m_mainFrame->loader()->history()->shouldStopLoadingForHistoryItem(item))
- m_mainFrame->loader()->stopAllLoaders();
-
- m_mainFrame->loader()->history()->goToItem(item);
-}
-
void Page::clearPageGroup()
{
if (!m_group)
@@ -302,9 +240,6 @@ void Page::setGroupType(PageGroupType type)
clearPageGroup();
switch (type) {
- case InspectorPageGroup:
- m_group = PageGroup::inspectorGroup();
- break;
case PrivatePageGroup:
m_group = PageGroup::create();
break;
@@ -322,13 +257,13 @@ void Page::scheduleForcedStyleRecalcForAllPages()
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())
+ for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree().traverseNext())
frame->document()->setNeedsStyleRecalc();
}
void Page::setNeedsRecalcStyleInAllFrames()
{
- for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext())
frame->document()->styleResolverChanged(RecalcStyleDeferred);
}
@@ -352,19 +287,19 @@ void Page::refreshPlugins(bool reload)
if (!reload)
continue;
- for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree()->traverseNext()) {
- if (frame->loader()->containsPlugins())
+ for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree().traverseNext()) {
+ if (frame->document()->containsPlugins())
framesNeedingReload.append(frame);
}
}
for (size_t i = 0; i < framesNeedingReload.size(); ++i)
- framesNeedingReload[i]->loader()->reload();
+ framesNeedingReload[i]->loader().reload();
}
PluginData* Page::pluginData() const
{
- if (!mainFrame()->loader()->allowPlugins(NotAboutToInstantiatePlugin))
+ if (!mainFrame()->loader().allowPlugins(NotAboutToInstantiatePlugin))
return 0;
if (!m_pluginData)
m_pluginData = PluginData::create(this);
@@ -374,8 +309,8 @@ PluginData* Page::pluginData() const
static Frame* incrementFrame(Frame* curr, bool forward, bool wrapFlag)
{
return forward
- ? curr->tree()->traverseNextWithWrap(wrapFlag)
- : curr->tree()->traversePreviousWithWrap(wrapFlag);
+ ? curr->tree().traverseNextWithWrap(wrapFlag)
+ : curr->tree().traversePreviousWithWrap(wrapFlag);
}
void Page::unmarkAllTextMatches()
@@ -396,8 +331,9 @@ void Page::setDefersLoading(bool defers)
return;
m_defersLoading = defers;
- for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
- frame->loader()->setDefersLoading(defers);
+ m_historyController->setDefersLoading(defers);
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext())
+ frame->loader().setDefersLoading(defers);
}
void Page::setPageScaleFactor(float scale, const IntPoint& origin)
@@ -411,6 +347,7 @@ void Page::setPageScaleFactor(float scale, const IntPoint& origin)
view->setVisibleContentScaleFactor(scale);
mainFrame()->deviceOrPageScaleFactorChanged();
+ m_chrome->client().deviceOrPageScaleFactorChanged();
if (view)
view->setViewportConstrainedObjectsNeedLayout();
@@ -428,8 +365,10 @@ void Page::setDeviceScaleFactor(float scaleFactor)
m_deviceScaleFactor = scaleFactor;
setNeedsRecalcStyleInAllFrames();
- if (mainFrame())
+ if (mainFrame()) {
mainFrame()->deviceOrPageScaleFactorChanged();
+ m_chrome->client().deviceOrPageScaleFactorChanged();
+ }
}
void Page::setPagination(const Pagination& pagination)
@@ -442,36 +381,6 @@ void Page::setPagination(const Pagination& pagination)
setNeedsRecalcStyleInAllFrames();
}
-void Page::userStyleSheetLocationChanged()
-{
- // FIXME: Eventually we will move to a model of just being handed the sheet
- // text instead of loading the URL ourselves.
- KURL url = m_settings->userStyleSheetLocation();
-
- m_didLoadUserStyleSheet = false;
- m_userStyleSheet = String();
-
- // Data URLs with base64-encoded UTF-8 style sheets are common. We can process them
- // synchronously and avoid using a loader.
- if (url.protocolIsData() && url.string().startsWith("data:text/css;charset=utf-8;base64,")) {
- m_didLoadUserStyleSheet = true;
-
- Vector<char> styleSheetAsUTF8;
- if (base64Decode(decodeURLEscapeSequences(url.string().substring(35)), styleSheetAsUTF8, Base64IgnoreWhitespace))
- m_userStyleSheet = String::fromUTF8(styleSheetAsUTF8.data(), styleSheetAsUTF8.size());
- }
-
- for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext()) {
- if (frame->document())
- frame->document()->styleEngine()->updatePageUserSheet();
- }
-}
-
-const String& Page::userStyleSheet() const
-{
- return m_userStyleSheet;
-}
-
void Page::allVisitedStateChanged(PageGroup* group)
{
ASSERT(group);
@@ -483,8 +392,8 @@ void Page::allVisitedStateChanged(PageGroup* group)
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.get(); frame; frame = frame->tree().traverseNext())
+ frame->document()->visitedLinkState().invalidateStyleForAllLinks();
}
}
@@ -499,8 +408,8 @@ void Page::visitedStateChanged(PageGroup* group, LinkHash linkHash)
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.get(); frame; frame = frame->tree().traverseNext())
+ frame->document()->visitedLinkState().invalidateStyleForLink(linkHash);
}
}
@@ -517,7 +426,7 @@ void Page::setTimerAlignmentInterval(double interval)
return;
m_timerAlignmentInterval = interval;
- for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNextWithWrap(false)) {
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNextWithWrap(false)) {
if (frame->document())
frame->document()->didChangeTimerAlignmentInterval();
}
@@ -528,19 +437,13 @@ double Page::timerAlignmentInterval() const
return m_timerAlignmentInterval;
}
-void Page::dnsPrefetchingStateChanged()
-{
- for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
- frame->document()->initDNSPrefetch();
-}
-
#if !ASSERT_DISABLED
void Page::checkSubframeCountConsistency() const
{
ASSERT(m_subframeCount >= 0);
int subframeCount = 0;
- for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext())
++subframeCount;
ASSERT(m_subframeCount + 1 == subframeCount);
@@ -559,7 +462,7 @@ void Page::setVisibilityState(PageVisibilityState visibilityState, bool isInitia
setTimerAlignmentInterval(DOMTimer::visiblePageAlignmentInterval());
if (!isInitialState)
- lifecycleNotifier()->notifyPageVisibilityChanged();
+ lifecycleNotifier().notifyPageVisibilityChanged();
if (!isInitialState && m_mainFrame)
m_mainFrame->dispatchVisibilityStateChangeEvent();
@@ -570,138 +473,6 @@ PageVisibilityState Page::visibilityState() const
return m_visibilityState;
}
-void Page::addLayoutMilestones(LayoutMilestones milestones)
-{
- // In the future, we may want a function that replaces m_layoutMilestones instead of just adding to it.
- m_layoutMilestones |= milestones;
-}
-
-// These are magical constants that might be tweaked over time.
-static double gMinimumPaintedAreaRatio = 0.1;
-static double gMaximumUnpaintedAreaRatio = 0.04;
-
-bool Page::isCountingRelevantRepaintedObjects() const
-{
- return m_isCountingRelevantRepaintedObjects && (m_layoutMilestones & DidHitRelevantRepaintedObjectsAreaThreshold);
-}
-
-void Page::startCountingRelevantRepaintedObjects()
-{
- // Reset everything in case we didn't hit the threshold last time.
- resetRelevantPaintedObjectCounter();
-
- m_isCountingRelevantRepaintedObjects = true;
-}
-
-void Page::resetRelevantPaintedObjectCounter()
-{
- m_isCountingRelevantRepaintedObjects = false;
- m_relevantUnpaintedRenderObjects.clear();
- m_topRelevantPaintedRegion = Region();
- m_bottomRelevantPaintedRegion = Region();
- m_relevantUnpaintedRegion = Region();
-}
-
-static LayoutRect relevantViewRect(RenderView* view)
-{
- // DidHitRelevantRepaintedObjectsAreaThreshold is a LayoutMilestone intended to indicate that
- // a certain relevant amount of content has been drawn to the screen. This is the rect that
- // has been determined to be relevant in the context of this goal. We may choose to tweak
- // the rect over time, much like we may choose to tweak gMinimumPaintedAreaRatio and
- // gMaximumUnpaintedAreaRatio. But this seems to work well right now.
- LayoutRect relevantViewRect = LayoutRect(0, 0, 980, 1300);
-
- LayoutRect viewRect = view->viewRect();
- // If the viewRect is wider than the relevantViewRect, center the relevantViewRect.
- if (viewRect.width() > relevantViewRect.width())
- relevantViewRect.setX((viewRect.width() - relevantViewRect.width()) / 2);
-
- return relevantViewRect;
-}
-
-void Page::addRelevantRepaintedObject(RenderObject* object, const LayoutRect& objectPaintRect)
-{
- if (!isCountingRelevantRepaintedObjects())
- return;
-
- // Objects inside sub-frames are not considered to be relevant.
- if (object->document().frame() != mainFrame())
- return;
-
- RenderView* view = object->view();
- if (!view)
- return;
-
- LayoutRect relevantRect = relevantViewRect(view);
-
- // The objects are only relevant if they are being painted within the viewRect().
- if (!objectPaintRect.intersects(pixelSnappedIntRect(relevantRect)))
- return;
-
- IntRect snappedPaintRect = pixelSnappedIntRect(objectPaintRect);
-
- // If this object was previously counted as an unpainted object, remove it from that HashSet
- // and corresponding Region. FIXME: This doesn't do the right thing if the objects overlap.
- HashSet<RenderObject*>::iterator it = m_relevantUnpaintedRenderObjects.find(object);
- if (it != m_relevantUnpaintedRenderObjects.end()) {
- m_relevantUnpaintedRenderObjects.remove(it);
- m_relevantUnpaintedRegion.subtract(snappedPaintRect);
- }
-
- // Split the relevantRect into a top half and a bottom half. Making sure we have coverage in
- // both halves helps to prevent cases where we have a fully loaded menu bar or masthead with
- // no content beneath that.
- LayoutRect topRelevantRect = relevantRect;
- topRelevantRect.contract(LayoutSize(0, relevantRect.height() / 2));
- LayoutRect bottomRelevantRect = topRelevantRect;
- bottomRelevantRect.setY(relevantRect.height() / 2);
-
- // If the rect straddles both Regions, split it appropriately.
- if (topRelevantRect.intersects(snappedPaintRect) && bottomRelevantRect.intersects(snappedPaintRect)) {
- IntRect topIntersection = snappedPaintRect;
- topIntersection.intersect(pixelSnappedIntRect(topRelevantRect));
- m_topRelevantPaintedRegion.unite(topIntersection);
-
- IntRect bottomIntersection = snappedPaintRect;
- bottomIntersection.intersect(pixelSnappedIntRect(bottomRelevantRect));
- m_bottomRelevantPaintedRegion.unite(bottomIntersection);
- } else if (topRelevantRect.intersects(snappedPaintRect))
- m_topRelevantPaintedRegion.unite(snappedPaintRect);
- else
- m_bottomRelevantPaintedRegion.unite(snappedPaintRect);
-
- float topPaintedArea = m_topRelevantPaintedRegion.totalArea();
- float bottomPaintedArea = m_bottomRelevantPaintedRegion.totalArea();
- float viewArea = relevantRect.width() * relevantRect.height();
-
- float ratioThatIsPaintedOnTop = topPaintedArea / viewArea;
- float ratioThatIsPaintedOnBottom = bottomPaintedArea / viewArea;
- float ratioOfViewThatIsUnpainted = m_relevantUnpaintedRegion.totalArea() / viewArea;
-
- if (ratioThatIsPaintedOnTop > (gMinimumPaintedAreaRatio / 2) && ratioThatIsPaintedOnBottom > (gMinimumPaintedAreaRatio / 2)
- && ratioOfViewThatIsUnpainted < gMaximumUnpaintedAreaRatio) {
- m_isCountingRelevantRepaintedObjects = false;
- resetRelevantPaintedObjectCounter();
- if (Frame* frame = mainFrame())
- frame->loader()->didLayout(DidHitRelevantRepaintedObjectsAreaThreshold);
- }
-}
-
-void Page::addRelevantUnpaintedObject(RenderObject* object, const LayoutRect& objectPaintRect)
-{
- if (!isCountingRelevantRepaintedObjects())
- return;
-
- // The objects are only relevant if they are being painted within the relevantViewRect().
- if (RenderView* view = object->view()) {
- if (!objectPaintRect.intersects(pixelSnappedIntRect(relevantViewRect(view))))
- return;
- }
-
- m_relevantUnpaintedRenderObjects.add(object);
- m_relevantUnpaintedRegion.unite(pixelSnappedIntRect(objectPaintRect));
-}
-
void Page::addMultisamplingChangedObserver(MultisamplingChangedObserver* observer)
{
m_multisamplingChangedObservers.add(observer);
@@ -712,26 +483,61 @@ void Page::removeMultisamplingChangedObserver(MultisamplingChangedObserver* obse
m_multisamplingChangedObservers.remove(observer);
}
-void Page::multisamplingChanged()
+void Page::settingsChanged(SettingsDelegate::ChangeType changeType)
{
- HashSet<MultisamplingChangedObserver*>::iterator stop = m_multisamplingChangedObservers.end();
- for (HashSet<MultisamplingChangedObserver*>::iterator it = m_multisamplingChangedObservers.begin(); it != stop; ++it)
- (*it)->multisamplingChanged(m_settings->openGLMultisamplingEnabled());
+ switch (changeType) {
+ case SettingsDelegate::StyleChange:
+ setNeedsRecalcStyleInAllFrames();
+ break;
+ case SettingsDelegate::ViewportDescriptionChange:
+ if (mainFrame())
+ mainFrame()->document()->updateViewportDescription();
+ break;
+ case SettingsDelegate::MediaTypeChange:
+ m_mainFrame->view()->setMediaType(settings().mediaTypeOverride());
+ setNeedsRecalcStyleInAllFrames();
+ break;
+ case SettingsDelegate::DNSPrefetchingChange:
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext())
+ 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());
+ 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());
+ }
+ 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?
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext()) {
+ TextAutosizer* textAutosizer = frame->document()->textAutosizer();
+ if (textAutosizer)
+ textAutosizer->recalculateMultipliers();
+ }
+ setNeedsRecalcStyleInAllFrames();
+ break;
+ }
}
void Page::didCommitLoad(Frame* frame)
{
- lifecycleNotifier()->notifyDidCommitLoad(frame);
+ lifecycleNotifier().notifyDidCommitLoad(frame);
if (m_mainFrame == frame)
useCounter().didCommitLoad();
}
-PageLifecycleNotifier* Page::lifecycleNotifier()
+PageLifecycleNotifier& Page::lifecycleNotifier()
{
- return static_cast<PageLifecycleNotifier*>(LifecycleContext::lifecycleNotifier());
+ return static_cast<PageLifecycleNotifier&>(LifecycleContext<Page>::lifecycleNotifier());
}
-PassOwnPtr<LifecycleNotifier> Page::createLifecycleNotifier()
+PassOwnPtr<LifecycleNotifier<Page> > Page::createLifecycleNotifier()
{
return PageLifecycleNotifier::create(this);
}
@@ -742,6 +548,8 @@ Page::PageClients::PageClients()
, editorClient(0)
, dragClient(0)
, inspectorClient(0)
+ , backForwardClient(0)
+ , spellCheckerClient(0)
{
}