| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROME_BROWSER_EXTENSIONS_API_WEBVIEW_WEBVIEW_API_H_ | 5 #ifndef CHROME_BROWSER_EXTENSIONS_API_WEBVIEW_WEBVIEW_API_H_ |
| 6 #define CHROME_BROWSER_EXTENSIONS_API_WEBVIEW_WEBVIEW_API_H_ | 6 #define CHROME_BROWSER_EXTENSIONS_API_WEBVIEW_WEBVIEW_API_H_ |
| 7 | 7 |
| 8 #include "chrome/browser/extensions/api/capture_web_contents_function.h" | 8 #include "chrome/browser/extensions/api/capture_web_contents_function.h" |
| 9 #include "chrome/browser/extensions/api/execute_code_function.h" | 9 #include "chrome/browser/extensions/api/execute_code_function.h" |
| 10 #include "chrome/browser/guestview/webview/webview_find_helper.h" | 10 #include "chrome/browser/guestview/webview/webview_find_helper.h" |
| 11 #include "chrome/browser/guestview/webview/webview_guest.h" | 11 #include "chrome/browser/guestview/webview/webview_guest.h" |
| 12 | 12 |
| 13 // WARNING: Webview could be loaded in an unblessed context, thus any new | 13 // WARNING: Webview could be loaded in an unblessed context, thus any new |
| 14 // APIs must extend WebviewExtensionFunction/WebviewExecuteCodeFunction which | 14 // APIs must extend WebviewExtensionFunction/WebviewExecuteCodeFunction which |
| 15 // do a process ID check to prevent abuse by normal renderer processes. | 15 // do a process ID check to prevent abuse by normal renderer processes. |
| 16 // TODO(guohui): refactor WebviewExecuteCodeFunction to also extend | 16 // TODO(guohui): refactor WebviewExecuteCodeFunction to also extend |
| 17 // WebviewExtensionFunction. | 17 // WebviewExtensionFunction. |
| 18 namespace extensions { | 18 namespace extensions { |
| 19 | 19 |
| 20 // An abstract base class for async webview APIs. It does a process ID check | 20 // An abstract base class for async webview APIs. It does a process ID check |
| 21 // in RunImpl, and then calls RunImplSafe which must be overriden by all | 21 // in RunSync, and then calls RunImplSafe which must be overriden by all |
| 22 // subclasses. | 22 // subclasses. |
| 23 class WebviewExtensionFunction : public AsyncExtensionFunction { | 23 class WebviewExtensionFunction : public AsyncExtensionFunction { |
| 24 public: | 24 public: |
| 25 WebviewExtensionFunction() {} | 25 WebviewExtensionFunction() {} |
| 26 | 26 |
| 27 protected: | 27 protected: |
| 28 virtual ~WebviewExtensionFunction() {} | 28 virtual ~WebviewExtensionFunction() {} |
| 29 | 29 |
| 30 // ExtensionFunction implementation. | 30 // ExtensionFunction implementation. |
| 31 virtual bool RunImpl() OVERRIDE FINAL; | 31 virtual bool RunSync() OVERRIDE FINAL; |
| 32 | 32 |
| 33 private: | 33 private: |
| 34 virtual bool RunImplSafe(WebViewGuest* guest) = 0; | 34 virtual bool RunSyncSafe(WebViewGuest* guest) = 0; |
| 35 }; | 35 }; |
| 36 | 36 |
| 37 class WebviewContextMenusCreateFunction : public AsyncExtensionFunction { | 37 class WebviewContextMenusCreateFunction : public AsyncExtensionFunction { |
| 38 public: | 38 public: |
| 39 DECLARE_EXTENSION_FUNCTION("webview.contextMenusCreate", | 39 DECLARE_EXTENSION_FUNCTION("webview.contextMenusCreate", |
| 40 WEBVIEW_CONTEXTMENUSCREATE); | 40 WEBVIEW_CONTEXTMENUSCREATE); |
| 41 WebviewContextMenusCreateFunction() {} | 41 WebviewContextMenusCreateFunction() {} |
| 42 | 42 |
| 43 protected: | 43 protected: |
| 44 virtual ~WebviewContextMenusCreateFunction() {} | 44 virtual ~WebviewContextMenusCreateFunction() {} |
| 45 | 45 |
| 46 // ExtensionFunction implementation. | 46 // ExtensionFunction implementation. |
| 47 virtual bool RunImpl() OVERRIDE; | 47 virtual bool RunSync() OVERRIDE; |
| 48 | 48 |
| 49 private: | 49 private: |
| 50 DISALLOW_COPY_AND_ASSIGN(WebviewContextMenusCreateFunction); | 50 DISALLOW_COPY_AND_ASSIGN(WebviewContextMenusCreateFunction); |
| 51 }; | 51 }; |
| 52 | 52 |
| 53 class WebviewContextMenusUpdateFunction : public AsyncExtensionFunction { | 53 class WebviewContextMenusUpdateFunction : public AsyncExtensionFunction { |
| 54 public: | 54 public: |
| 55 DECLARE_EXTENSION_FUNCTION("webview.contextMenusUpdate", | 55 DECLARE_EXTENSION_FUNCTION("webview.contextMenusUpdate", |
| 56 WEBVIEW_CONTEXTMENUSUPDATE); | 56 WEBVIEW_CONTEXTMENUSUPDATE); |
| 57 WebviewContextMenusUpdateFunction() {} | 57 WebviewContextMenusUpdateFunction() {} |
| 58 | 58 |
| 59 protected: | 59 protected: |
| 60 virtual ~WebviewContextMenusUpdateFunction() {} | 60 virtual ~WebviewContextMenusUpdateFunction() {} |
| 61 | 61 |
| 62 // ExtensionFunction implementation. | 62 // ExtensionFunction implementation. |
| 63 virtual bool RunImpl() OVERRIDE; | 63 virtual bool RunSync() OVERRIDE; |
| 64 | 64 |
| 65 private: | 65 private: |
| 66 DISALLOW_COPY_AND_ASSIGN(WebviewContextMenusUpdateFunction); | 66 DISALLOW_COPY_AND_ASSIGN(WebviewContextMenusUpdateFunction); |
| 67 }; | 67 }; |
| 68 | 68 |
| 69 class WebviewContextMenusRemoveFunction : public AsyncExtensionFunction { | 69 class WebviewContextMenusRemoveFunction : public AsyncExtensionFunction { |
| 70 public: | 70 public: |
| 71 DECLARE_EXTENSION_FUNCTION("webview.contextMenusRemove", | 71 DECLARE_EXTENSION_FUNCTION("webview.contextMenusRemove", |
| 72 WEBVIEW_CONTEXTMENUSREMOVE); | 72 WEBVIEW_CONTEXTMENUSREMOVE); |
| 73 WebviewContextMenusRemoveFunction() {} | 73 WebviewContextMenusRemoveFunction() {} |
| 74 | 74 |
| 75 protected: | 75 protected: |
| 76 virtual ~WebviewContextMenusRemoveFunction() {} | 76 virtual ~WebviewContextMenusRemoveFunction() {} |
| 77 | 77 |
| 78 // ExtensionFunction implementation. | 78 // ExtensionFunction implementation. |
| 79 virtual bool RunImpl() OVERRIDE; | 79 virtual bool RunSync() OVERRIDE; |
| 80 | 80 |
| 81 private: | 81 private: |
| 82 DISALLOW_COPY_AND_ASSIGN(WebviewContextMenusRemoveFunction); | 82 DISALLOW_COPY_AND_ASSIGN(WebviewContextMenusRemoveFunction); |
| 83 }; | 83 }; |
| 84 | 84 |
| 85 class WebviewContextMenusRemoveAllFunction : public AsyncExtensionFunction { | 85 class WebviewContextMenusRemoveAllFunction : public AsyncExtensionFunction { |
| 86 public: | 86 public: |
| 87 DECLARE_EXTENSION_FUNCTION("webview.contextMenusRemoveAll", | 87 DECLARE_EXTENSION_FUNCTION("webview.contextMenusRemoveAll", |
| 88 WEBVIEW_CONTEXTMENUSREMOVEALL); | 88 WEBVIEW_CONTEXTMENUSREMOVEALL); |
| 89 WebviewContextMenusRemoveAllFunction() {} | 89 WebviewContextMenusRemoveAllFunction() {} |
| 90 | 90 |
| 91 protected: | 91 protected: |
| 92 virtual ~WebviewContextMenusRemoveAllFunction() {} | 92 virtual ~WebviewContextMenusRemoveAllFunction() {} |
| 93 | 93 |
| 94 // ExtensionFunction implementation. | 94 // ExtensionFunction implementation. |
| 95 virtual bool RunImpl() OVERRIDE; | 95 virtual bool RunSync() OVERRIDE; |
| 96 | 96 |
| 97 private: | 97 private: |
| 98 DISALLOW_COPY_AND_ASSIGN(WebviewContextMenusRemoveAllFunction); | 98 DISALLOW_COPY_AND_ASSIGN(WebviewContextMenusRemoveAllFunction); |
| 99 }; | 99 }; |
| 100 | 100 |
| 101 class WebviewClearDataFunction : public WebviewExtensionFunction { | 101 class WebviewClearDataFunction : public WebviewExtensionFunction { |
| 102 public: | 102 public: |
| 103 DECLARE_EXTENSION_FUNCTION("webview.clearData", WEBVIEW_CLEARDATA); | 103 DECLARE_EXTENSION_FUNCTION("webview.clearData", WEBVIEW_CLEARDATA); |
| 104 | 104 |
| 105 WebviewClearDataFunction(); | 105 WebviewClearDataFunction(); |
| 106 | 106 |
| 107 protected: | 107 protected: |
| 108 virtual ~WebviewClearDataFunction(); | 108 virtual ~WebviewClearDataFunction(); |
| 109 | 109 |
| 110 private: | 110 private: |
| 111 // WebviewExtensionFunction implementation. | 111 // WebviewExtensionFunction implementation. |
| 112 virtual bool RunImplSafe(WebViewGuest* guest) OVERRIDE; | 112 virtual bool RunSyncSafe(WebViewGuest* guest) OVERRIDE; |
| 113 | 113 |
| 114 uint32 GetRemovalMask(); | 114 uint32 GetRemovalMask(); |
| 115 void ClearDataDone(); | 115 void ClearDataDone(); |
| 116 | 116 |
| 117 // Removal start time. | 117 // Removal start time. |
| 118 base::Time remove_since_; | 118 base::Time remove_since_; |
| 119 // Removal mask, corresponds to StoragePartition::RemoveDataMask enum. | 119 // Removal mask, corresponds to StoragePartition::RemoveDataMask enum. |
| 120 uint32 remove_mask_; | 120 uint32 remove_mask_; |
| 121 // Tracks any data related or parse errors. | 121 // Tracks any data related or parse errors. |
| 122 bool bad_message_; | 122 bool bad_message_; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 class WebviewSetZoomFunction : public WebviewExtensionFunction { | 207 class WebviewSetZoomFunction : public WebviewExtensionFunction { |
| 208 public: | 208 public: |
| 209 DECLARE_EXTENSION_FUNCTION("webview.setZoom", WEBVIEW_SETZOOM); | 209 DECLARE_EXTENSION_FUNCTION("webview.setZoom", WEBVIEW_SETZOOM); |
| 210 | 210 |
| 211 WebviewSetZoomFunction(); | 211 WebviewSetZoomFunction(); |
| 212 | 212 |
| 213 protected: | 213 protected: |
| 214 virtual ~WebviewSetZoomFunction(); | 214 virtual ~WebviewSetZoomFunction(); |
| 215 | 215 |
| 216 private: | 216 private: |
| 217 virtual bool RunImplSafe(WebViewGuest* guest) OVERRIDE; | 217 virtual bool RunSyncSafe(WebViewGuest* guest) OVERRIDE; |
| 218 | 218 |
| 219 DISALLOW_COPY_AND_ASSIGN(WebviewSetZoomFunction); | 219 DISALLOW_COPY_AND_ASSIGN(WebviewSetZoomFunction); |
| 220 }; | 220 }; |
| 221 | 221 |
| 222 class WebviewGetZoomFunction : public WebviewExtensionFunction { | 222 class WebviewGetZoomFunction : public WebviewExtensionFunction { |
| 223 public: | 223 public: |
| 224 DECLARE_EXTENSION_FUNCTION("webview.getZoom", WEBVIEW_GETZOOM); | 224 DECLARE_EXTENSION_FUNCTION("webview.getZoom", WEBVIEW_GETZOOM); |
| 225 | 225 |
| 226 WebviewGetZoomFunction(); | 226 WebviewGetZoomFunction(); |
| 227 | 227 |
| 228 protected: | 228 protected: |
| 229 virtual ~WebviewGetZoomFunction(); | 229 virtual ~WebviewGetZoomFunction(); |
| 230 | 230 |
| 231 private: | 231 private: |
| 232 virtual bool RunImplSafe(WebViewGuest* guest) OVERRIDE; | 232 virtual bool RunSyncSafe(WebViewGuest* guest) OVERRIDE; |
| 233 | 233 |
| 234 DISALLOW_COPY_AND_ASSIGN(WebviewGetZoomFunction); | 234 DISALLOW_COPY_AND_ASSIGN(WebviewGetZoomFunction); |
| 235 }; | 235 }; |
| 236 | 236 |
| 237 class WebviewFindFunction : public WebviewExtensionFunction { | 237 class WebviewFindFunction : public WebviewExtensionFunction { |
| 238 public: | 238 public: |
| 239 DECLARE_EXTENSION_FUNCTION("webview.find", WEBVIEW_FIND); | 239 DECLARE_EXTENSION_FUNCTION("webview.find", WEBVIEW_FIND); |
| 240 | 240 |
| 241 WebviewFindFunction(); | 241 WebviewFindFunction(); |
| 242 | 242 |
| 243 // Exposes SendResponse() for use by WebviewFindHelper. | 243 // Exposes SendResponse() for use by WebviewFindHelper. |
| 244 using WebviewExtensionFunction::SendResponse; | 244 using WebviewExtensionFunction::SendResponse; |
| 245 | 245 |
| 246 protected: | 246 protected: |
| 247 virtual ~WebviewFindFunction(); | 247 virtual ~WebviewFindFunction(); |
| 248 | 248 |
| 249 private: | 249 private: |
| 250 // WebviewExtensionFunction implementation. | 250 // WebviewExtensionFunction implementation. |
| 251 virtual bool RunImplSafe(WebViewGuest* guest) OVERRIDE; | 251 virtual bool RunSyncSafe(WebViewGuest* guest) OVERRIDE; |
| 252 | 252 |
| 253 DISALLOW_COPY_AND_ASSIGN(WebviewFindFunction); | 253 DISALLOW_COPY_AND_ASSIGN(WebviewFindFunction); |
| 254 }; | 254 }; |
| 255 | 255 |
| 256 class WebviewStopFindingFunction : public WebviewExtensionFunction { | 256 class WebviewStopFindingFunction : public WebviewExtensionFunction { |
| 257 public: | 257 public: |
| 258 DECLARE_EXTENSION_FUNCTION("webview.stopFinding", WEBVIEW_STOPFINDING); | 258 DECLARE_EXTENSION_FUNCTION("webview.stopFinding", WEBVIEW_STOPFINDING); |
| 259 | 259 |
| 260 WebviewStopFindingFunction(); | 260 WebviewStopFindingFunction(); |
| 261 | 261 |
| 262 protected: | 262 protected: |
| 263 virtual ~WebviewStopFindingFunction(); | 263 virtual ~WebviewStopFindingFunction(); |
| 264 | 264 |
| 265 private: | 265 private: |
| 266 // WebviewExtensionFunction implementation. | 266 // WebviewExtensionFunction implementation. |
| 267 virtual bool RunImplSafe(WebViewGuest* guest) OVERRIDE; | 267 virtual bool RunSyncSafe(WebViewGuest* guest) OVERRIDE; |
| 268 | 268 |
| 269 DISALLOW_COPY_AND_ASSIGN(WebviewStopFindingFunction); | 269 DISALLOW_COPY_AND_ASSIGN(WebviewStopFindingFunction); |
| 270 }; | 270 }; |
| 271 | 271 |
| 272 class WebviewGoFunction : public WebviewExtensionFunction { | 272 class WebviewGoFunction : public WebviewExtensionFunction { |
| 273 public: | 273 public: |
| 274 DECLARE_EXTENSION_FUNCTION("webview.go", WEBVIEW_GO); | 274 DECLARE_EXTENSION_FUNCTION("webview.go", WEBVIEW_GO); |
| 275 | 275 |
| 276 WebviewGoFunction(); | 276 WebviewGoFunction(); |
| 277 | 277 |
| 278 protected: | 278 protected: |
| 279 virtual ~WebviewGoFunction(); | 279 virtual ~WebviewGoFunction(); |
| 280 | 280 |
| 281 private: | 281 private: |
| 282 // WebviewExtensionFunction implementation. | 282 // WebviewExtensionFunction implementation. |
| 283 virtual bool RunImplSafe(WebViewGuest* guest) OVERRIDE; | 283 virtual bool RunSyncSafe(WebViewGuest* guest) OVERRIDE; |
| 284 | 284 |
| 285 DISALLOW_COPY_AND_ASSIGN(WebviewGoFunction); | 285 DISALLOW_COPY_AND_ASSIGN(WebviewGoFunction); |
| 286 }; | 286 }; |
| 287 | 287 |
| 288 class WebviewReloadFunction : public WebviewExtensionFunction { | 288 class WebviewReloadFunction : public WebviewExtensionFunction { |
| 289 public: | 289 public: |
| 290 DECLARE_EXTENSION_FUNCTION("webview.reload", WEBVIEW_RELOAD); | 290 DECLARE_EXTENSION_FUNCTION("webview.reload", WEBVIEW_RELOAD); |
| 291 | 291 |
| 292 WebviewReloadFunction(); | 292 WebviewReloadFunction(); |
| 293 | 293 |
| 294 protected: | 294 protected: |
| 295 virtual ~WebviewReloadFunction(); | 295 virtual ~WebviewReloadFunction(); |
| 296 | 296 |
| 297 private: | 297 private: |
| 298 // WebviewExtensionFunction implementation. | 298 // WebviewExtensionFunction implementation. |
| 299 virtual bool RunImplSafe(WebViewGuest* guest) OVERRIDE; | 299 virtual bool RunSyncSafe(WebViewGuest* guest) OVERRIDE; |
| 300 | 300 |
| 301 DISALLOW_COPY_AND_ASSIGN(WebviewReloadFunction); | 301 DISALLOW_COPY_AND_ASSIGN(WebviewReloadFunction); |
| 302 }; | 302 }; |
| 303 | 303 |
| 304 class WebviewSetPermissionFunction : public WebviewExtensionFunction { | 304 class WebviewSetPermissionFunction : public WebviewExtensionFunction { |
| 305 public: | 305 public: |
| 306 DECLARE_EXTENSION_FUNCTION("webview.setPermission", WEBVIEW_SETPERMISSION); | 306 DECLARE_EXTENSION_FUNCTION("webview.setPermission", WEBVIEW_SETPERMISSION); |
| 307 | 307 |
| 308 WebviewSetPermissionFunction(); | 308 WebviewSetPermissionFunction(); |
| 309 | 309 |
| 310 protected: | 310 protected: |
| 311 virtual ~WebviewSetPermissionFunction(); | 311 virtual ~WebviewSetPermissionFunction(); |
| 312 | 312 |
| 313 private: | 313 private: |
| 314 // WebviewExtensionFunction implementation. | 314 // WebviewExtensionFunction implementation. |
| 315 virtual bool RunImplSafe(WebViewGuest* guest) OVERRIDE; | 315 virtual bool RunSyncSafe(WebViewGuest* guest) OVERRIDE; |
| 316 | 316 |
| 317 DISALLOW_COPY_AND_ASSIGN(WebviewSetPermissionFunction); | 317 DISALLOW_COPY_AND_ASSIGN(WebviewSetPermissionFunction); |
| 318 }; | 318 }; |
| 319 | 319 |
| 320 class WebviewOverrideUserAgentFunction: public WebviewExtensionFunction { | 320 class WebviewOverrideUserAgentFunction: public WebviewExtensionFunction { |
| 321 public: | 321 public: |
| 322 DECLARE_EXTENSION_FUNCTION("webview.overrideUserAgent", | 322 DECLARE_EXTENSION_FUNCTION("webview.overrideUserAgent", |
| 323 WEBVIEW_OVERRIDEUSERAGENT); | 323 WEBVIEW_OVERRIDEUSERAGENT); |
| 324 | 324 |
| 325 WebviewOverrideUserAgentFunction(); | 325 WebviewOverrideUserAgentFunction(); |
| 326 | 326 |
| 327 protected: | 327 protected: |
| 328 virtual ~WebviewOverrideUserAgentFunction(); | 328 virtual ~WebviewOverrideUserAgentFunction(); |
| 329 | 329 |
| 330 private: | 330 private: |
| 331 // WebviewExtensionFunction implementation. | 331 // WebviewExtensionFunction implementation. |
| 332 virtual bool RunImplSafe(WebViewGuest* guest) OVERRIDE; | 332 virtual bool RunSyncSafe(WebViewGuest* guest) OVERRIDE; |
| 333 | 333 |
| 334 DISALLOW_COPY_AND_ASSIGN(WebviewOverrideUserAgentFunction); | 334 DISALLOW_COPY_AND_ASSIGN(WebviewOverrideUserAgentFunction); |
| 335 }; | 335 }; |
| 336 | 336 |
| 337 class WebviewStopFunction : public WebviewExtensionFunction { | 337 class WebviewStopFunction : public WebviewExtensionFunction { |
| 338 public: | 338 public: |
| 339 DECLARE_EXTENSION_FUNCTION("webview.stop", WEBVIEW_STOP); | 339 DECLARE_EXTENSION_FUNCTION("webview.stop", WEBVIEW_STOP); |
| 340 | 340 |
| 341 WebviewStopFunction(); | 341 WebviewStopFunction(); |
| 342 | 342 |
| 343 protected: | 343 protected: |
| 344 virtual ~WebviewStopFunction(); | 344 virtual ~WebviewStopFunction(); |
| 345 | 345 |
| 346 private: | 346 private: |
| 347 // WebviewExtensionFunction implementation. | 347 // WebviewExtensionFunction implementation. |
| 348 virtual bool RunImplSafe(WebViewGuest* guest) OVERRIDE; | 348 virtual bool RunSyncSafe(WebViewGuest* guest) OVERRIDE; |
| 349 | 349 |
| 350 DISALLOW_COPY_AND_ASSIGN(WebviewStopFunction); | 350 DISALLOW_COPY_AND_ASSIGN(WebviewStopFunction); |
| 351 }; | 351 }; |
| 352 | 352 |
| 353 class WebviewTerminateFunction : public WebviewExtensionFunction { | 353 class WebviewTerminateFunction : public WebviewExtensionFunction { |
| 354 public: | 354 public: |
| 355 DECLARE_EXTENSION_FUNCTION("webview.terminate", WEBVIEW_TERMINATE); | 355 DECLARE_EXTENSION_FUNCTION("webview.terminate", WEBVIEW_TERMINATE); |
| 356 | 356 |
| 357 WebviewTerminateFunction(); | 357 WebviewTerminateFunction(); |
| 358 | 358 |
| 359 protected: | 359 protected: |
| 360 virtual ~WebviewTerminateFunction(); | 360 virtual ~WebviewTerminateFunction(); |
| 361 | 361 |
| 362 private: | 362 private: |
| 363 // WebviewExtensionFunction implementation. | 363 // WebviewExtensionFunction implementation. |
| 364 virtual bool RunImplSafe(WebViewGuest* guest) OVERRIDE; | 364 virtual bool RunSyncSafe(WebViewGuest* guest) OVERRIDE; |
| 365 | 365 |
| 366 DISALLOW_COPY_AND_ASSIGN(WebviewTerminateFunction); | 366 DISALLOW_COPY_AND_ASSIGN(WebviewTerminateFunction); |
| 367 }; | 367 }; |
| 368 | 368 |
| 369 } // namespace extensions | 369 } // namespace extensions |
| 370 | 370 |
| 371 #endif // CHROME_BROWSER_EXTENSIONS_API_WEBVIEW_WEBVIEW_API_H_ | 371 #endif // CHROME_BROWSER_EXTENSIONS_API_WEBVIEW_WEBVIEW_API_H_ |
| OLD | NEW |