tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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