Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / webui / constrained_web_dialog_ui.cc
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_ui.h"
6
7 #include <string>
8 #include <vector>
9
10 #include "base/bind.h"
11 #include "base/bind_helpers.h"
12 #include "base/lazy_instance.h"
13 #include "base/values.h"
14 #include "content/public/browser/notification_service.h"
15 #include "content/public/browser/render_view_host.h"
16 #include "content/public/browser/web_contents.h"
17 #include "content/public/browser/web_ui.h"
18 #include "ui/web_dialogs/web_dialog_delegate.h"
19 #include "ui/web_dialogs/web_dialog_ui.h"
20
21 #if defined(ENABLE_EXTENSIONS)
22 #include "chrome/browser/extensions/tab_helper.h"
23 #endif
24
25 using content::RenderViewHost;
26 using content::WebContents;
27 using content::WebUIMessageHandler;
28
29 namespace {
30
31 const char kConstrainedWebDialogDelegateUserDataKey[] =
32     "ConstrainedWebDialogDelegateUserData";
33
34 class ConstrainedWebDialogDelegateUserData
35     : public base::SupportsUserData::Data {
36  public:
37   explicit ConstrainedWebDialogDelegateUserData(
38       ConstrainedWebDialogDelegate* delegate) : delegate_(delegate) {}
39   virtual ~ConstrainedWebDialogDelegateUserData() {}
40
41   ConstrainedWebDialogDelegate* delegate() { return delegate_; }
42
43  private:
44   ConstrainedWebDialogDelegate* delegate_;  // unowned
45
46   DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateUserData);
47 };
48
49 }  // namespace
50
51 ConstrainedWebDialogUI::ConstrainedWebDialogUI(content::WebUI* web_ui)
52     : WebUIController(web_ui) {
53 #if defined(ENABLE_EXTENSIONS)
54   extensions::TabHelper::CreateForWebContents(web_ui->GetWebContents());
55 #endif
56 }
57
58 ConstrainedWebDialogUI::~ConstrainedWebDialogUI() {
59 }
60
61 void ConstrainedWebDialogUI::RenderViewCreated(
62     RenderViewHost* render_view_host) {
63   ConstrainedWebDialogDelegate* delegate = GetConstrainedDelegate();
64   if (!delegate)
65     return;
66
67   ui::WebDialogDelegate* dialog_delegate = delegate->GetWebDialogDelegate();
68   std::vector<WebUIMessageHandler*> handlers;
69   dialog_delegate->GetWebUIMessageHandlers(&handlers);
70   render_view_host->SetWebUIProperty("dialogArguments",
71                                      dialog_delegate->GetDialogArgs());
72   for (std::vector<WebUIMessageHandler*>::iterator it = handlers.begin();
73        it != handlers.end(); ++it) {
74     web_ui()->AddMessageHandler(*it);
75   }
76
77   // Add a "dialogClose" callback which matches WebDialogUI behavior.
78   web_ui()->RegisterMessageCallback("dialogClose",
79       base::Bind(&ConstrainedWebDialogUI::OnDialogCloseMessage,
80                  base::Unretained(this)));
81
82   dialog_delegate->OnDialogShown(web_ui(), render_view_host);
83 }
84
85 void ConstrainedWebDialogUI::OnDialogCloseMessage(const base::ListValue* args) {
86   ConstrainedWebDialogDelegate* delegate = GetConstrainedDelegate();
87   if (!delegate)
88     return;
89
90   std::string json_retval;
91   if (!args->empty() && !args->GetString(0, &json_retval))
92     NOTREACHED() << "Could not read JSON argument";
93   delegate->GetWebDialogDelegate()->OnDialogClosed(json_retval);
94   delegate->OnDialogCloseFromWebUI();
95 }
96
97 // static
98 void ConstrainedWebDialogUI::SetConstrainedDelegate(
99     content::WebContents* web_contents,
100     ConstrainedWebDialogDelegate* delegate) {
101   web_contents->SetUserData(&kConstrainedWebDialogDelegateUserDataKey,
102                             new ConstrainedWebDialogDelegateUserData(delegate));
103 }
104
105 ConstrainedWebDialogDelegate* ConstrainedWebDialogUI::GetConstrainedDelegate() {
106   ConstrainedWebDialogDelegateUserData* user_data =
107       static_cast<ConstrainedWebDialogDelegateUserData*>(
108           web_ui()->GetWebContents()->
109               GetUserData(&kConstrainedWebDialogDelegateUserDataKey));
110
111   return user_data ? user_data->delegate() : NULL;
112 }