From 23d46d9b6ae35cd9879a444aaf2b4452182f1a42 Mon Sep 17 00:00:00 2001 From: Cepera Date: Wed, 9 Feb 2022 21:47:06 +0300 Subject: [PATCH] Create wallet ethereum js handler if it doesnt exist (#12193) --- renderer/brave_content_renderer_client.cc | 3 +- .../brave_wallet_render_frame_observer.cc | 25 +++-- .../brave_wallet_render_frame_observer.h | 7 +- renderer/test/BUILD.gn | 3 + .../brave_wallet_js_handler_browsertest.cc | 103 ++++++++++++++++++ 5 files changed, 129 insertions(+), 12 deletions(-) create mode 100644 renderer/test/brave_wallet_js_handler_browsertest.cc diff --git a/renderer/brave_content_renderer_client.cc b/renderer/brave_content_renderer_client.cc index 7d7dc6a8e1d8..86b3d29e1243 100644 --- a/renderer/brave_content_renderer_client.cc +++ b/renderer/brave_content_renderer_client.cc @@ -69,7 +69,8 @@ void BraveContentRendererClient::RenderFrameCreated( if (base::FeatureList::IsEnabled( brave_wallet::features::kNativeBraveWalletFeature)) { new brave_wallet::BraveWalletRenderFrameObserver( - render_frame, BraveRenderThreadObserver::GetDynamicParams()); + render_frame, + base::BindRepeating(&BraveRenderThreadObserver::GetDynamicParams)); } if (brave_search::IsDefaultAPIEnabled()) { diff --git a/renderer/brave_wallet/brave_wallet_render_frame_observer.cc b/renderer/brave_wallet/brave_wallet_render_frame_observer.cc index 8ead03ca7208..b718a883a9b1 100644 --- a/renderer/brave_wallet/brave_wallet_render_frame_observer.cc +++ b/renderer/brave_wallet/brave_wallet_render_frame_observer.cc @@ -5,6 +5,8 @@ #include "brave/renderer/brave_wallet/brave_wallet_render_frame_observer.h" +#include + #include "content/public/renderer/render_frame.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/web/web_local_frame.h" @@ -13,12 +15,9 @@ namespace brave_wallet { BraveWalletRenderFrameObserver::BraveWalletRenderFrameObserver( content::RenderFrame* render_frame, - brave::mojom::DynamicParams dynamic_params) - : RenderFrameObserver(render_frame), dynamic_params_(dynamic_params) { - native_javascript_handle_.reset(new BraveWalletJSHandler( - render_frame, dynamic_params.brave_use_native_wallet, - dynamic_params.allow_overwrite_window_ethereum)); -} + GetDynamicParamsCallback get_dynamic_params_callback) + : RenderFrameObserver(render_frame), + get_dynamic_params_callback_(std::move(get_dynamic_params_callback)) {} BraveWalletRenderFrameObserver::~BraveWalletRenderFrameObserver() {} @@ -36,11 +35,19 @@ void BraveWalletRenderFrameObserver::DidCreateScriptContext( if (url_.is_empty() || !url_.is_valid() || url_.spec() == "about:blank") url_ = url::Origin(render_frame()->GetWebFrame()->GetSecurityOrigin()) .GetURL(); - - if (!dynamic_params_.brave_use_native_wallet || !native_javascript_handle_ || - !url_.SchemeIsHTTPOrHTTPS()) + if (!url_.SchemeIsHTTPOrHTTPS()) + return; + auto dynamic_params = get_dynamic_params_callback_.Run(); + if (!dynamic_params.brave_use_native_wallet) { + native_javascript_handle_.reset(); return; + } + if (!native_javascript_handle_) { + native_javascript_handle_.reset(new BraveWalletJSHandler( + render_frame(), dynamic_params.brave_use_native_wallet, + dynamic_params.allow_overwrite_window_ethereum)); + } native_javascript_handle_->AddJavaScriptObjectToFrame(context); native_javascript_handle_->ConnectEvent(); } diff --git a/renderer/brave_wallet/brave_wallet_render_frame_observer.h b/renderer/brave_wallet/brave_wallet_render_frame_observer.h index 33edabbab413..1ff5b9f750da 100644 --- a/renderer/brave_wallet/brave_wallet_render_frame_observer.h +++ b/renderer/brave_wallet/brave_wallet_render_frame_observer.h @@ -20,9 +20,12 @@ namespace brave_wallet { class BraveWalletRenderFrameObserver : public content::RenderFrameObserver { public: + using GetDynamicParamsCallback = + base::RepeatingCallback; + explicit BraveWalletRenderFrameObserver( content::RenderFrame* render_frame, - brave::mojom::DynamicParams dynamic_params); + GetDynamicParamsCallback get_dynamic_params_callback); ~BraveWalletRenderFrameObserver() override; // RenderFrameObserver implementation. @@ -40,7 +43,7 @@ class BraveWalletRenderFrameObserver : public content::RenderFrameObserver { std::unique_ptr native_javascript_handle_; GURL url_; - const brave::mojom::DynamicParams dynamic_params_; + GetDynamicParamsCallback get_dynamic_params_callback_; }; } // namespace brave_wallet diff --git a/renderer/test/BUILD.gn b/renderer/test/BUILD.gn index 306d8a95e04e..cb1b3aa4eed7 100644 --- a/renderer/test/BUILD.gn +++ b/renderer/test/BUILD.gn @@ -9,6 +9,7 @@ source_set("browser_tests") { testonly = true sources = [ + "brave_wallet_js_handler_browsertest.cc", "digital_goods_api_browsertest.cc", "file_system_access_browsertest.cc", "navigator_connection_attribute_browsertest.cc", @@ -21,7 +22,9 @@ source_set("browser_tests") { deps = [ "//base/test:test_support", "//brave/common", + "//brave/components/brave_wallet/browser", "//chrome/browser/ui", + "//chrome/common", "//chrome/test:test_support_ui", "//components/embedder_support", "//components/web_package", diff --git a/renderer/test/brave_wallet_js_handler_browsertest.cc b/renderer/test/brave_wallet_js_handler_browsertest.cc new file mode 100644 index 000000000000..ed3e436cffc5 --- /dev/null +++ b/renderer/test/brave_wallet_js_handler_browsertest.cc @@ -0,0 +1,103 @@ +/* Copyright (c) 2022 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "base/path_service.h" +#include "brave/common/brave_paths.h" +#include "brave/components/brave_wallet/browser/brave_wallet_utils.h" +#include "build/build_config.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_commands.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/common/chrome_isolated_world_ids.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/ui_test_utils.h" +#include "content/public/browser/web_contents.h" +#include "content/public/test/browser_test.h" +#include "content/public/test/browser_test_utils.h" +#include "net/dns/mock_host_resolver.h" +#include "net/test/embedded_test_server/embedded_test_server.h" +#include "url/gurl.h" + +class BraveWalletJSHandlerBrowserTest : public InProcessBrowserTest { + public: + BraveWalletJSHandlerBrowserTest() + : https_server_(net::EmbeddedTestServer::TYPE_HTTPS) { + brave::RegisterPathProvider(); + base::FilePath test_data_dir; + base::PathService::Get(brave::DIR_TEST_DATA, &test_data_dir); + https_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_OK); + https_server_.ServeFilesFromDirectory(test_data_dir); + } + + ~BraveWalletJSHandlerBrowserTest() override = default; + + void SetUpOnMainThread() override { + InProcessBrowserTest::SetUpOnMainThread(); + + EXPECT_TRUE(https_server_.Start()); + // Map all hosts to localhost. + host_resolver()->AddRule("*", "127.0.0.1"); + } + + content::WebContents* web_contents() { + return browser()->tab_strip_model()->GetActiveWebContents(); + } + + content::RenderFrameHost* main_frame() { + return web_contents()->GetMainFrame(); + } + + protected: + net::EmbeddedTestServer https_server_; +}; + +IN_PROC_BROWSER_TEST_F(BraveWalletJSHandlerBrowserTest, AttachOnReload) { + brave_wallet::SetDefaultWallet(browser()->profile()->GetPrefs(), + brave_wallet::mojom::DefaultWallet::None); + const GURL url = https_server_.GetURL("/simple.html"); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); + + std::string command = "window.ethereum.isMetaMask"; + EXPECT_TRUE(content::EvalJs(main_frame(), command) + .error.find("Cannot read properties of undefined") != + std::string::npos); + EXPECT_EQ(browser()->tab_strip_model()->GetTabCount(), 1); + brave_wallet::SetDefaultWallet( + browser()->profile()->GetPrefs(), + brave_wallet::mojom::DefaultWallet::BraveWallet); + chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); + EXPECT_TRUE(content::WaitForLoadStop(web_contents())); + auto result = content::EvalJs(main_frame(), command); + EXPECT_EQ(result.error, ""); + ASSERT_TRUE(result.ExtractBool()); + EXPECT_EQ(browser()->tab_strip_model()->GetTabCount(), 1); +} + +IN_PROC_BROWSER_TEST_F(BraveWalletJSHandlerBrowserTest, + DoNotAttachToChromePages) { + brave_wallet::SetDefaultWallet(browser()->profile()->GetPrefs(), + brave_wallet::mojom::DefaultWallet::None); + ASSERT_TRUE( + ui_test_utils::NavigateToURL(browser(), GURL("chrome://newtab/"))); + + std::string command = "window.ethereum.isMetaMask"; + EXPECT_TRUE(content::EvalJs(main_frame(), command, + content::EXECUTE_SCRIPT_DEFAULT_OPTIONS, + ISOLATED_WORLD_ID_TRANSLATE) + .error.find("Cannot read properties of undefined") != + std::string::npos); + EXPECT_EQ(browser()->tab_strip_model()->GetTabCount(), 1); + brave_wallet::SetDefaultWallet( + browser()->profile()->GetPrefs(), + brave_wallet::mojom::DefaultWallet::BraveWallet); + chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); + EXPECT_TRUE(content::WaitForLoadStop(web_contents())); + EXPECT_TRUE(content::EvalJs(main_frame(), command, + content::EXECUTE_SCRIPT_DEFAULT_OPTIONS, + ISOLATED_WORLD_ID_TRANSLATE) + .error.find("Cannot read properties of undefined") != + std::string::npos); + EXPECT_EQ(browser()->tab_strip_model()->GetTabCount(), 1); +}