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