summaryrefslogtreecommitdiffstats
path: root/docshell/base/nsDocShellLoadTypes.h
blob: 1de19e81eb732b63a92b06271fe2b5f382aca3ba (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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
/* -*- 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 nsDocShellLoadTypes_h_
#define nsDocShellLoadTypes_h_

#ifdef MOZILLA_INTERNAL_API

#  include "nsDOMNavigationTiming.h"
#  include "nsIDocShell.h"
#  include "nsIWebNavigation.h"

/**
 * Load flag for error pages. This uses one of the reserved flag
 * values from nsIWebNavigation.
 */
#  define LOAD_FLAGS_ERROR_PAGE 0x0001U

#  define MAKE_LOAD_TYPE(type, flags) ((type) | ((flags) << 16))
#  define LOAD_TYPE_HAS_FLAGS(type, flags) ((type) & ((flags) << 16))

/**
 * These are flags that confuse ConvertLoadTypeToDocShellLoadInfo and should
 * not be passed to MAKE_LOAD_TYPE.  In particular this includes all flags
 * above 0xffff (e.g. LOAD_FLAGS_BYPASS_CLASSIFIER), since MAKE_LOAD_TYPE would
 * just shift them out anyway.
 */
#  define EXTRA_LOAD_FLAGS                        \
    (nsIWebNavigation::LOAD_FLAGS_FROM_EXTERNAL | \
     nsIWebNavigation::LOAD_FLAGS_FIRST_LOAD |    \
     nsIWebNavigation::LOAD_FLAGS_ALLOW_POPUPS | 0xffff0000)

/* load types are legal combinations of load commands and flags
 *
 * NOTE:
 *  Remember to update the IsValidLoadType function below if you change this
 *  enum to ensure bad flag combinations will be rejected.
 */
enum LoadType : uint32_t {
  LOAD_NORMAL = MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
                               nsIWebNavigation::LOAD_FLAGS_NONE),
  LOAD_NORMAL_REPLACE =
      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
                     nsIWebNavigation::LOAD_FLAGS_REPLACE_HISTORY),
  LOAD_HISTORY = MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_HISTORY,
                                nsIWebNavigation::LOAD_FLAGS_NONE),
  LOAD_NORMAL_BYPASS_CACHE = MAKE_LOAD_TYPE(
      nsIDocShell::LOAD_CMD_NORMAL, nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE),
  LOAD_NORMAL_BYPASS_PROXY = MAKE_LOAD_TYPE(
      nsIDocShell::LOAD_CMD_NORMAL, nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY),
  LOAD_NORMAL_BYPASS_PROXY_AND_CACHE =
      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
                     nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE |
                         nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY),
  LOAD_RELOAD_NORMAL = MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_RELOAD,
                                      nsIWebNavigation::LOAD_FLAGS_NONE),
  LOAD_RELOAD_BYPASS_CACHE = MAKE_LOAD_TYPE(
      nsIDocShell::LOAD_CMD_RELOAD, nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE),
  LOAD_RELOAD_BYPASS_PROXY = MAKE_LOAD_TYPE(
      nsIDocShell::LOAD_CMD_RELOAD, nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY),
  LOAD_RELOAD_BYPASS_PROXY_AND_CACHE =
      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_RELOAD,
                     nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE |
                         nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY),
  LOAD_LINK = MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
                             nsIWebNavigation::LOAD_FLAGS_IS_LINK),
  LOAD_REFRESH = MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
                                nsIWebNavigation::LOAD_FLAGS_IS_REFRESH),
  LOAD_REFRESH_REPLACE =
      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
                     nsIWebNavigation::LOAD_FLAGS_IS_REFRESH |
                         nsIWebNavigation::LOAD_FLAGS_REPLACE_HISTORY),
  LOAD_RELOAD_CHARSET_CHANGE =
      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_RELOAD,
                     nsIWebNavigation::LOAD_FLAGS_CHARSET_CHANGE),
  LOAD_RELOAD_CHARSET_CHANGE_BYPASS_PROXY_AND_CACHE =
      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_RELOAD,
                     nsIWebNavigation::LOAD_FLAGS_CHARSET_CHANGE |
                         nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE |
                         nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY),
  LOAD_RELOAD_CHARSET_CHANGE_BYPASS_CACHE =
      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_RELOAD,
                     nsIWebNavigation::LOAD_FLAGS_CHARSET_CHANGE |
                         nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE),
  LOAD_BYPASS_HISTORY =
      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
                     nsIWebNavigation::LOAD_FLAGS_BYPASS_HISTORY),
  LOAD_STOP_CONTENT = MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
                                     nsIWebNavigation::LOAD_FLAGS_STOP_CONTENT),
  LOAD_STOP_CONTENT_AND_REPLACE =
      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
                     nsIWebNavigation::LOAD_FLAGS_STOP_CONTENT |
                         nsIWebNavigation::LOAD_FLAGS_REPLACE_HISTORY),
  LOAD_PUSHSTATE = MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_PUSHSTATE,
                                  nsIWebNavigation::LOAD_FLAGS_NONE),
  LOAD_REPLACE_BYPASS_CACHE =
      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
                     nsIWebNavigation::LOAD_FLAGS_REPLACE_HISTORY |
                         nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE),
  /**
   * Load type for an error page. These loads are never triggered by users of
   * Docshell. Instead, Docshell triggers the load itself when a
   * consumer-triggered load failed.
   */
  LOAD_ERROR_PAGE =
      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL, LOAD_FLAGS_ERROR_PAGE)

  // NOTE: Adding a new value? Remember to update IsValidLoadType!
};

static inline bool IsForceReloadType(uint32_t aLoadType) {
  switch (aLoadType) {
    case LOAD_RELOAD_BYPASS_CACHE:
    case LOAD_RELOAD_BYPASS_PROXY:
    case LOAD_RELOAD_BYPASS_PROXY_AND_CACHE:
      return true;
  }
  return false;
}

static inline bool IsValidLoadType(uint32_t aLoadType) {
  switch (aLoadType) {
    case LOAD_NORMAL:
    case LOAD_NORMAL_REPLACE:
    case LOAD_NORMAL_BYPASS_CACHE:
    case LOAD_NORMAL_BYPASS_PROXY:
    case LOAD_NORMAL_BYPASS_PROXY_AND_CACHE:
    case LOAD_HISTORY:
    case LOAD_RELOAD_NORMAL:
    case LOAD_RELOAD_BYPASS_CACHE:
    case LOAD_RELOAD_BYPASS_PROXY:
    case LOAD_RELOAD_BYPASS_PROXY_AND_CACHE:
    case LOAD_LINK:
    case LOAD_REFRESH:
    case LOAD_REFRESH_REPLACE:
    case LOAD_RELOAD_CHARSET_CHANGE:
    case LOAD_RELOAD_CHARSET_CHANGE_BYPASS_PROXY_AND_CACHE:
    case LOAD_RELOAD_CHARSET_CHANGE_BYPASS_CACHE:
    case LOAD_BYPASS_HISTORY:
    case LOAD_STOP_CONTENT:
    case LOAD_STOP_CONTENT_AND_REPLACE:
    case LOAD_PUSHSTATE:
    case LOAD_REPLACE_BYPASS_CACHE:
    case LOAD_ERROR_PAGE:
      return true;
  }
  return false;
}

inline nsDOMNavigationTiming::Type ConvertLoadTypeToNavigationType(
    uint32_t aLoadType) {
  // Not initialized, assume it's normal load.
  if (aLoadType == 0) {
    aLoadType = LOAD_NORMAL;
  }

  auto result = nsDOMNavigationTiming::TYPE_RESERVED;
  switch (aLoadType) {
    case LOAD_NORMAL:
    case LOAD_NORMAL_BYPASS_CACHE:
    case LOAD_NORMAL_BYPASS_PROXY:
    case LOAD_NORMAL_BYPASS_PROXY_AND_CACHE:
    case LOAD_NORMAL_REPLACE:
    case LOAD_LINK:
    case LOAD_STOP_CONTENT:
    // FIXME: It isn't clear that LOAD_REFRESH_REPLACE should have a different
    // navigation type than LOAD_REFRESH. Those loads historically used the
    // LOAD_NORMAL_REPLACE type, and therefore wound up with TYPE_NAVIGATE by
    // default.
    case LOAD_REFRESH_REPLACE:
    case LOAD_REPLACE_BYPASS_CACHE:
      result = nsDOMNavigationTiming::TYPE_NAVIGATE;
      break;
    case LOAD_HISTORY:
      result = nsDOMNavigationTiming::TYPE_BACK_FORWARD;
      break;
    case LOAD_RELOAD_NORMAL:
    case LOAD_RELOAD_CHARSET_CHANGE:
    case LOAD_RELOAD_CHARSET_CHANGE_BYPASS_PROXY_AND_CACHE:
    case LOAD_RELOAD_CHARSET_CHANGE_BYPASS_CACHE:
    case LOAD_RELOAD_BYPASS_CACHE:
    case LOAD_RELOAD_BYPASS_PROXY:
    case LOAD_RELOAD_BYPASS_PROXY_AND_CACHE:
      result = nsDOMNavigationTiming::TYPE_RELOAD;
      break;
    case LOAD_STOP_CONTENT_AND_REPLACE:
    case LOAD_REFRESH:
    case LOAD_BYPASS_HISTORY:
    case LOAD_ERROR_PAGE:
    case LOAD_PUSHSTATE:
      result = nsDOMNavigationTiming::TYPE_RESERVED;
      break;
    default:
      result = nsDOMNavigationTiming::TYPE_RESERVED;
      break;
  }

  return result;
}

#endif  // MOZILLA_INTERNAL_API
#endif