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