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