Browse Source

fix: load source maps from custom protocols and asar bundles (#28615)

* fix: load source maps from custom protocols and asar bundles

* chore: fix lint

Co-authored-by: deepak1556 <[email protected]>
trop[bot] 4 years ago
parent
commit
5ab8cb7482

+ 2 - 0
filenames.gni

@@ -404,6 +404,8 @@ filenames = {
     "shell/browser/native_window_observer.h",
     "shell/browser/net/asar/asar_url_loader.cc",
     "shell/browser/net/asar/asar_url_loader.h",
+    "shell/browser/net/asar/asar_url_loader_factory.cc",
+    "shell/browser/net/asar/asar_url_loader_factory.h",
     "shell/browser/net/cert_verifier_client.cc",
     "shell/browser/net/cert_verifier_client.h",
     "shell/browser/net/electron_url_loader_factory.cc",

+ 42 - 0
shell/browser/net/asar/asar_url_loader_factory.cc

@@ -0,0 +1,42 @@
+// Copyright (c) 2021 GitHub, Inc.
+// Use of this source code is governed by the MIT license that can be
+// found in the LICENSE file.
+
+#include "shell/browser/net/asar/asar_url_loader_factory.h"
+
+#include <utility>
+
+#include "shell/browser/net/asar/asar_url_loader.h"
+
+namespace electron {
+
+// static
+mojo::PendingRemote<network::mojom::URLLoaderFactory>
+AsarURLLoaderFactory::Create() {
+  mojo::PendingRemote<network::mojom::URLLoaderFactory> pending_remote;
+
+  // The AsarURLLoaderFactory will delete itself when there are no more
+  // receivers - see the SelfDeletingURLLoaderFactory::OnDisconnect method.
+  new AsarURLLoaderFactory(pending_remote.InitWithNewPipeAndPassReceiver());
+
+  return pending_remote;
+}
+
+AsarURLLoaderFactory::AsarURLLoaderFactory(
+    mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver)
+    : network::SelfDeletingURLLoaderFactory(std::move(factory_receiver)) {}
+AsarURLLoaderFactory::~AsarURLLoaderFactory() = default;
+
+void AsarURLLoaderFactory::CreateLoaderAndStart(
+    mojo::PendingReceiver<network::mojom::URLLoader> loader,
+    int32_t routing_id,
+    int32_t request_id,
+    uint32_t options,
+    const network::ResourceRequest& request,
+    mojo::PendingRemote<network::mojom::URLLoaderClient> client,
+    const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
+  asar::CreateAsarURLLoader(request, std::move(loader), std::move(client),
+                            new net::HttpResponseHeaders(""));
+}
+
+}  // namespace electron

+ 38 - 0
shell/browser/net/asar/asar_url_loader_factory.h

@@ -0,0 +1,38 @@
+// Copyright (c) 2021 GitHub, Inc.
+// Use of this source code is governed by the MIT license that can be
+// found in the LICENSE file.
+
+#ifndef SHELL_BROWSER_NET_ASAR_ASAR_URL_LOADER_FACTORY_H_
+#define SHELL_BROWSER_NET_ASAR_ASAR_URL_LOADER_FACTORY_H_
+
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "services/network/public/cpp/self_deleting_url_loader_factory.h"
+
+namespace electron {
+
+// Provide support for accessing asar archives in file:// protocol.
+class AsarURLLoaderFactory : public network::SelfDeletingURLLoaderFactory {
+ public:
+  static mojo::PendingRemote<network::mojom::URLLoaderFactory> Create();
+
+ private:
+  AsarURLLoaderFactory(
+      mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver);
+  ~AsarURLLoaderFactory() override;
+
+  // network::mojom::URLLoaderFactory:
+  void CreateLoaderAndStart(
+      mojo::PendingReceiver<network::mojom::URLLoader> loader,
+      int32_t routing_id,
+      int32_t request_id,
+      uint32_t options,
+      const network::ResourceRequest& request,
+      mojo::PendingRemote<network::mojom::URLLoaderClient> client,
+      const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
+      override;
+};
+
+}  // namespace electron
+
+#endif  // SHELL_BROWSER_NET_ASAR_ASAR_URL_LOADER_FACTORY_H_

+ 3 - 41
shell/browser/protocol_registry.cc

@@ -2,55 +2,17 @@
 // Use of this source code is governed by the MIT license that can be
 // found in the LICENSE file.
 
+#include "shell/browser/protocol_registry.h"
+
 #include <memory>
 #include <utility>
 
 #include "content/public/browser/web_contents.h"
-#include "services/network/public/cpp/self_deleting_url_loader_factory.h"
 #include "shell/browser/electron_browser_context.h"
-#include "shell/browser/net/asar/asar_url_loader.h"
-#include "shell/browser/protocol_registry.h"
+#include "shell/browser/net/asar/asar_url_loader_factory.h"
 
 namespace electron {
 
-namespace {
-
-// Provide support for accessing asar archives in file:// protocol.
-class AsarURLLoaderFactory : public network::SelfDeletingURLLoaderFactory {
- public:
-  static mojo::PendingRemote<network::mojom::URLLoaderFactory> Create() {
-    mojo::PendingRemote<network::mojom::URLLoaderFactory> pending_remote;
-
-    // The AsarURLLoaderFactory will delete itself when there are no more
-    // receivers - see the SelfDeletingURLLoaderFactory::OnDisconnect method.
-    new AsarURLLoaderFactory(pending_remote.InitWithNewPipeAndPassReceiver());
-
-    return pending_remote;
-  }
-
- private:
-  AsarURLLoaderFactory(
-      mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver)
-      : network::SelfDeletingURLLoaderFactory(std::move(factory_receiver)) {}
-  ~AsarURLLoaderFactory() override = default;
-
-  // network::mojom::URLLoaderFactory:
-  void CreateLoaderAndStart(
-      mojo::PendingReceiver<network::mojom::URLLoader> loader,
-      int32_t routing_id,
-      int32_t request_id,
-      uint32_t options,
-      const network::ResourceRequest& request,
-      mojo::PendingRemote<network::mojom::URLLoaderClient> client,
-      const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
-      override {
-    asar::CreateAsarURLLoader(request, std::move(loader), std::move(client),
-                              new net::HttpResponseHeaders(""));
-  }
-};
-
-}  // namespace
-
 // static
 ProtocolRegistry* ProtocolRegistry::FromBrowserContext(
     content::BrowserContext* context) {

+ 1 - 0
shell/browser/protocol_registry.h

@@ -30,6 +30,7 @@ class ProtocolRegistry {
       bool allow_file_access);
 
   const HandlersMap& intercept_handlers() const { return intercept_handlers_; }
+  const HandlersMap& handlers() const { return handlers_; }
 
   bool RegisterProtocol(ProtocolType type,
                         const std::string& scheme,

+ 13 - 3
shell/browser/ui/inspectable_web_contents.cc

@@ -41,6 +41,8 @@
 #include "services/network/public/cpp/simple_url_loader.h"
 #include "services/network/public/cpp/simple_url_loader_stream_consumer.h"
 #include "services/network/public/cpp/wrapper_shared_url_loader_factory.h"
+#include "shell/browser/net/asar/asar_url_loader_factory.h"
+#include "shell/browser/protocol_registry.h"
 #include "shell/browser/ui/inspectable_web_contents_delegate.h"
 #include "shell/browser/ui/inspectable_web_contents_view.h"
 #include "shell/browser/ui/inspectable_web_contents_view_delegate.h"
@@ -676,12 +678,20 @@ void InspectableWebContents::LoadNetworkResource(DispatchCallback callback,
   resource_request.site_for_cookies = net::SiteForCookies::FromUrl(gurl);
   resource_request.headers.AddHeadersFromString(headers);
 
+  auto* protocol_registry = ProtocolRegistry::FromBrowserContext(
+      GetDevToolsWebContents()->GetBrowserContext());
   NetworkResourceLoader::URLLoaderFactoryHolder url_loader_factory;
   if (gurl.SchemeIsFile()) {
     mojo::PendingRemote<network::mojom::URLLoaderFactory> pending_remote =
-        content::CreateFileURLLoaderFactory(
-            base::FilePath() /* profile_path */,
-            nullptr /* shared_cors_origin_access_list */);
+        AsarURLLoaderFactory::Create();
+    url_loader_factory = network::SharedURLLoaderFactory::Create(
+        std::make_unique<network::WrapperPendingSharedURLLoaderFactory>(
+            std::move(pending_remote)));
+  } else if (protocol_registry->IsProtocolRegistered(gurl.scheme())) {
+    auto& protocol_handler = protocol_registry->handlers().at(gurl.scheme());
+    mojo::PendingRemote<network::mojom::URLLoaderFactory> pending_remote =
+        ElectronURLLoaderFactory::Create(protocol_handler.first,
+                                         protocol_handler.second);
     url_loader_factory = network::SharedURLLoaderFactory::Create(
         std::make_unique<network::WrapperPendingSharedURLLoaderFactory>(
             std::move(pending_remote)));