Skip to content

Commit

Permalink
fix: lazy load autofill drivers
Browse files Browse the repository at this point in the history
  • Loading branch information
brenca committed Aug 13, 2019
1 parent 0ac0bd2 commit a79b94d
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 25 deletions.
10 changes: 4 additions & 6 deletions shell/browser/atom_autofill_driver.cc
Expand Up @@ -12,18 +12,16 @@

namespace electron {

AutofillDriver::AutofillDriver(content::RenderFrameHost* render_frame_host)
AutofillDriver::AutofillDriver(
content::RenderFrameHost* render_frame_host,
mojom::ElectronAutofillDriverAssociatedRequest request)
: render_frame_host_(render_frame_host), binding_(this) {
autofill_popup_.reset(new AutofillPopup());
binding_.Bind(std::move(request));
}

AutofillDriver::~AutofillDriver() {}

void AutofillDriver::BindRequest(
mojom::ElectronAutofillDriverAssociatedRequest request) {
binding_.Bind(std::move(request));
}

void AutofillDriver::ShowAutofillPopup(
const gfx::RectF& bounds,
const std::vector<base::string16>& values,
Expand Down
5 changes: 2 additions & 3 deletions shell/browser/atom_autofill_driver.h
Expand Up @@ -19,12 +19,11 @@ namespace electron {

class AutofillDriver : public mojom::ElectronAutofillDriver {
public:
explicit AutofillDriver(content::RenderFrameHost* render_frame_host);
AutofillDriver(content::RenderFrameHost* render_frame_host,
mojom::ElectronAutofillDriverAssociatedRequest request);

~AutofillDriver() override;

void BindRequest(mojom::ElectronAutofillDriverAssociatedRequest request);

void ShowAutofillPopup(const gfx::RectF& bounds,
const std::vector<base::string16>& values,
const std::vector<base::string16>& labels) override;
Expand Down
22 changes: 10 additions & 12 deletions shell/browser/atom_autofill_driver_factory.cc
Expand Up @@ -20,8 +20,10 @@ namespace electron {
namespace {

std::unique_ptr<AutofillDriver> CreateDriver(
content::RenderFrameHost* render_frame_host) {
return std::make_unique<AutofillDriver>(render_frame_host);
content::RenderFrameHost* render_frame_host,
mojom::ElectronAutofillDriverAssociatedRequest request) {
return std::make_unique<AutofillDriver>(render_frame_host,
std::move(request));
}

} // namespace
Expand All @@ -43,8 +45,10 @@ void AutofillDriverFactory::BindAutofillDriver(
return;

AutofillDriver* driver = factory->DriverForFrame(render_frame_host);
if (driver)
driver->BindRequest(std::move(request));
if (!driver)
factory->AddDriverForFrame(
render_frame_host,
base::BindOnce(CreateDriver, render_frame_host, std::move(request)));
}

AutofillDriverFactory::AutofillDriverFactory(content::WebContents* web_contents)
Expand All @@ -57,12 +61,6 @@ AutofillDriverFactory::AutofillDriverFactory(content::WebContents* web_contents)
}
}

void AutofillDriverFactory::RenderFrameCreated(
content::RenderFrameHost* render_frame_host) {
AddDriverForFrame(render_frame_host,
base::Bind(CreateDriver, render_frame_host));
}

void AutofillDriverFactory::RenderFrameDeleted(
content::RenderFrameHost* render_frame_host) {
DeleteDriverForFrame(render_frame_host);
Expand All @@ -88,12 +86,12 @@ AutofillDriver* AutofillDriverFactory::DriverForFrame(

void AutofillDriverFactory::AddDriverForFrame(
content::RenderFrameHost* render_frame_host,
base::Callback<std::unique_ptr<AutofillDriver>()> factory_method) {
CreationCallback factory_method) {
auto insertion_result =
driver_map_.insert(std::make_pair(render_frame_host, nullptr));
// This can be called twice for the key representing the main frame.
if (insertion_result.second) {
insertion_result.first->second = factory_method.Run();
insertion_result.first->second = std::move(factory_method).Run();
}
}

Expand Down
9 changes: 5 additions & 4 deletions shell/browser/atom_autofill_driver_factory.h
Expand Up @@ -21,22 +21,23 @@ class AutofillDriverFactory
: public content::WebContentsObserver,
public content::WebContentsUserData<AutofillDriverFactory> {
public:
typedef base::OnceCallback<std::unique_ptr<AutofillDriver>()>
CreationCallback;

~AutofillDriverFactory() override;

static void BindAutofillDriver(
mojom::ElectronAutofillDriverAssociatedRequest request,
content::RenderFrameHost* render_frame_host);

// content::WebContentsObserver:
void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override;
void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
void DidFinishNavigation(
content::NavigationHandle* navigation_handle) override;

AutofillDriver* DriverForFrame(content::RenderFrameHost* render_frame_host);
void AddDriverForFrame(
content::RenderFrameHost* render_frame_host,
base::Callback<std::unique_ptr<AutofillDriver>()> factory_method);
void AddDriverForFrame(content::RenderFrameHost* render_frame_host,
CreationCallback factory_method);
void DeleteDriverForFrame(content::RenderFrameHost* render_frame_host);

void CloseAllPopups();
Expand Down

0 comments on commit a79b94d

Please sign in to comment.