CachedFrame::CachedFrame(Frame* frame) : m_document(frame->document()) , m_documentLoader(frame->loader()->documentLoader()) , m_view(frame->view()) , m_mousePressNode(frame->eventHandler()->mousePressNode()) , m_url(frame->loader()->url()) { #ifndef NDEBUG cachedFrameCounter().increment(); #endif ASSERT(m_document); // Active DOM objects must be suspended before we cached the frame script data m_document->suspendActiveDOMObjects(); m_cachedFrameScriptData.set(new ScriptCachedFrameData(frame)); m_document->documentWillBecomeInactive(); frame->clearTimers(); m_document->setInPageCache(true); frame->loader()->client()->savePlatformDataToCachedFrame(this); for (Frame* child = frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) m_childFrames.append(CachedFrame::create(child)); LOG(PageCache, "Finished creating CachedFrame with url %s\n", m_url.string().utf8().data()); }
CachedFrame::CachedFrame(Frame* frame) : CachedFrameBase(frame) { #ifndef NDEBUG cachedFrameCounter().increment(); #endif ASSERT(m_document); ASSERT(m_documentLoader); ASSERT(m_view); if (frame->page()->focusController()->focusedFrame() == frame) frame->page()->focusController()->setFocusedFrame(frame->page()->mainFrame()); // Custom scrollbar renderers will get reattached when the document comes out of the page cache m_view->detachCustomScrollbars(); m_document->documentWillBecomeInactive(); frame->clearTimers(); m_document->setInPageCache(true); frame->loader()->stopLoading(UnloadEventPolicyUnloadAndPageHide); // Create the CachedFrames for all Frames in the FrameTree. for (Frame* child = frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) m_childFrames.append(CachedFrame::create(child)); // Active DOM objects must be suspended before we cache the frame script data, // but after we've fired the pagehide event, in case that creates more objects. // Suspending must also happen after we've recursed over child frames, in case // those create more objects. // FIXME: It's still possible to have objects created after suspending in some cases, see http://webkit.org/b/53733 for more details. m_document->suspendScriptedAnimationControllerCallbacks(); m_document->suspendActiveDOMObjects(ActiveDOMObject::DocumentWillBecomeInactive); m_cachedFrameScriptData = adoptPtr(new ScriptCachedFrameData(frame)); frame->loader()->client()->savePlatformDataToCachedFrame(this); // Deconstruct the FrameTree, to restore it later. // We do this for two reasons: // 1 - We reuse the main frame, so when it navigates to a new page load it needs to start with a blank FrameTree. // 2 - It's much easier to destroy a CachedFrame while it resides in the PageCache if it is disconnected from its parent. for (unsigned i = 0; i < m_childFrames.size(); ++i) frame->tree()->removeChild(m_childFrames[i]->view()->frame()); if (!m_isMainFrame) frame->page()->decrementFrameCount(); frame->loader()->client()->didSaveToPageCache(); #ifndef NDEBUG if (m_isMainFrame) LOG(PageCache, "Finished creating CachedFrame for main frame url '%s' and DocumentLoader %p\n", m_url.string().utf8().data(), m_documentLoader.get()); else LOG(PageCache, "Finished creating CachedFrame for child frame with url '%s' and DocumentLoader %p\n", m_url.string().utf8().data(), m_documentLoader.get()); #endif #if ENABLE(TOUCH_EVENTS) if (m_document->hasListenerType(Document::TOUCH_LISTENER)) m_document->page()->chrome()->client()->needTouchEvents(false); #endif }
CachedFrameBase::~CachedFrameBase() { #ifndef NDEBUG cachedFrameCounter().decrement(); #endif // CachedFrames should always have had destroy() called by their parent CachedPage ASSERT(!m_document); }
CachedFrame::~CachedFrame() { #ifndef NDEBUG cachedFrameCounter().decrement(); #endif clear(); }
CachedFrame::CachedFrame(Frame* frame) : CachedFrameBase(frame) { #ifndef NDEBUG cachedFrameCounter().increment(); #endif ASSERT(m_document); ASSERT(m_documentLoader); ASSERT(m_view); // Active DOM objects must be suspended before we cached the frame script data m_document->suspendActiveDOMObjects(); m_cachedFrameScriptData.set(new ScriptCachedFrameData(frame)); // Custom scrollbar renderers will get reattached when the document comes out of the page cache m_view->detachCustomScrollbars(); m_document->documentWillBecomeInactive(); frame->clearTimers(); m_document->setInPageCache(true); frame->loader()->client()->savePlatformDataToCachedFrame(this); // Create the CachedFrames for all Frames in the FrameTree. for (Frame* child = frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) m_childFrames.append(CachedFrame::create(child)); // Deconstruct the FrameTree, to restore it later. // We do this for two reasons: // 1 - We reuse the main frame, so when it navigates to a new page load it needs to start with a blank FrameTree. // 2 - It's much easier to destroy a CachedFrame while it resides in the PageCache if it is disconnected from its parent. for (unsigned i = 0; i < m_childFrames.size(); ++i) frame->tree()->removeChild(m_childFrames[i]->view()->frame()); if (!m_isMainFrame) frame->page()->decrementFrameCount(); #ifndef NDEBUG if (m_isMainFrame) LOG(PageCache, "Finished creating CachedFrame for main frame url '%s' and DocumentLoader %p\n", m_url.string().utf8().data(), m_documentLoader.get()); else LOG(PageCache, "Finished creating CachedFrame for child frame with url '%s' and DocumentLoader %p\n", m_url.string().utf8().data(), m_documentLoader.get()); #endif #if ENABLE(TOUCH_EVENTS) if (m_document->hasListenerType(Document::TOUCH_LISTENER)) m_document->page()->chrome()->client()->needTouchEvents(false); #endif }
CachedFrame::CachedFrame(Frame* frame) : CachedFrameBase(frame) { #ifndef NDEBUG cachedFrameCounter().increment(); #endif ASSERT(m_document); ASSERT(m_documentLoader); ASSERT(m_view); if (frame->page()->focusController().focusedFrame() == frame) frame->page()->focusController().setFocusedFrame(frame->page()->mainFrame()); // Custom scrollbar renderers will get reattached when the document comes out of the page cache m_view->detachCustomScrollbars(); m_document->setInPageCache(true); frame->loader().stopLoading(UnloadEventPolicyUnloadAndPageHide); // Create the CachedFrames for all Frames in the FrameTree. for (Frame* child = frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) m_childFrames.append(CachedFrame::create(child)); // Active DOM objects must be suspended before we cache the frame script data, // but after we've fired the pagehide event, in case that creates more objects. // Suspending must also happen after we've recursed over child frames, in case // those create more objects. m_document->documentWillSuspendForPageCache(); m_document->suspendScriptedAnimationControllerCallbacks(); m_document->suspendActiveDOMObjects(ActiveDOMObject::DocumentWillBecomeInactive); m_cachedFrameScriptData = adoptPtr(new ScriptCachedFrameData(frame)); m_document->domWindow()->suspendForPageCache(); frame->loader().client()->savePlatformDataToCachedFrame(this); #if USE(ACCELERATED_COMPOSITING) if (m_isComposited && pageCache()->shouldClearBackingStores()) frame->view()->clearBackingStores(); #endif // documentWillSuspendForPageCache() can set up a layout timer on the FrameView, so clear timers after that. frame->clearTimers(); // Deconstruct the FrameTree, to restore it later. // We do this for two reasons: // 1 - We reuse the main frame, so when it navigates to a new page load it needs to start with a blank FrameTree. // 2 - It's much easier to destroy a CachedFrame while it resides in the PageCache if it is disconnected from its parent. for (unsigned i = 0; i < m_childFrames.size(); ++i) frame->tree()->removeChild(&m_childFrames[i]->view()->frame()); if (!m_isMainFrame) frame->page()->decrementSubframeCount(); frame->loader().client()->didSaveToPageCache(); #ifndef NDEBUG if (m_isMainFrame) LOG(PageCache, "Finished creating CachedFrame for main frame url '%s' and DocumentLoader %p\n", m_url.string().utf8().data(), m_documentLoader.get()); else LOG(PageCache, "Finished creating CachedFrame for child frame with url '%s' and DocumentLoader %p\n", m_url.string().utf8().data(), m_documentLoader.get()); #endif }