Browse Source

perf: prefer GURL string_view getters (#43443)

* chore: avoid double-call to url.scheme() in WebContentsZoomController::SetZoomMode()

* perf: use gurl.scheme_piece() in GetAppInfoHelperForProtocol()

* perf: use gurl.scheme_piece() in Browser::GetApplicationNameForProtocol()

* refactor: add std::less<> to HandlersMap

This lets us search it using string_view keys

* refactor: ProtocolRegistry::FindRegistered() now takes a std::string_view

* perf: use gurl.scheme_piece() in InspectableWebContents::LoadNetworkResource()

* refactor: ProtocolRegistry::FindIntercepted() now takes a std::string_view

* perf: use gurl.scheme_piece() in SimpleURLLoaderWrapper::GetURLLoaderFactoryForURL()

* perf: use gurl.scheme_piece() in ProxyingURLLoaderFactory::CreateLoaderAndStart()

* perf: use gurl.host_piece() in ElectronWebUIControllerFactory::GetWebUIType()

* perf: use gurl.host_piece() in ElectronWebUIControllerFactory::CreateWebUIControllerForURL()
Charles Kerr 7 months ago
parent
commit
5a1eeea102

+ 2 - 1
shell/browser/browser_linux.cc

@@ -10,6 +10,7 @@
 #include "base/command_line.h"
 #include "base/environment.h"
 #include "base/process/launch.h"
+#include "base/strings/strcat.h"
 #include "electron/electron_version.h"
 #include "shell/browser/javascript_environment.h"
 #include "shell/browser/native_window.h"
@@ -124,7 +125,7 @@ bool Browser::RemoveAsDefaultProtocolClient(const std::string& protocol,
 std::u16string Browser::GetApplicationNameForProtocol(const GURL& url) {
   const std::vector<std::string> argv = {
       "xdg-mime", "query", "default",
-      std::string("x-scheme-handler/") + url.scheme()};
+      base::StrCat({"x-scheme-handler/", url.scheme_piece()})};
 
   return base::ASCIIToUTF16(GetXdgAppOutput(argv).value_or(std::string()));
 }

+ 1 - 1
shell/browser/browser_win.cc

@@ -95,7 +95,7 @@ bool IsValidCustomProtocol(const std::wstring& scheme) {
 // (https://docs.microsoft.com/en-us/windows/win32/api/shlwapi/ne-shlwapi-assocstr)
 // and returns the application name, icon and path that handles the protocol.
 std::wstring GetAppInfoHelperForProtocol(ASSOCSTR assoc_str, const GURL& url) {
-  const std::wstring url_scheme = base::ASCIIToWide(url.scheme());
+  const std::wstring url_scheme = base::ASCIIToWide(url.scheme_piece());
   if (!IsValidCustomProtocol(url_scheme))
     return std::wstring();
 

+ 9 - 5
shell/browser/electron_web_ui_controller_factory.cc

@@ -25,8 +25,9 @@ ElectronWebUIControllerFactory::~ElectronWebUIControllerFactory() = default;
 content::WebUI::TypeID ElectronWebUIControllerFactory::GetWebUIType(
     content::BrowserContext* browser_context,
     const GURL& url) {
-  if (url.host() == chrome::kChromeUIDevToolsHost ||
-      url.host() == chrome::kChromeUIAccessibilityHost) {
+  if (const std::string_view host = url.host_piece();
+      host == chrome::kChromeUIDevToolsHost ||
+      host == chrome::kChromeUIAccessibilityHost) {
     return const_cast<ElectronWebUIControllerFactory*>(this);
   }
 
@@ -43,13 +44,16 @@ std::unique_ptr<content::WebUIController>
 ElectronWebUIControllerFactory::CreateWebUIControllerForURL(
     content::WebUI* web_ui,
     const GURL& url) {
-  if (url.host() == chrome::kChromeUIDevToolsHost) {
+  const std::string_view host = url.host_piece();
+
+  if (host == chrome::kChromeUIDevToolsHost) {
     auto* browser_context = web_ui->GetWebContents()->GetBrowserContext();
     return std::make_unique<DevToolsUI>(browser_context, web_ui);
-  } else if (url.host() == chrome::kChromeUIAccessibilityHost) {
-    return std::make_unique<ElectronAccessibilityUI>(web_ui);
   }
 
+  if (host == chrome::kChromeUIAccessibilityHost)
+    return std::make_unique<ElectronAccessibilityUI>(web_ui);
+
   return std::unique_ptr<content::WebUIController>();
 }
 

+ 2 - 2
shell/browser/net/electron_url_loader_factory.h

@@ -53,8 +53,8 @@ using ProtocolHandler =
                                  StartLoadingCallback)>;
 
 // scheme => (type, handler).
-using HandlersMap =
-    std::map<std::string, std::pair<ProtocolType, ProtocolHandler>>;
+using HandlersMap = std::
+    map<std::string, std::pair<ProtocolType, ProtocolHandler>, std::less<>>;
 
 // Implementation of URLLoaderFactory.
 class ElectronURLLoaderFactory : public network::SelfDeletingURLLoaderFactory {

+ 1 - 1
shell/browser/net/proxying_url_loader_factory.cc

@@ -806,7 +806,7 @@ void ProxyingURLLoaderFactory::CreateLoaderAndStart(
   bool bypass_custom_protocol_handlers =
       options & kBypassCustomProtocolHandlers;
   if (!bypass_custom_protocol_handlers) {
-    auto it = intercepted_handlers_->find(request.url.scheme());
+    auto it = intercepted_handlers_->find(request.url.scheme_piece());
     if (it != intercepted_handlers_->end()) {
       mojo::PendingRemote<network::mojom::URLLoaderFactory> loader_remote;
       this->Clone(loader_remote.InitWithNewPipeAndPassReceiver());

+ 2 - 2
shell/browser/protocol_registry.cc

@@ -74,7 +74,7 @@ bool ProtocolRegistry::UnregisterProtocol(const std::string& scheme) {
 }
 
 const HandlersMap::mapped_type* ProtocolRegistry::FindRegistered(
-    const std::string& scheme) const {
+    const std::string_view scheme) const {
   const auto& map = handlers_;
   const auto iter = map.find(scheme);
   return iter != std::end(map) ? &iter->second : nullptr;
@@ -91,7 +91,7 @@ bool ProtocolRegistry::UninterceptProtocol(const std::string& scheme) {
 }
 
 const HandlersMap::mapped_type* ProtocolRegistry::FindIntercepted(
-    const std::string& scheme) const {
+    const std::string_view scheme) const {
   const auto& map = intercept_handlers_;
   const auto iter = map.find(scheme);
   return iter != std::end(map) ? &iter->second : nullptr;

+ 3 - 2
shell/browser/protocol_registry.h

@@ -6,6 +6,7 @@
 #define ELECTRON_SHELL_BROWSER_PROTOCOL_REGISTRY_H_
 
 #include <string>
+#include <string_view>
 
 #include "content/public/browser/content_browser_client.h"
 #include "shell/browser/net/electron_url_loader_factory.h"
@@ -40,7 +41,7 @@ class ProtocolRegistry {
   bool UnregisterProtocol(const std::string& scheme);
 
   [[nodiscard]] const HandlersMap::mapped_type* FindRegistered(
-      const std::string& scheme) const;
+      std::string_view scheme) const;
 
   bool InterceptProtocol(ProtocolType type,
                          const std::string& scheme,
@@ -48,7 +49,7 @@ class ProtocolRegistry {
   bool UninterceptProtocol(const std::string& scheme);
 
   [[nodiscard]] const HandlersMap::mapped_type* FindIntercepted(
-      const std::string& scheme) const;
+      std::string_view scheme) const;
 
  private:
   friend class ElectronBrowserContext;

+ 1 - 1
shell/browser/ui/inspectable_web_contents.cc

@@ -684,7 +684,7 @@ void InspectableWebContents::LoadNetworkResource(DispatchCallback callback,
         std::make_unique<network::WrapperPendingSharedURLLoaderFactory>(
             std::move(pending_remote)));
   } else if (const auto* const protocol_handler =
-                 protocol_registry->FindRegistered(gurl.scheme())) {
+                 protocol_registry->FindRegistered(gurl.scheme_piece())) {
     url_loader_factory = network::SharedURLLoaderFactory::Create(
         std::make_unique<network::WrapperPendingSharedURLLoaderFactory>(
             ElectronURLLoaderFactory::Create(protocol_handler->first,

+ 4 - 3
shell/browser/web_contents_zoom_controller.cc

@@ -186,15 +186,16 @@ void WebContentsZoomController::SetZoomMode(ZoomMode new_mode) {
 
       if (entry) {
         GURL url = content::HostZoomMap::GetURLFromEntry(entry);
-        std::string host = net::GetHostOrSpecFromURL(url);
+        const std::string host = net::GetHostOrSpecFromURL(url);
+        const std::string scheme = url.scheme();
 
-        if (zoom_map->HasZoomLevel(url.scheme(), host)) {
+        if (zoom_map->HasZoomLevel(scheme, host)) {
           // If there are other tabs with the same origin, then set this tab's
           // zoom level to match theirs. The temporary zoom level will be
           // cleared below, but this call will make sure this tab re-draws at
           // the correct zoom level.
           double origin_zoom_level =
-              zoom_map->GetZoomLevelForHostAndScheme(url.scheme(), host);
+              zoom_map->GetZoomLevelForHostAndScheme(scheme, host);
           event_data_->new_zoom_level = origin_zoom_level;
           zoom_map->SetTemporaryZoomLevel(rfh_id, origin_zoom_level);
         } else {

+ 1 - 1
shell/common/api/electron_api_url_loader.cc

@@ -492,7 +492,7 @@ SimpleURLLoaderWrapper::GetURLLoaderFactoryForURL(const GURL& url) {
   // correctly intercept file:// scheme URLs.
   if (const bool bypass = request_options_ & kBypassCustomProtocolHandlers;
       !bypass) {
-    const auto scheme = url.scheme();
+    const std::string_view scheme = url.scheme_piece();
     const auto* const protocol_registry =
         ProtocolRegistry::FromBrowserContext(browser_context_);