| Index: chrome/browser/ui/webui/constrained_web_dialog_delegate_base.cc
|
| diff --git a/chrome/browser/ui/webui/constrained_web_dialog_delegate_base.cc b/chrome/browser/ui/webui/constrained_web_dialog_delegate_base.cc
|
| index fc5275f224f37bb50e7f8be00abf2afa5c3ac54d..b5d1e023a124a3c027dfb13ebbf21136e43e86c0 100644
|
| --- a/chrome/browser/ui/webui/constrained_web_dialog_delegate_base.cc
|
| +++ b/chrome/browser/ui/webui/constrained_web_dialog_delegate_base.cc
|
| @@ -29,12 +29,13 @@ ConstrainedWebDialogDelegateBase::ConstrainedWebDialogDelegateBase(
|
| : WebDialogWebContentsDelegate(browser_context,
|
| new ChromeWebContentsHandler),
|
| web_dialog_delegate_(delegate),
|
| - closed_via_webui_(false),
|
| - release_contents_on_close_(false) {
|
| + closed_via_webui_(false) {
|
| CHECK(delegate);
|
| - web_contents_.reset(
|
| - WebContents::Create(WebContents::CreateParams(browser_context)));
|
| - zoom::ZoomController::CreateForWebContents(web_contents_.get());
|
| + web_contents_ =
|
| + WebContents::Create(WebContents::CreateParams(browser_context));
|
| + web_contents_holder_.reset(web_contents_);
|
| + WebContentsObserver::Observe(web_contents_);
|
| + zoom::ZoomController::CreateForWebContents(web_contents_);
|
| if (tab_delegate) {
|
| override_tab_delegate_.reset(tab_delegate);
|
| web_contents_->SetDelegate(tab_delegate);
|
| @@ -44,12 +45,12 @@ ConstrainedWebDialogDelegateBase::ConstrainedWebDialogDelegateBase(
|
| content::RendererPreferences* prefs =
|
| web_contents_->GetMutableRendererPrefs();
|
| renderer_preferences_util::UpdateFromSystemSettings(
|
| - prefs, Profile::FromBrowserContext(browser_context), web_contents_.get());
|
| + prefs, Profile::FromBrowserContext(browser_context), web_contents_);
|
|
|
| web_contents_->GetRenderViewHost()->SyncRendererPrefs();
|
|
|
| // Set |this| as a delegate so the ConstrainedWebDialogUI can retrieve it.
|
| - ConstrainedWebDialogUI::SetConstrainedDelegate(web_contents_.get(), this);
|
| + ConstrainedWebDialogUI::SetConstrainedDelegate(web_contents_, this);
|
|
|
| web_contents_->GetController().LoadURL(delegate->GetDialogContentURL(),
|
| content::Referrer(),
|
| @@ -58,8 +59,12 @@ ConstrainedWebDialogDelegateBase::ConstrainedWebDialogDelegateBase(
|
| }
|
|
|
| ConstrainedWebDialogDelegateBase::~ConstrainedWebDialogDelegateBase() {
|
| - if (release_contents_on_close_)
|
| - ignore_result(web_contents_.release());
|
| + if (web_contents_) {
|
| + // Remove reference to |this| in the WebContent since it will becomes
|
| + // invalid and the lifetime of the WebContent may exceed the one of this
|
| + // object.
|
| + ConstrainedWebDialogUI::ClearConstrainedDelegate(web_contents_);
|
| + }
|
| }
|
|
|
| const WebDialogDelegate*
|
| @@ -74,15 +79,16 @@ WebDialogDelegate*
|
|
|
| void ConstrainedWebDialogDelegateBase::OnDialogCloseFromWebUI() {
|
| closed_via_webui_ = true;
|
| - CloseContents(web_contents_.get());
|
| + CloseContents(web_contents_);
|
| }
|
|
|
| bool ConstrainedWebDialogDelegateBase::closed_via_webui() const {
|
| return closed_via_webui_;
|
| }
|
|
|
| -void ConstrainedWebDialogDelegateBase::ReleaseWebContentsOnDialogClose() {
|
| - release_contents_on_close_ = true;
|
| +std::unique_ptr<content::WebContents>
|
| +ConstrainedWebDialogDelegateBase::ReleaseWebContents() {
|
| + return std::move(web_contents_holder_);
|
| }
|
|
|
| gfx::NativeWindow ConstrainedWebDialogDelegateBase::GetNativeDialog() {
|
| @@ -91,7 +97,7 @@ gfx::NativeWindow ConstrainedWebDialogDelegateBase::GetNativeDialog() {
|
| }
|
|
|
| WebContents* ConstrainedWebDialogDelegateBase::GetWebContents() {
|
| - return web_contents_.get();
|
| + return web_contents_;
|
| }
|
|
|
| void ConstrainedWebDialogDelegateBase::HandleKeyboardEvent(
|
| @@ -114,6 +120,10 @@ gfx::Size ConstrainedWebDialogDelegateBase::GetPreferredSize() const {
|
| return gfx::Size();
|
| }
|
|
|
| +void ConstrainedWebDialogDelegateBase::WebContentsDestroyed() {
|
| + web_contents_ = nullptr;
|
| +}
|
| +
|
| void ConstrainedWebDialogDelegateBase::ResizeToGivenSize(
|
| const gfx::Size size) {
|
| NOTREACHED();
|
|
|