diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/page/Page.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/core/page/Page.cpp | 394 |
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) { } |