nsLayoutHistoryState.cpp (4571B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 /* 8 * container for information saved in session history when the document 9 * is not 10 */ 11 12 #include "mozilla/PresState.h" 13 #include "mozilla/UniquePtr.h" 14 #include "nsILayoutHistoryState.h" 15 #include "nsTHashMap.h" 16 #include "nsWeakReference.h" 17 18 using namespace mozilla; 19 20 class nsLayoutHistoryState final : public nsILayoutHistoryState, 21 public nsSupportsWeakReference { 22 public: 23 nsLayoutHistoryState() : mScrollPositionOnly(false) {} 24 25 NS_DECL_ISUPPORTS 26 NS_DECL_NSILAYOUTHISTORYSTATE 27 28 private: 29 ~nsLayoutHistoryState() = default; 30 bool mScrollPositionOnly; 31 32 nsTHashMap<nsCString, UniquePtr<PresState>> mStates; 33 }; 34 35 already_AddRefed<nsILayoutHistoryState> NS_NewLayoutHistoryState() { 36 return MakeAndAddRef<nsLayoutHistoryState>(); 37 } 38 39 NS_IMPL_ISUPPORTS(nsLayoutHistoryState, nsILayoutHistoryState, 40 nsISupportsWeakReference) 41 42 NS_IMETHODIMP 43 nsLayoutHistoryState::GetHasStates(bool* aHasStates) { 44 *aHasStates = HasStates(); 45 return NS_OK; 46 } 47 48 NS_IMETHODIMP 49 nsLayoutHistoryState::GetKeys(nsTArray<nsCString>& aKeys) { 50 if (!HasStates()) { 51 return NS_ERROR_FAILURE; 52 } 53 54 AppendToArray(aKeys, mStates.Keys()); 55 56 return NS_OK; 57 } 58 59 NS_IMETHODIMP 60 nsLayoutHistoryState::GetPresState(const nsACString& aKey, float* aScrollX, 61 float* aScrollY, 62 bool* aAllowScrollOriginDowngrade, 63 float* aRes) { 64 PresState* state = GetState(nsCString(aKey)); 65 66 if (!state) { 67 return NS_ERROR_FAILURE; 68 } 69 70 *aScrollX = state->scrollState().x; 71 *aScrollY = state->scrollState().y; 72 *aAllowScrollOriginDowngrade = state->allowScrollOriginDowngrade(); 73 *aRes = state->resolution(); 74 75 return NS_OK; 76 } 77 78 NS_IMETHODIMP 79 nsLayoutHistoryState::AddNewPresState(const nsACString& aKey, float aScrollX, 80 float aScrollY, 81 bool aAllowScrollOriginDowngrade, 82 float aRes) { 83 UniquePtr<PresState> newState = NewPresState(); 84 newState->scrollState() = nsPoint(aScrollX, aScrollY); 85 newState->allowScrollOriginDowngrade() = aAllowScrollOriginDowngrade; 86 newState->resolution() = aRes; 87 88 mStates.InsertOrUpdate(nsCString(aKey), std::move(newState)); 89 90 return NS_OK; 91 } 92 93 void nsLayoutHistoryState::AddState(const nsCString& aStateKey, 94 UniquePtr<PresState> aState) { 95 mStates.InsertOrUpdate(aStateKey, std::move(aState)); 96 } 97 98 PresState* nsLayoutHistoryState::GetState(const nsCString& aKey) { 99 auto statePtr = mStates.Lookup(aKey); 100 if (!statePtr) { 101 return nullptr; 102 } 103 PresState* state = statePtr->get(); 104 105 if (mScrollPositionOnly) { 106 // Ensure any state that shouldn't be restored is removed 107 state->contentData() = void_t(); 108 state->disabledSet() = false; 109 } 110 111 return state; 112 } 113 114 void nsLayoutHistoryState::RemoveState(const nsCString& aKey) { 115 mStates.Remove(aKey); 116 } 117 118 bool nsLayoutHistoryState::HasStates() { return mStates.Count() != 0; } 119 120 void nsLayoutHistoryState::SetScrollPositionOnly(const bool aFlag) { 121 mScrollPositionOnly = aFlag; 122 } 123 124 void nsLayoutHistoryState::ResetScrollState() { 125 for (const auto& state : mStates.Values()) { 126 if (state) { 127 state->scrollState() = nsPoint(0, 0); 128 } 129 } 130 } 131 132 void nsLayoutHistoryState::GetContents(bool* aScrollPositionOnly, 133 nsTArray<nsCString>& aKeys, 134 nsTArray<mozilla::PresState>& aStates) { 135 *aScrollPositionOnly = mScrollPositionOnly; 136 aKeys.SetCapacity(mStates.Count()); 137 aStates.SetCapacity(mStates.Count()); 138 for (const auto& entry : mStates) { 139 aKeys.AppendElement(entry.GetKey()); 140 aStates.AppendElement(*(entry.GetData().get())); 141 } 142 } 143 144 void nsLayoutHistoryState::Reset() { 145 mScrollPositionOnly = false; 146 mStates.Clear(); 147 } 148 149 namespace mozilla { 150 UniquePtr<PresState> NewPresState() { 151 return MakeUnique<PresState>( 152 /* contentData */ mozilla::void_t(), 153 /* scrollState */ nsPoint(0, 0), 154 /* allowScrollOriginDowngrade */ true, 155 /* resolution */ 1.0, 156 /* disabledSet */ false, 157 /* disabled */ false, 158 /* droppedDown */ false); 159 } 160 } // namespace mozilla