blob: 112408d6850bd1f6e8e0a67069f419efee6fd5ed [file] [log] [blame]
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +01001/*
2 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
Ben Murdoch02772c62013-07-26 10:21:05 +010010 * notice, this list of conditions and the following disclaimer.
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010011 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
Ben Murdoch02772c62013-07-26 10:21:05 +010013 * documentation and/or other materials provided with the distribution.
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010014 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15 * its contributors may be used to endorse or promote products derived
Ben Murdoch02772c62013-07-26 10:21:05 +010016 * from this software without specific prior written permission.
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010017 *
18 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#ifndef HistoryController_h
31#define HistoryController_h
32
Ben Murdoch7757ec22013-07-23 11:17:36 +010033#include "core/history/HistoryItem.h"
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010034#include "core/loader/FrameLoaderTypes.h"
Ben Murdoch591b9582013-07-10 11:41:44 +010035#include "wtf/Noncopyable.h"
36#include "wtf/RefPtr.h"
37#include "wtf/text/WTFString.h"
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010038
39namespace WebCore {
40
41class Frame;
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010042class SerializedScriptValue;
43class StringWithDirection;
44
45class HistoryController {
46 WTF_MAKE_NONCOPYABLE(HistoryController);
47public:
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010048 explicit HistoryController(Frame*);
49 ~HistoryController();
50
51 void saveScrollPositionAndViewStateToItem(HistoryItem*);
52 void clearScrollPositionAndViewState();
53 void restoreScrollPositionAndViewState();
54
55 void updateBackForwardListForFragmentScroll();
56
57 void saveDocumentState();
58 void saveDocumentAndScrollState();
59 void restoreDocumentState();
60
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010061 void updateForCommit();
62 void updateForSameDocumentNavigation();
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010063
64 HistoryItem* currentItem() const { return m_currentItem.get(); }
65 void setCurrentItem(HistoryItem*);
66 void setCurrentItemTitle(const StringWithDirection&);
67 bool currentItemShouldBeReplaced() const;
68
69 HistoryItem* previousItem() const { return m_previousItem.get(); }
70
71 HistoryItem* provisionalItem() const { return m_provisionalItem.get(); }
72 void setProvisionalItem(HistoryItem*);
73
74 void pushState(PassRefPtr<SerializedScriptValue>, const String& title, const String& url);
75 void replaceState(PassRefPtr<SerializedScriptValue>, const String& title, const String& url);
76
77 void setDefersLoading(bool);
78
79private:
80 friend class Page;
81 bool shouldStopLoadingForHistoryItem(HistoryItem*) const;
Torne (Richard Coles)81a51572013-05-13 16:52:28 +010082 void goToItem(HistoryItem*);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010083
84 void initializeItem(HistoryItem*);
85 PassRefPtr<HistoryItem> createItem();
86 PassRefPtr<HistoryItem> createItemTree(Frame* targetFrame, bool clipAtTarget);
87
Torne (Richard Coles)81a51572013-05-13 16:52:28 +010088 void updateForBackForwardNavigation();
89 void updateForReload();
90 void updateForStandardLoad();
91 void updateForRedirectWithLockedBackForwardList();
92 void updateForInitialLoadInChildFrame();
93
94 void recursiveSetProvisionalItem(HistoryItem*, HistoryItem*);
95 void recursiveGoToItem(HistoryItem*, HistoryItem*);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010096 bool isReloadTypeWithProvisionalItem(FrameLoadType);
97 void recursiveUpdateForCommit();
98 void recursiveUpdateForSameDocumentNavigation();
99 bool itemsAreClones(HistoryItem*, HistoryItem*) const;
100 bool currentFramesMatchItem(HistoryItem*) const;
101 void updateBackForwardListClippedAtTarget(bool doClip);
102 void updateCurrentItem();
103
104 Frame* m_frame;
105
106 RefPtr<HistoryItem> m_currentItem;
107 RefPtr<HistoryItem> m_previousItem;
108 RefPtr<HistoryItem> m_provisionalItem;
109
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100110 bool m_defersLoading;
111 RefPtr<HistoryItem> m_deferredItem;
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100112};
113
114} // namespace WebCore
115
116#endif // HistoryController_h