1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/webui/constrained_web_dialog_delegate_base.h"
6
7#include <string>
8
9#include "chrome/browser/profiles/profile.h"
10#include "chrome/browser/renderer_preferences_util.h"
11#include "chrome/browser/ui/webui/chrome_web_contents_handler.h"
12#include "content/public/browser/render_view_host.h"
13#include "content/public/browser/web_contents.h"
14#include "ipc/ipc_message.h"
15#include "ui/web_dialogs/web_dialog_delegate.h"
16#include "ui/web_dialogs/web_dialog_ui.h"
17
18using content::NativeWebKeyboardEvent;
19using content::WebContents;
20using ui::WebDialogDelegate;
21using ui::WebDialogWebContentsDelegate;
22
23ConstrainedWebDialogDelegateBase::ConstrainedWebDialogDelegateBase(
24    content::BrowserContext* browser_context,
25    WebDialogDelegate* delegate,
26    WebDialogWebContentsDelegate* tab_delegate)
27    : WebDialogWebContentsDelegate(browser_context,
28                                   new ChromeWebContentsHandler),
29      web_dialog_delegate_(delegate),
30      closed_via_webui_(false),
31      release_contents_on_close_(false) {
32  CHECK(delegate);
33  web_contents_.reset(
34      WebContents::Create(WebContents::CreateParams(browser_context)));
35  if (tab_delegate) {
36    override_tab_delegate_.reset(tab_delegate);
37    web_contents_->SetDelegate(tab_delegate);
38  } else {
39    web_contents_->SetDelegate(this);
40  }
41  renderer_preferences_util::UpdateFromSystemSettings(
42      web_contents_->GetMutableRendererPrefs(),
43      Profile::FromBrowserContext(browser_context));
44  web_contents_->GetRenderViewHost()->SyncRendererPrefs();
45
46  // Set |this| as a delegate so the ConstrainedWebDialogUI can retrieve it.
47  ConstrainedWebDialogUI::SetConstrainedDelegate(web_contents_.get(), this);
48
49  web_contents_->GetController().LoadURL(delegate->GetDialogContentURL(),
50                                         content::Referrer(),
51                                         ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
52                                         std::string());
53}
54
55ConstrainedWebDialogDelegateBase::~ConstrainedWebDialogDelegateBase() {
56  if (release_contents_on_close_)
57    ignore_result(web_contents_.release());
58}
59
60const WebDialogDelegate*
61    ConstrainedWebDialogDelegateBase::GetWebDialogDelegate() const {
62  return web_dialog_delegate_.get();
63}
64
65WebDialogDelegate*
66    ConstrainedWebDialogDelegateBase::GetWebDialogDelegate() {
67  return web_dialog_delegate_.get();
68}
69
70void ConstrainedWebDialogDelegateBase::OnDialogCloseFromWebUI() {
71  closed_via_webui_ = true;
72  CloseContents(web_contents_.get());
73}
74
75bool ConstrainedWebDialogDelegateBase::closed_via_webui() const {
76  return closed_via_webui_;
77}
78
79void ConstrainedWebDialogDelegateBase::ReleaseWebContentsOnDialogClose() {
80  release_contents_on_close_ = true;
81}
82
83web_modal::NativeWebContentsModalDialog
84    ConstrainedWebDialogDelegateBase::GetNativeDialog() {
85  NOTREACHED();
86  return NULL;
87}
88
89WebContents* ConstrainedWebDialogDelegateBase::GetWebContents() {
90  return web_contents_.get();
91}
92
93void ConstrainedWebDialogDelegateBase::HandleKeyboardEvent(
94    content::WebContents* source,
95    const NativeWebKeyboardEvent& event) {
96}
97