Skip to content

Commit

Permalink
fix: workaround for hang when preventDefault-ing nativeWindowOpen (#2…
Browse files Browse the repository at this point in the history
…2750)

* fix: enable workaround for nativeWindowOpen hang

* add test

* test: ensure window doesn't leak into other test

* update to use new webcontents delegate methods

Co-authored-by: Andy Locascio <andy@slack-corp.com>
  • Loading branch information
trop[bot] and loc committed Mar 25, 2020
1 parent 9695790 commit a6ff42c
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 1 deletion.
2 changes: 1 addition & 1 deletion docs/api/structures/extension.md
Expand Up @@ -5,4 +5,4 @@
* `name` String
* `path` String - The extension's file path.
* `version` String
* `url` String - The extension's `chrome-extension://` URL.
* `url` String - The extension's `chrome-extension://` URL.
24 changes: 24 additions & 0 deletions shell/browser/api/electron_api_web_contents.cc
Expand Up @@ -654,6 +654,30 @@ void WebContents::WebContentsCreated(content::WebContents* source_contents,
tracker->frame_name = frame_name;
}

bool WebContents::IsWebContentsCreationOverridden(
content::SiteInstance* source_site_instance,
content::mojom::WindowContainerType window_container_type,
const GURL& opener_url,
const std::string& frame_name,
const GURL& target_url) {
if (Emit("-will-add-new-contents", target_url, frame_name)) {
return true;
}
return false;
}

content::WebContents* WebContents::CreateCustomWebContents(
content::RenderFrameHost* opener,
content::SiteInstance* source_site_instance,
bool is_new_browsing_instance,
const GURL& opener_url,
const std::string& frame_name,
const GURL& target_url,
const std::string& partition_id,
content::SessionStorageNamespace* session_storage_namespace) {
return nullptr;
}

void WebContents::AddNewContents(
content::WebContents* source,
std::unique_ptr<content::WebContents> new_contents,
Expand Down
15 changes: 15 additions & 0 deletions shell/browser/api/electron_api_web_contents.h
Expand Up @@ -376,6 +376,21 @@ class WebContents : public gin_helper::TrackableObject<WebContents>,
const base::string16& message,
int32_t line_no,
const base::string16& source_id) override;
bool IsWebContentsCreationOverridden(
content::SiteInstance* source_site_instance,
content::mojom::WindowContainerType window_container_type,
const GURL& opener_url,
const std::string& frame_name,
const GURL& target_url) override;
content::WebContents* CreateCustomWebContents(
content::RenderFrameHost* opener,
content::SiteInstance* source_site_instance,
bool is_new_browsing_instance,
const GURL& opener_url,
const std::string& frame_name,
const GURL& target_url,
const std::string& partition_id,
content::SessionStorageNamespace* session_storage_namespace) override;
void WebContentsCreated(content::WebContents* source_contents,
int opener_render_process_id,
int opener_render_frame_id,
Expand Down
22 changes: 22 additions & 0 deletions spec-main/api-web-contents-spec.ts
Expand Up @@ -1828,4 +1828,26 @@ describe('webContents module', () => {
expect(body).to.equal('401');
});
});

it('emits a cancelable event before creating a child webcontents', async () => {
const w = new BrowserWindow({
show: false,
webPreferences: {
sandbox: true
}
});
w.webContents.on('-will-add-new-contents' as any, (event: any, url: any) => {
expect(url).to.equal('about:blank');
event.preventDefault();
});
let wasCalled = false;
w.webContents.on('new-window' as any, () => {
wasCalled = true;
});
await w.loadURL('about:blank');
await w.webContents.executeJavaScript(`window.open('about:blank')`);
await new Promise((resolve) => { process.nextTick(resolve); });
expect(wasCalled).to.equal(false);
await closeAllWindows();
});
});

0 comments on commit a6ff42c

Please sign in to comment.