1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/certificate_manager_dialog_ui.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/ref_counted_memory.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/values.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/system/input_device_settings.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/webui/options/certificate_manager_handler.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/webui/options/chromeos/core_chromeos_options_handler.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/url_constants.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chromeos/chromeos_constants.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/url_data_source.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/web_contents.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/web_ui.h" 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/web_ui_message_handler.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "grit/browser_resources.h" 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/webui/jstemplate_builder.h" 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/webui/web_ui_util.h" 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using content::WebContents; 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using content::WebUIMessageHandler; 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kLocalizedStringsFile[] = "strings.js"; 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class CertificateManagerDialogHTMLSource : public content::URLDataSource { 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) explicit CertificateManagerDialogHTMLSource( 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::DictionaryValue* localized_strings); 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // content::URLDataSource implementation. 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual std::string GetSource() const OVERRIDE; 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void StartDataRequest( 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& path, 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int render_process_id, 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int render_frame_id, 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const content::URLDataSource::GotDataCallback& callback) OVERRIDE; 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual std::string GetMimeType(const std::string&) const OVERRIDE { 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return "text/html"; 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool ShouldAddContentSecurityPolicy() const OVERRIDE { 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual ~CertificateManagerDialogHTMLSource() {} 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<base::DictionaryValue> localized_strings_; 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CertificateManagerDialogHTMLSource); 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)CertificateManagerDialogHTMLSource::CertificateManagerDialogHTMLSource( 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::DictionaryValue* localized_strings) 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : localized_strings_(localized_strings) { 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)std::string CertificateManagerDialogHTMLSource::GetSource() const { 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return chrome::kChromeUICertificateManagerHost; 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void CertificateManagerDialogHTMLSource::StartDataRequest( 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& path, 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int render_process_id, 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int render_frame_id, 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const content::URLDataSource::GotDataCallback& callback) { 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> response_bytes; 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) webui::SetFontAndTextDirection(localized_strings_.get()); 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (path == kLocalizedStringsFile) { 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Return dynamically-generated strings from memory. 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) webui::UseVersion2 version; 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string strings_js; 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) webui::AppendJsonJS(localized_strings_.get(), &strings_js); 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) response_bytes = base::RefCountedString::TakeString(&strings_js); 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Return (and cache) the main options html page as the default. 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) response_bytes = ui::ResourceBundle::GetSharedInstance(). 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LoadDataResourceBytes(IDR_CERT_MANAGER_DIALOG_HTML); 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callback.Run(response_bytes.get()); 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace chromeos { 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)CertificateManagerDialogUI::CertificateManagerDialogUI(content::WebUI* web_ui) 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : ui::WebDialogUI(web_ui), 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) initialized_handlers_(false), 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cert_handler_(new ::options::CertificateManagerHandler(true)), 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) core_handler_(new options::CoreChromeOSOptionsHandler()) { 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // |localized_strings| will be owned by CertificateManagerDialogHTMLSource. 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::DictionaryValue* localized_strings = new base::DictionaryValue(); 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) web_ui->AddMessageHandler(core_handler_); 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) core_handler_->set_handlers_host(this); 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) core_handler_->GetLocalizedValues(localized_strings); 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) web_ui->AddMessageHandler(cert_handler_); 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cert_handler_->GetLocalizedValues(localized_strings); 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool keyboard_driven_oobe = 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) system::InputDeviceSettings::Get()->ForceKeyboardDrivenUINavigation(); 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) localized_strings->SetString("highlightStrength", 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) keyboard_driven_oobe ? "strong" : "normal"); 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CertificateManagerDialogHTMLSource* source = 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new CertificateManagerDialogHTMLSource(localized_strings); 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui); 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::URLDataSource::Add(profile, source); 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)CertificateManagerDialogUI::~CertificateManagerDialogUI() { 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Uninitialize all registered handlers. The base class owns them and it will 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // eventually delete them. 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) core_handler_->Uninitialize(); 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cert_handler_->Uninitialize(); 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void CertificateManagerDialogUI::InitializeHandlers() { 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // A new web page DOM has been brought up in an existing renderer, causing 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // this method to be called twice. In that case, don't initialize the handlers 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // again. Compare with options_ui.cc. 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!initialized_handlers_) { 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) core_handler_->InitializeHandler(); 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cert_handler_->InitializeHandler(); 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) initialized_handlers_ = true; 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) core_handler_->InitializePage(); 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cert_handler_->InitializePage(); 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace chromeos 144