refactor: call methods directly from electron:WebContents

Writing static method boilerplate isn't fun
This commit is contained in:
samuelmaddock
2021-06-16 02:49:32 -04:00
parent ccfde6c9d4
commit b25cc88f18
3 changed files with 28 additions and 34 deletions

View File

@@ -1397,6 +1397,10 @@ void WebContents::HandleNewRenderFrame(
void WebContents::RenderFrameCreated(
content::RenderFrameHost* render_frame_host) {
HandleNewRenderFrame(render_frame_host);
auto* web_frame = WebFrameMain::From(render_frame_host);
if (web_frame)
web_frame->Connect();
}
void WebContents::RenderViewDeleted(content::RenderViewHost* render_view_host) {
@@ -1643,7 +1647,9 @@ void WebContents::RenderFrameDeleted(
content::RenderFrameHost* render_frame_host) {
// A WebFrameMain can outlive its RenderFrameHost so we need to mark it as
// disposed to prevent access to it.
WebFrameMain::RenderFrameDeleted(render_frame_host);
auto* web_frame = WebFrameMain::From(render_frame_host);
if (web_frame)
web_frame->MarkRenderFrameDisposed();
}
void WebContents::DidStartNavigation(

View File

@@ -61,7 +61,8 @@ typedef std::unordered_map<content::RenderFrameHost*, WebFrameMain*>
base::LazyInstance<RenderFrameMap>::DestructorAtExit g_render_frame_map =
LAZY_INSTANCE_INITIALIZER;
WebFrameMain* FromRenderFrameHost(content::RenderFrameHost* rfh) {
// static
WebFrameMain* WebFrameMain::From(content::RenderFrameHost* rfh) {
auto frame_map = g_render_frame_map.Get();
auto iter = frame_map.find(rfh);
auto* web_frame = iter == frame_map.end() ? nullptr : iter->second;
@@ -293,6 +294,13 @@ std::vector<content::RenderFrameHost*> WebFrameMain::FramesInSubtree() const {
return frame_hosts;
}
void WebFrameMain::Connect() {
if (pending_receiver_) {
render_frame_->GetRemoteInterfaces()->GetInterface(
std::move(pending_receiver_));
}
}
// static
gin::Handle<WebFrameMain> WebFrameMain::New(v8::Isolate* isolate) {
return gin::Handle<WebFrameMain>();
@@ -303,7 +311,7 @@ gin::Handle<WebFrameMain> WebFrameMain::From(v8::Isolate* isolate,
content::RenderFrameHost* rfh) {
if (rfh == nullptr)
return gin::Handle<WebFrameMain>();
auto* web_frame = FromRenderFrameHost(rfh);
auto* web_frame = From(rfh);
if (web_frame)
return gin::CreateHandle(isolate, web_frame);
@@ -324,26 +332,6 @@ gin::Handle<WebFrameMain> WebFrameMain::FromID(v8::Isolate* isolate,
return From(isolate, rfh);
}
// static
void WebFrameMain::RenderFrameDeleted(content::RenderFrameHost* rfh) {
auto* web_frame = FromRenderFrameHost(rfh);
if (web_frame)
web_frame->MarkRenderFrameDisposed();
}
void WebFrameMain::RenderFrameCreated(content::RenderFrameHost* rfh) {
auto* web_frame = FromRenderFrameHost(rfh);
if (web_frame)
web_frame->Connect();
}
void WebFrameMain::Connect() {
if (pending_receiver_) {
render_frame_->GetRemoteInterfaces()->GetInterface(
std::move(pending_receiver_));
}
}
// static
v8::Local<v8::ObjectTemplate> WebFrameMain::FillObjectTemplate(
v8::Isolate* isolate,

View File

@@ -31,6 +31,8 @@ namespace electron {
namespace api {
class WebContents;
// Bindings for accessing frames from the main process.
class WebFrameMain : public gin::Wrappable<WebFrameMain>,
public gin_helper::Pinnable<WebFrameMain>,
@@ -45,17 +47,7 @@ class WebFrameMain : public gin::Wrappable<WebFrameMain>,
static gin::Handle<WebFrameMain> From(
v8::Isolate* isolate,
content::RenderFrameHost* render_frame_host);
// Called to mark any RenderFrameHost as disposed by any WebFrameMain that
// may be holding a weak reference.
static void RenderFrameDeleted(content::RenderFrameHost* rfh);
static void RenderFrameCreated(content::RenderFrameHost* rfh);
// Mark RenderFrameHost as disposed and to no longer access it. This can
// occur upon frame navigation.
void MarkRenderFrameDisposed();
const mojo::Remote<mojom::ElectronRenderer>& GetRendererApi();
static WebFrameMain* From(content::RenderFrameHost* render_frame_host);
// gin::Wrappable
static gin::WrapperInfo kWrapperInfo;
@@ -69,6 +61,14 @@ class WebFrameMain : public gin::Wrappable<WebFrameMain>,
~WebFrameMain() override;
private:
friend class WebContents;
// Mark RenderFrameHost as disposed and to no longer access it. This can
// occur upon frame navigation.
void MarkRenderFrameDisposed();
const mojo::Remote<mojom::ElectronRenderer>& GetRendererApi();
// WebFrameMain can outlive its RenderFrameHost pointer so we need to check
// whether its been disposed of prior to accessing it.
bool CheckRenderFrame() const;