Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5673)

Unified Diff: chrome/browser/webui/crashes_ui.cc

Issue 6545001: Implement chrome://crashes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addresses review comments Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/webui/crashes_ui.cc
diff --git a/chrome/browser/webui/crashes_ui.cc b/chrome/browser/webui/crashes_ui.cc
new file mode 100644
index 0000000000000000000000000000000000000000..064b8d4503557ca40b363219c73baa69867eba77
--- /dev/null
+++ b/chrome/browser/webui/crashes_ui.cc
@@ -0,0 +1,214 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/webui/crashes_ui.h"
+
+#include "base/i18n/time_formatting.h"
+#include "base/ref_counted_memory.h"
+#include "base/utf_string_conversions.h"
+#include "base/values.h"
+#include "chrome/browser/crash_upload_list.h"
+#include "chrome/browser/dom_ui/chrome_url_data_manager.h"
+#include "chrome/browser/prefs/pref_service.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/common/jstemplate_builder.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/common/url_constants.h"
+#include "grit/browser_resources.h"
+#include "grit/chromium_strings.h"
+#include "grit/generated_resources.h"
+#include "grit/theme_resources.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/resource_bundle.h"
+
+namespace {
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// CrashesUIHTMLSource
+//
+///////////////////////////////////////////////////////////////////////////////
+
+class CrashesUIHTMLSource : public ChromeURLDataManager::DataSource {
+ public:
+ CrashesUIHTMLSource()
+ : DataSource(chrome::kChromeUICrashesHost, MessageLoop::current()) {}
+
+ // Called when the network layer has requested a resource underneath
+ // the path we registered.
+ virtual void StartDataRequest(const std::string& path,
+ bool is_off_the_record,
+ int request_id);
+ virtual std::string GetMimeType(const std::string&) const {
+ return "text/html";
+ }
+
+ private:
+ ~CrashesUIHTMLSource() {}
+
+ DISALLOW_COPY_AND_ASSIGN(CrashesUIHTMLSource);
+};
+
+void CrashesUIHTMLSource::StartDataRequest(const std::string& path,
+ bool is_off_the_record,
+ int request_id) {
+ DictionaryValue localized_strings;
+ localized_strings.SetString("crashesTitle",
+ l10n_util::GetStringUTF16(IDS_CRASHES_TITLE));
+ localized_strings.SetString("crashCountFormat",
+ l10n_util::GetStringUTF16(IDS_CRASHES_CRASH_COUNT_BANNER_FORMAT));
+ localized_strings.SetString("crashHeaderFormat",
+ l10n_util::GetStringUTF16(IDS_CRASHES_CRASH_HEADER_FORMAT));
+ localized_strings.SetString("crashTimeFormat",
+ l10n_util::GetStringUTF16(IDS_CRASHES_CRASH_TIME_FORMAT));
+ localized_strings.SetString("bugLinkText",
+ l10n_util::GetStringUTF16(IDS_CRASHES_BUG_LINK_LABEL));
+ localized_strings.SetString("noCrashesMessage",
+ l10n_util::GetStringUTF16(IDS_CRASHES_NO_CRASHES_MESSAGE));
+ localized_strings.SetString("disabledHeader",
+ l10n_util::GetStringUTF16(IDS_CRASHES_DISABLED_HEADER));
+ localized_strings.SetString("disabledMessage",
+ l10n_util::GetStringUTF16(IDS_CRASHES_DISABLED_MESSAGE));
+
+ ChromeURLDataManager::DataSource::SetFontAndTextDirection(&localized_strings);
+
+ static const base::StringPiece crashes_html(
+ ResourceBundle::GetSharedInstance().GetRawDataResource(IDR_CRASHES_HTML));
+ std::string full_html =
+ jstemplate_builder::GetI18nTemplateHtml(crashes_html, &localized_strings);
+ jstemplate_builder::AppendJsTemplateSourceHtml(&full_html);
+
+ scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes);
+ html_bytes->data.resize(full_html.size());
+ std::copy(full_html.begin(), full_html.end(), html_bytes->data.begin());
+
+ SendResponse(request_id, html_bytes);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// CrashesDOMHandler
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// The handler for Javascript messages for the chrome://crashes/ page.
+class CrashesDOMHandler : public WebUIMessageHandler,
+ public CrashUploadList::Delegate {
+ public:
+ explicit CrashesDOMHandler();
+ virtual ~CrashesDOMHandler();
+
+ // WebUIMessageHandler implementation.
+ virtual WebUIMessageHandler* Attach(WebUI* web_ui);
+ virtual void RegisterMessages();
+
+ // CrashUploadList::Delegate implemenation.
+ virtual void OnCrashListAvailable();
+
+ private:
+ // Asynchronously fetches the list of crashes. Called from JS.
+ void HandleRequestCrashes(const ListValue* args);
+
+ // Sends the recent crashes list JS.
+ void UpdateUI();
+
+ // Returns whether or not crash reporting is enabled.
+ bool CrashReportingEnabled() const;
+
+ scoped_refptr<CrashUploadList> upload_list_;
+ bool list_available_;
+ bool js_request_pending_;
+
+ DISALLOW_COPY_AND_ASSIGN(CrashesDOMHandler);
+};
+
+CrashesDOMHandler::CrashesDOMHandler()
+ : list_available_(false), js_request_pending_(false) {
+ upload_list_ = new CrashUploadList(this);
+}
+
+CrashesDOMHandler::~CrashesDOMHandler() {
+ upload_list_->ClearDelegate();
+}
+
+WebUIMessageHandler* CrashesDOMHandler::Attach(WebUI* web_ui) {
+
arv (Not doing code reviews) 2011/02/20 23:44:00 Remove empty lines in here?
+ upload_list_->LoadCrashListAsynchronously();
+
+ return WebUIMessageHandler::Attach(web_ui);
+}
+
+void CrashesDOMHandler::RegisterMessages() {
+ web_ui_->RegisterMessageCallback("requestCrashList",
+ NewCallback(this, &CrashesDOMHandler::HandleRequestCrashes));
+}
+
+void CrashesDOMHandler::HandleRequestCrashes(const ListValue* args) {
+ if (!CrashReportingEnabled() || list_available_)
+ UpdateUI();
+ else
+ js_request_pending_ = true;
+}
+
+void CrashesDOMHandler::OnCrashListAvailable() {
+ list_available_ = true;
+ if (js_request_pending_)
+ UpdateUI();
+}
+
+void CrashesDOMHandler::UpdateUI() {
+ bool crash_reporting_enabled = CrashReportingEnabled();
+ ListValue crash_list;
+
+ if (crash_reporting_enabled) {
+ std::vector<CrashUploadList::CrashInfo> crashes;
+ upload_list_->GetUploadedCrashes(50, &crashes);
+
+ for (std::vector<CrashUploadList::CrashInfo>::iterator i = crashes.begin();
+ i != crashes.end(); ++i) {
+ DictionaryValue* crash = new DictionaryValue();
+ crash->SetString("id", i->crash_id);
+ crash->SetString("time",
+ base::TimeFormatFriendlyDateAndTime(i->crash_time));
+ crash_list.Append(crash);
+ }
+ }
+
+ FundamentalValue enabled(crash_reporting_enabled);
+
+ web_ui_->CallJavascriptFunction(L"updateCrashList", enabled, crash_list);
+}
+
+bool CrashesDOMHandler::CrashReportingEnabled() const {
+#if defined(GOOGLE_CHROME_BUILD)
+ PrefService* prefs = web_ui_->GetProfile()->GetPrefs();
+ return prefs->GetBoolean(prefs::kMetricsReportingEnabled);
+#else
+ return false;
+#endif
+}
+
+} // namespace
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// CrashesUI
+//
+///////////////////////////////////////////////////////////////////////////////
+
+CrashesUI::CrashesUI(TabContents* contents) : WebUI(contents) {
+ AddMessageHandler((new CrashesDOMHandler())->Attach(this));
+
+ CrashesUIHTMLSource* html_source = new CrashesUIHTMLSource();
+
+ // Set up the chrome://crashes/ source.
+ contents->profile()->GetChromeURLDataManager()->AddDataSource(html_source);
+}
+
+// static
+RefCountedMemory* CrashesUI::GetFaviconResourceBytes() {
+ return ResourceBundle::GetSharedInstance().
+ LoadDataResourceBytes(IDR_SAD_FAVICON);
+}

Powered by Google App Engine
This is Rietveld 408576698