tor-browser

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

nsDocShellLoadTypes.h (8584B)


      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 #ifndef nsDocShellLoadTypes_h_
      8 #define nsDocShellLoadTypes_h_
      9 
     10 #ifdef MOZILLA_INTERNAL_API
     11 
     12 #  include "nsDOMNavigationTiming.h"
     13 #  include "nsIDocShell.h"
     14 #  include "nsIWebNavigation.h"
     15 
     16 /**
     17 * Load flag for error pages. This uses one of the reserved flag
     18 * values from nsIWebNavigation.
     19 */
     20 #  define LOAD_FLAGS_ERROR_PAGE 0x0001U
     21 
     22 #  define MAKE_LOAD_TYPE(type, flags) ((type) | ((flags) << 16))
     23 #  define LOAD_TYPE_HAS_FLAGS(type, flags) ((type) & ((flags) << 16))
     24 #  define LOAD_TYPE_SET_FLAGS(type, flags) ((type) | ((flags) << 16))
     25 
     26 /**
     27 * These are flags that confuse ConvertLoadTypeToDocShellLoadInfo and should
     28 * not be passed to MAKE_LOAD_TYPE.  In particular this includes all flags
     29 * above 0xffff (e.g. LOAD_FLAGS_BYPASS_CLASSIFIER), since MAKE_LOAD_TYPE would
     30 * just shift them out anyway.
     31 */
     32 #  define EXTRA_LOAD_FLAGS                        \
     33    (nsIWebNavigation::LOAD_FLAGS_FROM_EXTERNAL | \
     34     nsIWebNavigation::LOAD_FLAGS_FIRST_LOAD |    \
     35     nsIWebNavigation::LOAD_FLAGS_ALLOW_POPUPS | 0xffff0000)
     36 
     37 /* load types are legal combinations of load commands and flags
     38 *
     39 * NOTE:
     40 *  Remember to update the IsValidLoadType function below if you change this
     41 *  enum to ensure bad flag combinations will be rejected.
     42 */
     43 enum LoadType : uint32_t {
     44  LOAD_NORMAL = MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
     45                               nsIWebNavigation::LOAD_FLAGS_NONE),
     46  LOAD_NORMAL_REPLACE =
     47      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
     48                     nsIWebNavigation::LOAD_FLAGS_REPLACE_HISTORY),
     49  LOAD_HISTORY = MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_HISTORY,
     50                                nsIWebNavigation::LOAD_FLAGS_NONE),
     51  LOAD_NORMAL_BYPASS_CACHE = MAKE_LOAD_TYPE(
     52      nsIDocShell::LOAD_CMD_NORMAL, nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE),
     53  LOAD_NORMAL_BYPASS_PROXY = MAKE_LOAD_TYPE(
     54      nsIDocShell::LOAD_CMD_NORMAL, nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY),
     55  LOAD_NORMAL_BYPASS_PROXY_AND_CACHE =
     56      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
     57                     nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE |
     58                         nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY),
     59  LOAD_RELOAD_NORMAL = MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_RELOAD,
     60                                      nsIWebNavigation::LOAD_FLAGS_NONE),
     61  LOAD_RELOAD_BYPASS_CACHE = MAKE_LOAD_TYPE(
     62      nsIDocShell::LOAD_CMD_RELOAD, nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE),
     63  LOAD_RELOAD_BYPASS_PROXY = MAKE_LOAD_TYPE(
     64      nsIDocShell::LOAD_CMD_RELOAD, nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY),
     65  LOAD_RELOAD_BYPASS_PROXY_AND_CACHE =
     66      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_RELOAD,
     67                     nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE |
     68                         nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY),
     69  LOAD_LINK = MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
     70                             nsIWebNavigation::LOAD_FLAGS_IS_LINK),
     71  LOAD_REFRESH = MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
     72                                nsIWebNavigation::LOAD_FLAGS_IS_REFRESH),
     73  LOAD_REFRESH_REPLACE =
     74      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
     75                     nsIWebNavigation::LOAD_FLAGS_IS_REFRESH |
     76                         nsIWebNavigation::LOAD_FLAGS_REPLACE_HISTORY),
     77  LOAD_RELOAD_CHARSET_CHANGE =
     78      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_RELOAD,
     79                     nsIWebNavigation::LOAD_FLAGS_CHARSET_CHANGE),
     80  LOAD_RELOAD_CHARSET_CHANGE_BYPASS_PROXY_AND_CACHE =
     81      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_RELOAD,
     82                     nsIWebNavigation::LOAD_FLAGS_CHARSET_CHANGE |
     83                         nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE |
     84                         nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY),
     85  LOAD_RELOAD_CHARSET_CHANGE_BYPASS_CACHE =
     86      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_RELOAD,
     87                     nsIWebNavigation::LOAD_FLAGS_CHARSET_CHANGE |
     88                         nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE),
     89  LOAD_BYPASS_HISTORY =
     90      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
     91                     nsIWebNavigation::LOAD_FLAGS_BYPASS_HISTORY),
     92  LOAD_STOP_CONTENT = MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
     93                                     nsIWebNavigation::LOAD_FLAGS_STOP_CONTENT),
     94  LOAD_STOP_CONTENT_AND_REPLACE =
     95      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
     96                     nsIWebNavigation::LOAD_FLAGS_STOP_CONTENT |
     97                         nsIWebNavigation::LOAD_FLAGS_REPLACE_HISTORY),
     98  LOAD_PUSHSTATE = MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_PUSHSTATE,
     99                                  nsIWebNavigation::LOAD_FLAGS_NONE),
    100  LOAD_REPLACE_BYPASS_CACHE =
    101      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL,
    102                     nsIWebNavigation::LOAD_FLAGS_REPLACE_HISTORY |
    103                         nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE),
    104  /**
    105   * Load type for an error page. These loads are never triggered by users of
    106   * Docshell. Instead, Docshell triggers the load itself when a
    107   * consumer-triggered load failed.
    108   */
    109  LOAD_ERROR_PAGE =
    110      MAKE_LOAD_TYPE(nsIDocShell::LOAD_CMD_NORMAL, LOAD_FLAGS_ERROR_PAGE)
    111 
    112  // NOTE: Adding a new value? Remember to update IsValidLoadType!
    113 };
    114 
    115 static inline bool IsForceReloadType(uint32_t aLoadType) {
    116  switch (aLoadType) {
    117    case LOAD_RELOAD_BYPASS_CACHE:
    118    case LOAD_RELOAD_BYPASS_PROXY:
    119    case LOAD_RELOAD_BYPASS_PROXY_AND_CACHE:
    120      return true;
    121  }
    122  return false;
    123 }
    124 
    125 static inline bool IsValidLoadType(uint32_t aLoadType) {
    126  switch (aLoadType) {
    127    case LOAD_NORMAL:
    128    case LOAD_NORMAL_REPLACE:
    129    case LOAD_NORMAL_BYPASS_CACHE:
    130    case LOAD_NORMAL_BYPASS_PROXY:
    131    case LOAD_NORMAL_BYPASS_PROXY_AND_CACHE:
    132    case LOAD_HISTORY:
    133    case LOAD_RELOAD_NORMAL:
    134    case LOAD_RELOAD_BYPASS_CACHE:
    135    case LOAD_RELOAD_BYPASS_PROXY:
    136    case LOAD_RELOAD_BYPASS_PROXY_AND_CACHE:
    137    case LOAD_LINK:
    138    case LOAD_REFRESH:
    139    case LOAD_REFRESH_REPLACE:
    140    case LOAD_RELOAD_CHARSET_CHANGE:
    141    case LOAD_RELOAD_CHARSET_CHANGE_BYPASS_PROXY_AND_CACHE:
    142    case LOAD_RELOAD_CHARSET_CHANGE_BYPASS_CACHE:
    143    case LOAD_BYPASS_HISTORY:
    144    case LOAD_STOP_CONTENT:
    145    case LOAD_STOP_CONTENT_AND_REPLACE:
    146    case LOAD_PUSHSTATE:
    147    case LOAD_REPLACE_BYPASS_CACHE:
    148    case LOAD_ERROR_PAGE:
    149      return true;
    150  }
    151  return false;
    152 }
    153 
    154 inline nsDOMNavigationTiming::Type ConvertLoadTypeToNavigationType(
    155    uint32_t aLoadType) {
    156  // Not initialized, assume it's normal load.
    157  if (aLoadType == 0) {
    158    aLoadType = LOAD_NORMAL;
    159  }
    160 
    161  auto result = nsDOMNavigationTiming::TYPE_RESERVED;
    162  switch (aLoadType) {
    163    case LOAD_NORMAL:
    164    case LOAD_NORMAL_BYPASS_CACHE:
    165    case LOAD_NORMAL_BYPASS_PROXY:
    166    case LOAD_NORMAL_BYPASS_PROXY_AND_CACHE:
    167    case LOAD_NORMAL_REPLACE:
    168    case LOAD_LINK:
    169    case LOAD_STOP_CONTENT:
    170    // FIXME: It isn't clear that LOAD_REFRESH_REPLACE should have a different
    171    // navigation type than LOAD_REFRESH. Those loads historically used the
    172    // LOAD_NORMAL_REPLACE type, and therefore wound up with TYPE_NAVIGATE by
    173    // default.
    174    case LOAD_REFRESH_REPLACE:
    175    case LOAD_REPLACE_BYPASS_CACHE:
    176      result = nsDOMNavigationTiming::TYPE_NAVIGATE;
    177      break;
    178    case LOAD_HISTORY:
    179      result = nsDOMNavigationTiming::TYPE_BACK_FORWARD;
    180      break;
    181    case LOAD_RELOAD_NORMAL:
    182    case LOAD_RELOAD_CHARSET_CHANGE:
    183    case LOAD_RELOAD_CHARSET_CHANGE_BYPASS_PROXY_AND_CACHE:
    184    case LOAD_RELOAD_CHARSET_CHANGE_BYPASS_CACHE:
    185    case LOAD_RELOAD_BYPASS_CACHE:
    186    case LOAD_RELOAD_BYPASS_PROXY:
    187    case LOAD_RELOAD_BYPASS_PROXY_AND_CACHE:
    188      result = nsDOMNavigationTiming::TYPE_RELOAD;
    189      break;
    190    case LOAD_STOP_CONTENT_AND_REPLACE:
    191    case LOAD_REFRESH:
    192    case LOAD_BYPASS_HISTORY:
    193    case LOAD_ERROR_PAGE:
    194    case LOAD_PUSHSTATE:
    195      result = nsDOMNavigationTiming::TYPE_RESERVED;
    196      break;
    197    default:
    198      result = nsDOMNavigationTiming::TYPE_RESERVED;
    199      break;
    200  }
    201 
    202  return result;
    203 }
    204 
    205 static inline uint32_t MaybeAddLoadFlags(uint32_t aLoadType, uint32_t aFlags) {
    206  uint32_t loadType = LOAD_TYPE_SET_FLAGS(aLoadType, aFlags);
    207  if (IsValidLoadType(loadType)) {
    208    return loadType;
    209  }
    210 
    211  NS_WARNING("Adjusting load flags results in an invalid load type.");
    212  return aLoadType;
    213 }
    214 
    215 #  undef LOAD_TYPE_SET_FLAGS
    216 
    217 #endif  // MOZILLA_INTERNAL_API
    218 #endif