Commit 77a581d3 authored by zmo@chromium.org's avatar zmo@chromium.org

Display crash report IDs in about:gpu

BUG=113089
TEST=about:gpu page
Review URL: https://chromiumcodereview.appspot.com/9706037

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@126925 0039d316-1c4b-4281-b951-d872f2087c98
parent 57fc7ab0
...@@ -27,6 +27,7 @@ cr.define('gpu', function() { ...@@ -27,6 +27,7 @@ cr.define('gpu', function() {
chrome.send('browserBridgeInitialized'); chrome.send('browserBridgeInitialized');
this.beginRequestClientInfo_(); this.beginRequestClientInfo_();
this.beginRequestLogMessages_(); this.beginRequestLogMessages_();
this.beginRequestCrashList_();
} }
} }
...@@ -137,6 +138,28 @@ cr.define('gpu', function() { ...@@ -137,6 +138,28 @@ cr.define('gpu', function() {
*/ */
get logMessages() { get logMessages() {
return this.logMessages_; return this.logMessages_;
},
/**
* This function checks for previous crash list.
* If it's not available yet, a refresh is triggered.
*/
beginRequestCrashList_: function() {
this.callAsync('requestCrashList', undefined, (function(data) {
if (data === undefined) { // try again in 250 ms
window.setTimeout(this.beginRequestCrashList_.bind(this), 250);
} else {
this.crashList_ = data;
cr.dispatchSimpleEvent(this, 'crashListChange');
}
}).bind(this));
},
/**
* Returns an array of log messages issued by the GPU process, if any.
*/
get crashList() {
return this.crashList_;
} }
}; };
......
...@@ -36,6 +36,15 @@ found in the LICENSE file. ...@@ -36,6 +36,15 @@ found in the LICENSE file.
<div id="diagnostics-table">None</div> <div id="diagnostics-table">None</div>
</div> </div>
<div id="crash-list" jsdisplay="values.length">
<h3>Crash List</h3>
<ul>
<li jsselect="values">
<span jscontent="id"></span>: <span jscontent="time"></span>
</li>
</ul>
</div>
<div id="log-messages" jsdisplay="values.length"> <div id="log-messages" jsdisplay="values.length">
<h3>Log Messages</h3> <h3>Log Messages</h3>
<ul> <ul>
......
...@@ -27,6 +27,8 @@ cr.define('gpu', function() { ...@@ -27,6 +27,8 @@ cr.define('gpu', function() {
this.refresh.bind(this)); this.refresh.bind(this));
browserBridge.addEventListener('clientInfoChange', browserBridge.addEventListener('clientInfoChange',
this.refresh.bind(this)); this.refresh.bind(this));
browserBridge.addEventListener('crashListChange',
this.refresh.bind(this));
this.refresh(); this.refresh();
}, },
...@@ -184,6 +186,10 @@ cr.define('gpu', function() { ...@@ -184,6 +186,10 @@ cr.define('gpu', function() {
problemsDiv.hidden = true; problemsDiv.hidden = true;
} }
// Crash list
jstProcess(new JsEvalContext({values: browserBridge.crashList}),
document.getElementById('crash-list'));
// Log messages // Log messages
jstProcess(new JsEvalContext({values: browserBridge.logMessages}), jstProcess(new JsEvalContext({values: browserBridge.logMessages}),
document.getElementById('log-messages')); document.getElementById('log-messages'));
......
...@@ -9,14 +9,17 @@ ...@@ -9,14 +9,17 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/bind_helpers.h" #include "base/bind_helpers.h"
#include "base/command_line.h" #include "base/command_line.h"
#include "base/i18n/time_formatting.h"
#include "base/string_number_conversions.h" #include "base/string_number_conversions.h"
#include "base/stringprintf.h" #include "base/stringprintf.h"
#include "base/sys_info.h" #include "base/sys_info.h"
#include "base/values.h" #include "base/values.h"
#include "chrome/browser/crash_upload_list.h"
#include "chrome/browser/gpu_blacklist.h" #include "chrome/browser/gpu_blacklist.h"
#include "chrome/browser/gpu_util.h" #include "chrome/browser/gpu_util.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/chrome_web_ui_data_source.h" #include "chrome/browser/ui/webui/chrome_web_ui_data_source.h"
#include "chrome/browser/ui/webui/crashes_ui.h"
#include "chrome/common/chrome_version_info.h" #include "chrome/common/chrome_version_info.h"
#include "chrome/common/url_constants.h" #include "chrome/common/url_constants.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
...@@ -53,7 +56,8 @@ ChromeWebUIDataSource* CreateGpuHTMLSource() { ...@@ -53,7 +56,8 @@ ChromeWebUIDataSource* CreateGpuHTMLSource() {
class GpuMessageHandler class GpuMessageHandler
: public WebUIMessageHandler, : public WebUIMessageHandler,
public base::SupportsWeakPtr<GpuMessageHandler>, public base::SupportsWeakPtr<GpuMessageHandler>,
public content::GpuDataManagerObserver { public content::GpuDataManagerObserver,
public CrashUploadList::Delegate {
public: public:
GpuMessageHandler(); GpuMessageHandler();
virtual ~GpuMessageHandler(); virtual ~GpuMessageHandler();
...@@ -64,6 +68,9 @@ class GpuMessageHandler ...@@ -64,6 +68,9 @@ class GpuMessageHandler
// GpuDataManagerObserver implementation. // GpuDataManagerObserver implementation.
virtual void OnGpuInfoUpdate() OVERRIDE; virtual void OnGpuInfoUpdate() OVERRIDE;
// CrashUploadList::Delegate implemenation.
virtual void OnCrashListAvailable() OVERRIDE;
// Messages // Messages
void OnBrowserBridgeInitialized(const ListValue* list); void OnBrowserBridgeInitialized(const ListValue* list);
void OnCallAsync(const ListValue* list); void OnCallAsync(const ListValue* list);
...@@ -71,6 +78,7 @@ class GpuMessageHandler ...@@ -71,6 +78,7 @@ class GpuMessageHandler
// Submessages dispatched from OnCallAsync // Submessages dispatched from OnCallAsync
Value* OnRequestClientInfo(const ListValue* list); Value* OnRequestClientInfo(const ListValue* list);
Value* OnRequestLogMessages(const ListValue* list); Value* OnRequestLogMessages(const ListValue* list);
Value* OnRequestCrashList(const ListValue* list);
// Executes the javascript function |function_name| in the renderer, passing // Executes the javascript function |function_name| in the renderer, passing
// it the argument |value|. // it the argument |value|.
...@@ -78,6 +86,9 @@ class GpuMessageHandler ...@@ -78,6 +86,9 @@ class GpuMessageHandler
const Value* value); const Value* value);
private: private:
scoped_refptr<CrashUploadList> crash_list_;
bool crash_list_available_;
DISALLOW_COPY_AND_ASSIGN(GpuMessageHandler); DISALLOW_COPY_AND_ASSIGN(GpuMessageHandler);
}; };
...@@ -87,17 +98,22 @@ class GpuMessageHandler ...@@ -87,17 +98,22 @@ class GpuMessageHandler
// //
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
GpuMessageHandler::GpuMessageHandler() { GpuMessageHandler::GpuMessageHandler()
: crash_list_available_(false) {
crash_list_ = CrashUploadList::Create(this);
} }
GpuMessageHandler::~GpuMessageHandler() { GpuMessageHandler::~GpuMessageHandler() {
GpuDataManager::GetInstance()->RemoveObserver(this); GpuDataManager::GetInstance()->RemoveObserver(this);
crash_list_->ClearDelegate();
} }
/* BrowserBridge.callAsync prepends a requestID to these messages. */ /* BrowserBridge.callAsync prepends a requestID to these messages. */
void GpuMessageHandler::RegisterMessages() { void GpuMessageHandler::RegisterMessages() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
crash_list_->LoadCrashListAsynchronously();
web_ui()->RegisterMessageCallback("browserBridgeInitialized", web_ui()->RegisterMessageCallback("browserBridgeInitialized",
base::Bind(&GpuMessageHandler::OnBrowserBridgeInitialized, base::Bind(&GpuMessageHandler::OnBrowserBridgeInitialized,
base::Unretained(this))); base::Unretained(this)));
...@@ -134,6 +150,8 @@ void GpuMessageHandler::OnCallAsync(const ListValue* args) { ...@@ -134,6 +150,8 @@ void GpuMessageHandler::OnCallAsync(const ListValue* args) {
ret = OnRequestClientInfo(submessageArgs); ret = OnRequestClientInfo(submessageArgs);
} else if (submessage == "requestLogMessages") { } else if (submessage == "requestLogMessages") {
ret = OnRequestLogMessages(submessageArgs); ret = OnRequestLogMessages(submessageArgs);
} else if (submessage == "requestCrashList") {
ret = OnRequestCrashList(submessageArgs);
} else { // unrecognized submessage } else { // unrecognized submessage
NOTREACHED(); NOTREACHED();
delete submessageArgs; delete submessageArgs;
...@@ -214,6 +232,33 @@ Value* GpuMessageHandler::OnRequestLogMessages(const ListValue*) { ...@@ -214,6 +232,33 @@ Value* GpuMessageHandler::OnRequestLogMessages(const ListValue*) {
return GpuDataManager::GetInstance()->GetLogMessages().DeepCopy(); return GpuDataManager::GetInstance()->GetLogMessages().DeepCopy();
} }
Value* GpuMessageHandler::OnRequestCrashList(const ListValue*) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if (!CrashesUI::CrashReportingEnabled()) {
// We need to return an empty list instead of NULL.
return new ListValue;
}
if (!crash_list_available_) {
// If we are still obtaining crash list, then return null so another
// request will be scheduled.
return NULL;
}
ListValue* list_value = new ListValue;
std::vector<CrashUploadList::CrashInfo> crashes;
crash_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));
list_value->Append(crash);
}
return list_value;
}
void GpuMessageHandler::OnGpuInfoUpdate() { void GpuMessageHandler::OnGpuInfoUpdate() {
// Get GPU Info. // Get GPU Info.
scoped_ptr<base::DictionaryValue> gpu_info_val( scoped_ptr<base::DictionaryValue> gpu_info_val(
...@@ -229,6 +274,10 @@ void GpuMessageHandler::OnGpuInfoUpdate() { ...@@ -229,6 +274,10 @@ void GpuMessageHandler::OnGpuInfoUpdate() {
*(gpu_info_val.get())); *(gpu_info_val.get()));
} }
void GpuMessageHandler::OnCrashListAvailable() {
crash_list_available_ = true;
}
} // namespace } // namespace
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment