1 /* 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 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 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 16 * from this software without specific prior written permission. 17 * 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 33 #include "core/history/HistoryItem.h" 34 #include "core/loader/FrameLoaderTypes.h" 35 #include "wtf/Noncopyable.h" 36 #include "wtf/RefPtr.h" 37 #include "wtf/text/WTFString.h" 38 39 namespace WebCore { 40 41 class Frame; 42 class SerializedScriptValue; 43 class StringWithDirection; 44 45 class HistoryController { 46 WTF_MAKE_NONCOPYABLE(HistoryController); 47 public: 48 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 61 void updateForCommit(); 62 void updateForSameDocumentNavigation(); 63 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 79 private: 80 friend class Page; 81 bool shouldStopLoadingForHistoryItem(HistoryItem*) const; 82 void goToItem(HistoryItem*); 83 84 void initializeItem(HistoryItem*); 85 PassRefPtr<HistoryItem> createItem(); 86 PassRefPtr<HistoryItem> createItemTree(Frame* targetFrame, bool clipAtTarget); 87 88 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*); 96 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 110 bool m_defersLoading; 111 RefPtr<HistoryItem> m_deferredItem; 112 }; 113 114 } // namespace WebCore 115 116 #endif // HistoryController_h 117