summaryrefslogtreecommitdiffstats
path: root/dom/base/nsFrameLoaderOwner.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/base/nsFrameLoaderOwner.h')
-rw-r--r--dom/base/nsFrameLoaderOwner.h136
1 files changed, 136 insertions, 0 deletions
diff --git a/dom/base/nsFrameLoaderOwner.h b/dom/base/nsFrameLoaderOwner.h
new file mode 100644
index 0000000000..4aae653813
--- /dev/null
+++ b/dom/base/nsFrameLoaderOwner.h
@@ -0,0 +1,136 @@
+/* -*- 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/. */
+
+#ifndef nsFrameLoaderOwner_h_
+#define nsFrameLoaderOwner_h_
+
+#include <functional>
+#include "nsFrameLoader.h"
+#include "nsISupports.h"
+
+namespace mozilla {
+class ErrorResult;
+namespace dom {
+class BrowsingContext;
+class BrowsingContextGroup;
+class BrowserBridgeChild;
+class ContentParent;
+class Element;
+struct RemotenessOptions;
+struct NavigationIsolationOptions;
+} // namespace dom
+} // namespace mozilla
+
+// IID for the FrameLoaderOwner interface
+#define NS_FRAMELOADEROWNER_IID \
+ { \
+ 0x1b4fd25c, 0x2e57, 0x11e9, { \
+ 0x9e, 0x5a, 0x5b, 0x86, 0xe9, 0x89, 0xa5, 0xc0 \
+ } \
+ }
+
+// Mixin that handles ownership of nsFrameLoader for Frame elements
+// (XULFrameElement, HTMLI/FrameElement, etc...). Manages information when doing
+// FrameLoader swaps.
+//
+// This class is considered an XPCOM mixin. This means that while we inherit
+// from ISupports in order to be QI'able, we expect the classes that inherit
+// nsFrameLoaderOwner to actually implement ISupports for us.
+class nsFrameLoaderOwner : public nsISupports {
+ public:
+ NS_DECLARE_STATIC_IID_ACCESSOR(NS_FRAMELOADEROWNER_IID)
+
+ nsFrameLoaderOwner() = default;
+ already_AddRefed<nsFrameLoader> GetFrameLoader();
+ void SetFrameLoader(nsFrameLoader* aNewFrameLoader);
+
+ mozilla::dom::BrowsingContext* GetBrowsingContext();
+ mozilla::dom::BrowsingContext* GetExtantBrowsingContext();
+
+ // Destroy (if it exists) and recreate our frameloader, based on new
+ // remoteness requirements.
+ //
+ // This method is called by frontend code when it wants to perform a
+ // remoteness update, and allows for behaviour such as preserving
+ // BrowsingContexts across process switches during navigation.
+ //
+ // See the WebIDL definition for more details.
+ void ChangeRemoteness(const mozilla::dom::RemotenessOptions& aOptions,
+ mozilla::ErrorResult& rv);
+
+ // Like `ChangeRemoteness` but switches to an already-created
+ // `BrowserBridgeChild`. This method is used when performing remote subframe
+ // process switches.
+ void ChangeRemotenessWithBridge(mozilla::dom::BrowserBridgeChild* aBridge,
+ mozilla::ErrorResult& rv);
+
+ // Like `ChangeRemoteness`, but switches into an already-created
+ // `ContentParent`. This method is used when performing toplevel process
+ // switches. If `aContentParent` is nullptr, switches into the parent process.
+ //
+ // If `aReplaceBrowsingContext` is set, BrowsingContext preservation will be
+ // disabled for this process switch.
+ void ChangeRemotenessToProcess(
+ mozilla::dom::ContentParent* aContentParent,
+ const mozilla::dom::NavigationIsolationOptions& aOptions,
+ mozilla::dom::BrowsingContextGroup* aGroup, mozilla::ErrorResult& rv);
+
+ void SubframeCrashed();
+
+ void RestoreFrameLoaderFromBFCache(nsFrameLoader* aNewFrameLoader);
+
+ void UpdateFocusAndMouseEnterStateAfterFrameLoaderChange();
+
+ void AttachFrameLoader(nsFrameLoader* aFrameLoader);
+ void DetachFrameLoader(nsFrameLoader* aFrameLoader);
+ // If aDestroyBFCached is true and aFrameLoader is the current frameloader
+ // (mFrameLoader) then this will also call nsFrameLoader::Destroy on all the
+ // other frame loaders in mFrameLoaderList and remove them from the list.
+ void FrameLoaderDestroying(nsFrameLoader* aFrameLoader,
+ bool aDestroyBFCached);
+
+ private:
+ bool UseRemoteSubframes();
+
+ // The enum class for determine how to handle previous BrowsingContext during
+ // the change remoteness. It could be followings
+ // 1. DONT_PRESERVE
+ // Create a whole new BrowsingContext.
+ // 2. PRESERVE
+ // Preserve the previous BrowsingContext.
+ enum class ChangeRemotenessContextType {
+ DONT_PRESERVE = 0,
+ PRESERVE = 1,
+ };
+ ChangeRemotenessContextType ShouldPreserveBrowsingContext(
+ bool aIsRemote, bool aReplaceBrowsingContext);
+
+ void ChangeRemotenessCommon(
+ const ChangeRemotenessContextType& aContextType,
+ const mozilla::dom::NavigationIsolationOptions& aOptions,
+ bool aSwitchingInProgressLoad, bool aIsRemote,
+ mozilla::dom::BrowsingContextGroup* aGroup,
+ std::function<void()>& aFrameLoaderInit, mozilla::ErrorResult& aRv);
+
+ void ChangeFrameLoaderCommon(mozilla::dom::Element* aOwner,
+ bool aRetainPaint);
+
+ void UpdateFocusAndMouseEnterStateAfterFrameLoaderChange(
+ mozilla::dom::Element* aOwner);
+
+ protected:
+ virtual ~nsFrameLoaderOwner() = default;
+ RefPtr<nsFrameLoader> mFrameLoader;
+
+ // The list contains all the nsFrameLoaders created for this owner or moved
+ // from another nsFrameLoaderOwner which haven't been destroyed yet.
+ // In particular it contains all the nsFrameLoaders which are in bfcache.
+ mozilla::LinkedList<nsFrameLoader> mFrameLoaderList;
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(nsFrameLoaderOwner, NS_FRAMELOADEROWNER_IID)
+
+#endif // nsFrameLoaderOwner_h_