Skip to content

Commit

Permalink
Create wallet ethereum js handler if it doesnt exist (#12193)
Browse files Browse the repository at this point in the history
  • Loading branch information
spylogsster authored Feb 9, 2022
1 parent 37d8cf8 commit 23d46d9
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 12 deletions.
3 changes: 2 additions & 1 deletion renderer/brave_content_renderer_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand Down
25 changes: 16 additions & 9 deletions renderer/brave_wallet/brave_wallet_render_frame_observer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

#include "brave/renderer/brave_wallet/brave_wallet_render_frame_observer.h"

#include <utility>

#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"
Expand All @@ -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() {}

Expand All @@ -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();
}
Expand Down
7 changes: 5 additions & 2 deletions renderer/brave_wallet/brave_wallet_render_frame_observer.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,12 @@ namespace brave_wallet {

class BraveWalletRenderFrameObserver : public content::RenderFrameObserver {
public:
using GetDynamicParamsCallback =
base::RepeatingCallback<const brave::mojom::DynamicParams&()>;

explicit BraveWalletRenderFrameObserver(
content::RenderFrame* render_frame,
brave::mojom::DynamicParams dynamic_params);
GetDynamicParamsCallback get_dynamic_params_callback);
~BraveWalletRenderFrameObserver() override;

// RenderFrameObserver implementation.
Expand All @@ -40,7 +43,7 @@ class BraveWalletRenderFrameObserver : public content::RenderFrameObserver {
std::unique_ptr<BraveWalletJSHandler> native_javascript_handle_;

GURL url_;
const brave::mojom::DynamicParams dynamic_params_;
GetDynamicParamsCallback get_dynamic_params_callback_;
};

} // namespace brave_wallet
Expand Down
3 changes: 3 additions & 0 deletions renderer/test/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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",
Expand Down
103 changes: 103 additions & 0 deletions renderer/test/brave_wallet_js_handler_browsertest.cc
Original file line number Diff line number Diff line change
@@ -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);
}

0 comments on commit 23d46d9

Please sign in to comment.