summaryrefslogtreecommitdiffstats
path: root/dom/base/nsFrameLoaderOwner.h
blob: 2005be5cfd448ce3683a9b77da35e1ec808bbb43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* -*- 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);
  void FrameLoaderDestroying(nsFrameLoader* aFrameLoader);

 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_