Do not share SpeedreaderJsHandler betweeen gin handles. (#14642)

This commit is contained in:
Pavel Beloborodov
2022-08-17 18:03:01 +07:00
committed by GitHub
parent 59a1a11ca8
commit 70e86b5ffc
5 changed files with 43 additions and 36 deletions
@@ -331,6 +331,14 @@ IN_PROC_BROWSER_TEST_F(SpeedReaderBrowserTest, ShowOriginalPage) {
NavigateToPageSynchronously(kTestPageReadable);
auto* web_contents = ActiveWebContents();
constexpr const char kCheckNoApiInMainWorld[] =
R"js(
document.speedreader === undefined
)js";
EXPECT_TRUE(content::EvalJs(web_contents, kCheckNoApiInMainWorld,
content::EXECUTE_SCRIPT_DEFAULT_OPTIONS)
.ExtractBool());
constexpr const char kClickLinkAndGetTitle[] =
R"js(
(function() {
@@ -5,6 +5,7 @@
#include "brave/components/speedreader/renderer/speedreader_js_handler.h"
#include "brave/components/speedreader/common/constants.h"
#include "brave/components/speedreader/common/speedreader.mojom.h"
#include "content/public/renderer/render_frame.h"
#include "gin/converter.h"
@@ -14,6 +15,11 @@
#include "mojo/public/cpp/bindings/associated_remote.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
#include "third_party/blink/public/web/blink.h"
#include "third_party/blink/public/web/web_local_frame.h"
namespace {
constexpr const char kSpeedreader[] = "speedreader";
}
namespace speedreader {
@@ -24,30 +30,39 @@ SpeedreaderJSHandler::SpeedreaderJSHandler(content::RenderFrame* render_frame)
SpeedreaderJSHandler::~SpeedreaderJSHandler() = default;
void SpeedreaderJSHandler::AddJavaScriptObjectToFrame(
v8::Local<v8::Context> context) {
// static
void SpeedreaderJSHandler::Install(content::RenderFrame* render_frame) {
v8::Isolate* isolate = blink::MainThreadIsolate();
v8::HandleScope handle_scope(isolate);
v8::Local<v8::Context> context =
render_frame->GetWebFrame()->GetScriptContextFromWorldId(
isolate, kIsolatedWorldId);
if (context.IsEmpty())
return;
v8::Context::Scope context_scope(context);
v8::Local<v8::Object> global = context->Global();
gin::Handle<SpeedreaderJSHandler> handler = gin::CreateHandle(isolate, this);
// check object existence
v8::Local<v8::Value> speedreader_value =
global->Get(context, gin::StringToV8(isolate, kSpeedreader))
.ToLocalChecked();
if (!speedreader_value->IsUndefined())
return;
gin::Handle<SpeedreaderJSHandler> handler =
gin::CreateHandle(isolate, new SpeedreaderJSHandler(render_frame));
if (handler.IsEmpty())
return;
v8::PropertyDescriptor desc(handler.ToV8(), false);
desc.set_configurable(false);
std::ignore =
global->DefineProperty(isolate->GetCurrentContext(),
gin::StringToV8(isolate, "speedreader"), desc);
}
void SpeedreaderJSHandler::ResetRemote(content::RenderFrame* render_frame) {
render_frame_ = render_frame;
global
->DefineProperty(isolate->GetCurrentContext(),
gin::StringToV8(isolate, kSpeedreader), desc)
.Check();
}
gin::ObjectTemplateBuilder SpeedreaderJSHandler::GetObjectTemplateBuilder(
@@ -12,22 +12,22 @@
namespace speedreader {
class SpeedreaderJSHandler : public gin::Wrappable<SpeedreaderJSHandler> {
class SpeedreaderJSHandler final : public gin::Wrappable<SpeedreaderJSHandler> {
public:
static gin::WrapperInfo kWrapperInfo;
explicit SpeedreaderJSHandler(content::RenderFrame* render_frame);
SpeedreaderJSHandler(const SpeedreaderJSHandler&) = delete;
SpeedreaderJSHandler& operator=(const SpeedreaderJSHandler&) = delete;
~SpeedreaderJSHandler() override;
void AddJavaScriptObjectToFrame(v8::Local<v8::Context> context);
void ResetRemote(content::RenderFrame* render_frame);
static void Install(content::RenderFrame* render_frame);
private:
explicit SpeedreaderJSHandler(content::RenderFrame* render_frame);
~SpeedreaderJSHandler() final;
// gin::WrappableBase
gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
v8::Isolate* isolate) override;
v8::Isolate* isolate) final;
// A function to be called from JS
void ShowOriginalPage(v8::Isolate* isolate);
@@ -5,7 +5,6 @@
#include "brave/components/speedreader/renderer/speedreader_render_frame_observer.h"
#include "brave/components/speedreader/common/constants.h"
#include "brave/components/speedreader/common/url_readable_hints.h"
#include "brave/components/speedreader/renderer/speedreader_js_handler.h"
#include "content/public/renderer/render_frame.h"
@@ -24,21 +23,10 @@ void SpeedreaderRenderFrameObserver::DidStartNavigation(
is_speedreadable_url_ = IsURLLooksReadable(url);
}
void SpeedreaderRenderFrameObserver::DidCreateScriptContext(
v8::Local<v8::Context> context,
int32_t world_id) {
if (!is_speedreadable_url_ || !render_frame()->IsMainFrame() ||
world_id != kIsolatedWorldId) {
void SpeedreaderRenderFrameObserver::DidClearWindowObject() {
if (!is_speedreadable_url_ || !render_frame()->IsMainFrame())
return;
}
if (!native_javascript_handle_) {
native_javascript_handle_.reset(new SpeedreaderJSHandler(render_frame()));
} else {
native_javascript_handle_->ResetRemote(render_frame());
}
native_javascript_handle_->AddJavaScriptObjectToFrame(context);
SpeedreaderJSHandler::Install(render_frame());
}
void SpeedreaderRenderFrameObserver::OnDestruct() {
@@ -26,17 +26,13 @@ class SpeedreaderRenderFrameObserver : public content::RenderFrameObserver {
void DidStartNavigation(
const GURL& url,
absl::optional<blink::WebNavigationType> navigation_type) override;
void DidCreateScriptContext(v8::Local<v8::Context> context,
int32_t world_id) override;
void DidClearWindowObject() override;
private:
// RenderFrameObserver implementation.
void OnDestruct() override;
bool is_speedreadable_url_ = false;
// Handle to "handler" JavaScript object functionality.
std::unique_ptr<class SpeedreaderJSHandler> native_javascript_handle_;
};
} // namespace speedreader