tor-browser

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

ScriptResponseHeaderProcessor.h (3081B)


      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 mozilla_dom_workers_ScriptResponseHeaderProcessor_h__
      8 #define mozilla_dom_workers_ScriptResponseHeaderProcessor_h__
      9 
     10 #include "js/Modules.h"
     11 #include "mozilla/StaticPrefs_browser.h"
     12 #include "mozilla/StaticPrefs_dom.h"
     13 #include "mozilla/dom/WorkerCommon.h"
     14 #include "nsIHttpChannel.h"
     15 #include "nsIHttpChannelInternal.h"
     16 #include "nsIStreamLoader.h"
     17 #include "nsStreamUtils.h"
     18 
     19 namespace mozilla::dom {
     20 
     21 class ThreadSafeWorkerRef;
     22 
     23 namespace workerinternals::loader {
     24 
     25 /* ScriptResponseHeaderProcessor
     26 *
     27 * This class handles Policy headers. It can be used as a RequestObserver in a
     28 * Tee, as it is for NetworkLoadHandler in WorkerScriptLoader, or the static
     29 * method can be called directly, as it is in CacheLoadHandler.
     30 *
     31 */
     32 
     33 class ScriptResponseHeaderProcessor final : public nsIRequestObserver {
     34 public:
     35  NS_DECL_ISUPPORTS
     36 
     37  ScriptResponseHeaderProcessor(RefPtr<ThreadSafeWorkerRef>& aWorkerRef,
     38                                bool aIsMainScript,
     39                                bool aRequiresStrictMimeCheck,
     40                                JS::ModuleType aModuleType)
     41      : mWorkerRef(aWorkerRef),
     42        mIsMainScript(aIsMainScript),
     43        mRequiresStrictMimeCheck(aRequiresStrictMimeCheck),
     44        mModuleType(aModuleType) {
     45    AssertIsOnMainThread();
     46  }
     47 
     48  NS_IMETHOD OnStartRequest(nsIRequest* aRequest) override {
     49    nsresult rv = NS_OK;
     50    if (mRequiresStrictMimeCheck) {
     51      rv = EnsureExpectedModuleType(aRequest);
     52      if (NS_WARN_IF(NS_FAILED(rv))) {
     53        aRequest->Cancel(rv);
     54        return NS_OK;
     55      }
     56    }
     57 
     58    if (!StaticPrefs::browser_tabs_remote_useCrossOriginEmbedderPolicy()) {
     59      return NS_OK;
     60    }
     61 
     62    rv = ProcessCrossOriginEmbedderPolicyHeader(aRequest);
     63 
     64    if (NS_WARN_IF(NS_FAILED(rv))) {
     65      aRequest->Cancel(rv);
     66    }
     67 
     68    return rv;
     69  }
     70 
     71  NS_IMETHOD OnStopRequest(nsIRequest* aRequest,
     72                           nsresult aStatusCode) override {
     73    return NS_OK;
     74  }
     75 
     76  static nsresult ProcessCrossOriginEmbedderPolicyHeader(
     77      WorkerPrivate* aWorkerPrivate,
     78      nsILoadInfo::CrossOriginEmbedderPolicy aPolicy, bool aIsMainScript);
     79 
     80 private:
     81  ~ScriptResponseHeaderProcessor() = default;
     82 
     83  nsresult EnsureExpectedModuleType(nsIRequest* aRequest);
     84 
     85  nsresult ProcessCrossOriginEmbedderPolicyHeader(nsIRequest* aRequest);
     86 
     87  // The owner of ScriptResponseHeaderProcessor should give the WorkerRef to
     88  // ensure ScriptResponseHeaderProcessor works with an valid WorkerPrivate.
     89  RefPtr<ThreadSafeWorkerRef> mWorkerRef;
     90  const bool mIsMainScript;
     91  const bool mRequiresStrictMimeCheck;
     92  const JS::ModuleType mModuleType;
     93 };
     94 
     95 }  // namespace workerinternals::loader
     96 
     97 }  // namespace mozilla::dom
     98 
     99 #endif /* mozilla_dom_workers_ScriptResponseHeaderProcessor_h__ */