gecko-dev/docshell/shistory/ChildSHistory.h
Olli Pettay 1373bb3701 Bug 1563587, Make history.back/forward/go asynchronous, r=farre
The main part of the change is the change to ChildSHistory - make it possible to have Go() to be called asynchronously
and also let one to cancel pending history navigations. History object (window.history) can then use either the sync or
async Go(), depending on the dom.window.history.async pref.

LoadDelegate, which is used by GeckoView, needs special handling, since
it spins event loop nestedly. With session history loads and same-document loads we can just
bypass it.
To deal with same-document case, MaybeHandleSameDocumentNavigation is split to IsSameDocumentNavigation,
which collects relevant information about the request and returns true if same-document navigation should happen,
and then later HandleSameDocumentNavigation uses that information to trigger the navigation.
SameDocumentNavigationState is used to pass the information around.

referrer-policy-test-case.sub.js is buggy causing tests to pass only on Firefox with sync history API.

nested-context-navigations-iframe.html.ini is added because of https://bugzilla.mozilla.org/show_bug.cgi?id=1572932

Differential Revision: https://phabricator.services.mozilla.com/D41199

--HG--
extra : moz-landing-system : lando
2019-08-14 06:38:47 +00:00

114 lines
3.1 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/**
* ChildSHistory represents a view of session history from a child process. It
* exposes getters for some cached history state, and mutators which are
* implemented by communicating with the actual history storage in
* ParentSHistory.
*
* NOTE: Currently session history is in transition, meaning that we're still
* using the legacy nsSHistory class internally. The API exposed from this class
* should be only the API which we expect to expose when this transition is
* complete, and special cases will need to call through the LegacySHistory()
* getters.
*/
#ifndef mozilla_dom_ChildSHistory_h
#define mozilla_dom_ChildSHistory_h
#include "nsCOMPtr.h"
#include "mozilla/ErrorResult.h"
#include "nsWrapperCache.h"
#include "nsThreadUtils.h"
#include "mozilla/LinkedList.h"
class nsSHistory;
class nsDocShell;
class nsISHistory;
class nsIWebNavigation;
class nsIGlobalObject;
namespace mozilla {
namespace dom {
class ParentSHistory;
class ChildSHistory : public nsISupports, public nsWrapperCache {
public:
friend class ParentSHistory;
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(ChildSHistory)
nsISupports* GetParentObject() const;
JSObject* WrapObject(JSContext* cx,
JS::Handle<JSObject*> aGivenProto) override;
explicit ChildSHistory(nsDocShell* aDocShell);
int32_t Count();
int32_t Index();
/**
* Reload the current entry in the session history.
*/
void Reload(uint32_t aReloadFlags, ErrorResult& aRv);
/**
* The CanGo and Go methods are called with an offset from the current index.
* Positive numbers go forward in history, while negative numbers go
* backwards.
*/
bool CanGo(int32_t aOffset);
void Go(int32_t aOffset, ErrorResult& aRv);
void AsyncGo(int32_t aOffset);
void RemovePendingHistoryNavigations();
/**
* Evicts all content viewers within the current process.
*/
void EvictLocalContentViewers();
nsISHistory* LegacySHistory();
ParentSHistory* GetParentIfSameProcess();
private:
virtual ~ChildSHistory();
class PendingAsyncHistoryNavigation
: public Runnable,
public mozilla::LinkedListElement<PendingAsyncHistoryNavigation> {
public:
PendingAsyncHistoryNavigation(ChildSHistory* aHistory, int32_t aOffset)
: Runnable("PendingAsyncHistoryNavigation"),
mHistory(aHistory),
mOffset(aOffset) {}
NS_IMETHOD Run() override {
if (isInList()) {
remove();
mHistory->Go(mOffset, IgnoreErrors());
}
return NS_OK;
}
private:
RefPtr<ChildSHistory> mHistory;
int32_t mOffset;
};
RefPtr<nsDocShell> mDocShell;
RefPtr<nsSHistory> mHistory;
mozilla::LinkedList<PendingAsyncHistoryNavigation> mPendingNavigations;
};
} // namespace dom
} // namespace mozilla
#endif /* mozilla_dom_ChildSHistory_h */