Skip to content

Commit

Permalink
fix: bind ElectronApiServiceImpl later
Browse files Browse the repository at this point in the history
DidCreateDocumentElement is called before the ElectronApiServiceImpl
gets bound.
  • Loading branch information
zcbenz committed Aug 12, 2019
1 parent 14aa3ad commit 0ec005d
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 26 deletions.
25 changes: 9 additions & 16 deletions shell/renderer/electron_api_service_impl.cc
Expand Up @@ -98,33 +98,26 @@ ElectronApiServiceImpl::~ElectronApiServiceImpl() = default;

ElectronApiServiceImpl::ElectronApiServiceImpl(
content::RenderFrame* render_frame,
RendererClientBase* renderer_client,
mojom::ElectronRendererAssociatedRequest request)
RendererClientBase* renderer_client)
: content::RenderFrameObserver(render_frame),
binding_(this),
render_frame_(render_frame),
renderer_client_(renderer_client) {
renderer_client_(renderer_client),
weak_factory_(this) {}

void ElectronApiServiceImpl::AssociateWith(
mojom::ElectronRendererAssociatedRequest request) {
LOG(ERROR) << "AssociateWith: " << this;
binding_.Bind(std::move(request));
binding_.set_connection_error_handler(base::BindOnce(
&ElectronApiServiceImpl::OnDestruct, base::Unretained(this)));
}

// static
void ElectronApiServiceImpl::CreateMojoService(
content::RenderFrame* render_frame,
RendererClientBase* renderer_client,
mojom::ElectronRendererAssociatedRequest request) {
DCHECK(render_frame);

// Owns itself. Will be deleted when the render frame is destroyed.
new ElectronApiServiceImpl(render_frame, renderer_client, std::move(request));
}

void ElectronApiServiceImpl::DidCreateDocumentElement() {
document_created_ = true;
}

void ElectronApiServiceImpl::OnDestruct() {
LOG(ERROR) << "OnDestruct: " << this;
delete this;
}

Expand Down Expand Up @@ -152,7 +145,7 @@ void ElectronApiServiceImpl::Message(bool internal,
if (!document_created_)
return;

blink::WebLocalFrame* frame = render_frame_->GetWebFrame();
blink::WebLocalFrame* frame = render_frame()->GetWebFrame();
if (!frame)
return;

Expand Down
18 changes: 10 additions & 8 deletions shell/renderer/electron_api_service_impl.h
Expand Up @@ -7,6 +7,7 @@

#include <string>

#include "base/memory/weak_ptr.h"
#include "content/public/renderer/render_frame.h"
#include "content/public/renderer/render_frame_observer.h"
#include "electron/shell/common/api/api.mojom.h"
Expand All @@ -19,10 +20,10 @@ class RendererClientBase;
class ElectronApiServiceImpl : public mojom::ElectronRenderer,
public content::RenderFrameObserver {
public:
static void CreateMojoService(
content::RenderFrame* render_frame,
RendererClientBase* renderer_client,
mojom::ElectronRendererAssociatedRequest request);
ElectronApiServiceImpl(content::RenderFrame* render_frame,
RendererClientBase* renderer_client);

void AssociateWith(mojom::ElectronRendererAssociatedRequest request);

void Message(bool internal,
bool send_to_all,
Expand All @@ -33,11 +34,12 @@ class ElectronApiServiceImpl : public mojom::ElectronRenderer,
void TakeHeapSnapshot(mojo::ScopedHandle file,
TakeHeapSnapshotCallback callback) override;

base::WeakPtr<ElectronApiServiceImpl> GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}

private:
~ElectronApiServiceImpl() override;
ElectronApiServiceImpl(content::RenderFrame* render_frame,
RendererClientBase* renderer_client,
mojom::ElectronRendererAssociatedRequest request);

// RenderFrameObserver implementation.
void DidCreateDocumentElement() override;
Expand All @@ -48,8 +50,8 @@ class ElectronApiServiceImpl : public mojom::ElectronRenderer,

mojo::AssociatedBinding<mojom::ElectronRenderer> binding_;

content::RenderFrame* render_frame_;
RendererClientBase* renderer_client_;
base::WeakPtrFactory<ElectronApiServiceImpl> weak_factory_;

DISALLOW_COPY_AND_ASSIGN(ElectronApiServiceImpl);
};
Expand Down
5 changes: 3 additions & 2 deletions shell/renderer/renderer_client_base.cc
Expand Up @@ -235,9 +235,10 @@ void RendererClientBase::RenderFrameCreated(
// it is possible to trigger the preload script before the document is ready
// through this interface, we should delay adding it to the registry until
// the document is ready.
auto* service = new ElectronApiServiceImpl(render_frame, this);
render_frame->GetAssociatedInterfaceRegistry()->AddInterface(
base::BindRepeating(&ElectronApiServiceImpl::CreateMojoService,
render_frame, this));
base::BindRepeating(&ElectronApiServiceImpl::AssociateWith,
service->GetWeakPtr()));

#if BUILDFLAG(ENABLE_PDF_VIEWER)
// Allow access to file scheme from pdf viewer.
Expand Down

0 comments on commit 0ec005d

Please sign in to comment.