Commit 1c587bc5 authored by Pavel Feldman's avatar Pavel Feldman Committed by Commit Bot

DevTools: Page freezes when alert / confirm / prompt method is called from options dialog.

Bug: 825771
Change-Id: I98e174f29538fadd104c61706766b28ab0b9db7d
Reviewed-on: https://chromium-review.googlesource.com/994377Reviewed-by: default avatarDmitry Gozman <dgozman@chromium.org>
Commit-Queue: Pavel Feldman <pfeldman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#548200}
parent 26de0ebc
......@@ -230,6 +230,7 @@ void PageHandler::DidRunJavaScriptDialog(const GURL& url,
const base::string16& message,
const base::string16& default_prompt,
JavaScriptDialogType dialog_type,
bool has_non_devtools_handlers,
JavaScriptDialogCallback callback) {
if (!enabled_)
return;
......@@ -241,10 +242,12 @@ void PageHandler::DidRunJavaScriptDialog(const GURL& url,
if (dialog_type == JAVASCRIPT_DIALOG_TYPE_PROMPT)
type = Page::DialogTypeEnum::Prompt;
frontend_->JavascriptDialogOpening(url.spec(), base::UTF16ToUTF8(message),
type, base::UTF16ToUTF8(default_prompt));
type, has_non_devtools_handlers,
base::UTF16ToUTF8(default_prompt));
}
void PageHandler::DidRunBeforeUnloadConfirm(const GURL& url,
bool has_non_devtools_handlers,
JavaScriptDialogCallback callback) {
if (!enabled_)
return;
......@@ -252,7 +255,7 @@ void PageHandler::DidRunBeforeUnloadConfirm(const GURL& url,
pending_dialog_ = std::move(callback);
frontend_->JavascriptDialogOpening(url.spec(), std::string(),
Page::DialogTypeEnum::Beforeunload,
std::string());
has_non_devtools_handlers, std::string());
}
void PageHandler::DidCloseJavaScriptDialog(bool success,
......
......@@ -78,8 +78,10 @@ class PageHandler : public DevToolsDomainHandler,
const base::string16& message,
const base::string16& default_prompt,
JavaScriptDialogType dialog_type,
bool has_non_devtools_handlers,
JavaScriptDialogCallback callback);
void DidRunBeforeUnloadConfirm(const GURL& url,
bool has_non_devtools_handlers,
JavaScriptDialogCallback callback);
void DidCloseJavaScriptDialog(bool success, const base::string16& user_input);
void NavigationReset(NavigationRequest* navigation_request);
......
......@@ -4777,7 +4777,8 @@ void WebContentsImpl::RunJavaScriptDialog(RenderFrameHost* render_frame_host,
// want the hidden page's dialogs to interfere with the interstitial.
bool should_suppress = ShowingInterstitialPage() ||
(delegate_ && delegate_->ShouldSuppressDialogs(this));
bool has_handlers = page_handlers.size() || (delegate_ && dialog_manager_);
bool has_non_devtools_handlers = delegate_ && dialog_manager_;
bool has_handlers = page_handlers.size() || has_non_devtools_handlers;
bool suppress_this_message = should_suppress || !has_handlers;
if (suppress_this_message) {
......@@ -4793,7 +4794,7 @@ void WebContentsImpl::RunJavaScriptDialog(RenderFrameHost* render_frame_host,
for (auto* handler : page_handlers) {
handler->DidRunJavaScriptDialog(
render_frame_host->GetLastCommittedURL(), message, default_prompt,
dialog_type,
dialog_type, has_non_devtools_handlers,
base::BindOnce(&CloseDialogCallbackWrapper::Run, wrapper, false));
}
......@@ -4848,7 +4849,8 @@ void WebContentsImpl::RunBeforeUnloadConfirm(
bool should_suppress = ShowingInterstitialPage() || !rfhi->is_active() ||
(delegate_ && delegate_->ShouldSuppressDialogs(this));
bool has_handlers = page_handlers.size() || (delegate_ && dialog_manager_);
bool has_non_devtools_handlers = delegate_ && dialog_manager_;
bool has_handlers = page_handlers.size() || has_non_devtools_handlers;
if (should_suppress || !has_handlers) {
std::move(callback).Run(false, true, base::string16());
return;
......@@ -4862,7 +4864,7 @@ void WebContentsImpl::RunBeforeUnloadConfirm(
GURL frame_url = rfhi->GetLastCommittedURL();
for (auto* handler : page_handlers) {
handler->DidRunBeforeUnloadConfirm(
frame_url,
frame_url, has_non_devtools_handlers,
base::BindOnce(&CloseDialogCallbackWrapper::Run, wrapper, false));
}
......
......@@ -10794,6 +10794,11 @@
"description": "Dialog type.",
"$ref": "DialogType"
},
{
"name": "hasBrowserHandler",
"description": "True iff browser is capable showing or acting on the given dialog. When browser has no\ndialog handler for given target, calling alert while Page domain is engaged will stall\nthe page execution. Execution can be resumed via calling Page.handleJavaScriptDialog.",
"type": "boolean"
},
{
"name": "defaultPrompt",
"description": "Default dialog prompt.",
......
......@@ -4955,6 +4955,10 @@ domain Page
string message
# Dialog type.
DialogType type
# True iff browser is capable showing or acting on the given dialog. When browser has no
# dialog handler for given target, calling alert while Page domain is engaged will stall
# the page execution. Execution can be resumed via calling Page.handleJavaScriptDialog.
boolean hasBrowserHandler
# Default dialog prompt.
optional string defaultPrompt
......
......@@ -877,9 +877,12 @@ SDK.PageDispatcher = class {
* @param {string} url
* @param {string} message
* @param {string} dialogType
* @param {boolean} hasBrowserHandler
* @param {string=} prompt
*/
javascriptDialogOpening(url, message, dialogType, prompt) {
javascriptDialogOpening(url, message, dialogType, hasBrowserHandler, prompt) {
if (!hasBrowserHandler)
this._resourceTreeModel._agent.handleJavaScriptDialog(false);
}
/**
......
......@@ -173,9 +173,10 @@ SDK.ScreenCaptureModel = class extends SDK.SDKModel {
* @param {string} url
* @param {string} message
* @param {string} dialogType
* @param {boolean} hasBrowserHandler
* @param {string=} prompt
*/
javascriptDialogOpening(url, message, dialogType, prompt) {
javascriptDialogOpening(url, message, dialogType, hasBrowserHandler, prompt) {
}
/**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment