172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Use of this source code is governed by a BSD-style license that can be
3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// found in the LICENSE file.
4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/constrained_html_ui.h"
6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/lazy_instance.h"
8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/values.h"
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/html_dialog_ui.h"
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/bindings_policy.h"
13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenstatic base::LazyInstance<PropertyAccessor<ConstrainedHtmlUIDelegate*> >
1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    g_constrained_html_ui_property_accessor(base::LINKER_INITIALIZED);
1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
17731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickConstrainedHtmlUI::ConstrainedHtmlUI(TabContents* contents)
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : WebUI(contents) {
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
21731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickConstrainedHtmlUI::~ConstrainedHtmlUI() {
22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid ConstrainedHtmlUI::RenderViewCreated(
25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    RenderViewHost* render_view_host) {
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ConstrainedHtmlUIDelegate* delegate = GetConstrainedDelegate();
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!delegate)
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  HtmlDialogUIDelegate* dialog_delegate = delegate->GetHtmlDialogUIDelegate();
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<WebUIMessageHandler*> handlers;
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  dialog_delegate->GetWebUIMessageHandlers(&handlers);
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  render_view_host->SetWebUIProperty("dialogArguments",
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                     dialog_delegate->GetDialogArgs());
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (std::vector<WebUIMessageHandler*>::iterator it = handlers.begin();
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick       it != handlers.end(); ++it) {
37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    (*it)->Attach(this);
38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    AddMessageHandler(*it);
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Add a "DialogClose" callback which matches HTMLDialogUI behavior.
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RegisterMessageCallback("DialogClose",
43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NewCallback(this, &ConstrainedHtmlUI::OnDialogClose));
44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid ConstrainedHtmlUI::OnDialogClose(const ListValue* args) {
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ConstrainedHtmlUIDelegate* delegate = GetConstrainedDelegate();
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!delegate)
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string json_retval;
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!args->GetString(0, &json_retval))
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NOTREACHED() << "Could not read JSON argument";
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  delegate->GetHtmlDialogUIDelegate()->OnDialogClosed(json_retval);
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delegate->OnDialogClose();
56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
58731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickConstrainedHtmlUIDelegate*
59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ConstrainedHtmlUI::GetConstrainedDelegate() {
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ConstrainedHtmlUIDelegate** property =
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      GetPropertyAccessor().GetProperty(tab_contents()->property_bag());
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return property ? *property : NULL;
63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
66731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickPropertyAccessor<ConstrainedHtmlUIDelegate*>&
67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ConstrainedHtmlUI::GetPropertyAccessor() {
6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return g_constrained_html_ui_property_accessor.Get();
69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
70