18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedPage.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "CSSStyleSelector.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FocusController.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "FrameView.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h"
34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/CurrentTime.h>
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/RefCountedLeakCounter.h>
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace JSC;
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic WTF::RefCountedLeakCounter cachedPageCounter("CachedPage");
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CachedPage> CachedPage::create(Page* page)
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return adoptRef(new CachedPage(page));
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCachedPage::CachedPage(Page* page)
51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    : m_timeStamp(currentTime())
528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    , m_cachedMainFrame(CachedFrame::create(page->mainFrame()))
532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_needStyleRecalcForVisitedLinks(false)
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cachedPageCounter.increment();
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCachedPage::~CachedPage()
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cachedPageCounter.decrement();
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    destroy();
67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(!m_cachedMainFrame);
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CachedPage::restore(Page* page)
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(m_cachedMainFrame);
738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    ASSERT(page && page->mainFrame() && page->mainFrame() == m_cachedMainFrame->view()->frame());
74d0825bca7fe65beaee391d30da42e937db621564Steve Block    ASSERT(!page->frameCount());
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
76231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_cachedMainFrame->open();
77231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Restore the focus appearance for the focused element.
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Right now we don't support pages w/ frames in the b/f cache.  This may need to be tweaked when we add support for that.
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Document* focusedDocument = page->focusController()->focusedOrMainFrame()->document();
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (Node* node = focusedDocument->focusedNode()) {
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (node->isElementNode())
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            static_cast<Element*>(node)->updateFocusAppearance(true);
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (m_needStyleRecalcForVisitedLinks) {
872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->traverseNext()) {
882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (CSSStyleSelector* styleSelector = frame->document()->styleSelector())
892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                styleSelector->allVisitedStateChanged();
902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
93231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    clear();
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CachedPage::clear()
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
98231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(m_cachedMainFrame);
99231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_cachedMainFrame->clear();
100231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_cachedMainFrame = 0;
1012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_needStyleRecalcForVisitedLinks = false;
102231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
103231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
104231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid CachedPage::destroy()
105231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
106231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_cachedMainFrame)
107231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_cachedMainFrame->destroy();
108231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
109231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_cachedMainFrame = 0;
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
113