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() {
chrome.send('browserBridgeInitialized');
this.beginRequestClientInfo_();
this.beginRequestLogMessages_();
this.beginRequestCrashList_();
}
}
......@@ -137,6 +138,28 @@ cr.define('gpu', function() {
*/
get 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.
<div id="diagnostics-table">None</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">
<h3>Log Messages</h3>
<ul>
......
......@@ -27,6 +27,8 @@ cr.define('gpu', function() {
this.refresh.bind(this));
browserBridge.addEventListener('clientInfoChange',
this.refresh.bind(this));
browserBridge.addEventListener('crashListChange',
this.refresh.bind(this));
this.refresh();
},
......@@ -184,6 +186,10 @@ cr.define('gpu', function() {
problemsDiv.hidden = true;
}
// Crash list
jstProcess(new JsEvalContext({values: browserBridge.crashList}),
document.getElementById('crash-list'));
// Log messages
jstProcess(new JsEvalContext({values: browserBridge.logMessages}),
document.getElementById('log-messages'));
......
......@@ -9,14 +9,17 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/command_line.h"
#include "base/i18n/time_formatting.h"
#include "base/string_number_conversions.h"
#include "base/stringprintf.h"
#include "base/sys_info.h"
#include "base/values.h"
#include "chrome/browser/crash_upload_list.h"
#include "chrome/browser/gpu_blacklist.h"
#include "chrome/browser/gpu_util.h"
#include "chrome/browser/profiles/profile.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/url_constants.h"
#include "content/public/browser/browser_thread.h"
......@@ -53,7 +56,8 @@ ChromeWebUIDataSource* CreateGpuHTMLSource() {
class GpuMessageHandler
: public WebUIMessageHandler,
public base::SupportsWeakPtr<GpuMessageHandler>,
public content::GpuDataManagerObserver {
public content::GpuDataManagerObserver,
public CrashUploadList::Delegate {
public:
GpuMessageHandler();
virtual ~GpuMessageHandler();
......@@ -64,6 +68,9 @@ class GpuMessageHandler
// GpuDataManagerObserver implementation.
virtual void OnGpuInfoUpdate() OVERRIDE;
// CrashUploadList::Delegate implemenation.
virtual void OnCrashListAvailable() OVERRIDE;
// Messages
void OnBrowserBridgeInitialized(const ListValue* list);
void OnCallAsync(const ListValue* list);
......@@ -71,6 +78,7 @@ class GpuMessageHandler
// Submessages dispatched from OnCallAsync
Value* OnRequestClientInfo(const ListValue* list);
Value* OnRequestLogMessages(const ListValue* list);
Value* OnRequestCrashList(const ListValue* list);
// Executes the javascript function |function_name| in the renderer, passing
// it the argument |value|.
......@@ -78,6 +86,9 @@ class GpuMessageHandler
const Value* value);
private:
scoped_refptr<CrashUploadList> crash_list_;
bool crash_list_available_;
DISALLOW_COPY_AND_ASSIGN(GpuMessageHandler);
};
......@@ -87,17 +98,22 @@ class GpuMessageHandler
//
////////////////////////////////////////////////////////////////////////////////
GpuMessageHandler::GpuMessageHandler() {
GpuMessageHandler::GpuMessageHandler()
: crash_list_available_(false) {
crash_list_ = CrashUploadList::Create(this);
}
GpuMessageHandler::~GpuMessageHandler() {
GpuDataManager::GetInstance()->RemoveObserver(this);
crash_list_->ClearDelegate();
}
/* BrowserBridge.callAsync prepends a requestID to these messages. */
void GpuMessageHandler::RegisterMessages() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
crash_list_->LoadCrashListAsynchronously();
web_ui()->RegisterMessageCallback("browserBridgeInitialized",
base::Bind(&GpuMessageHandler::OnBrowserBridgeInitialized,
base::Unretained(this)));
......@@ -134,6 +150,8 @@ void GpuMessageHandler::OnCallAsync(const ListValue* args) {
ret = OnRequestClientInfo(submessageArgs);
} else if (submessage == "requestLogMessages") {
ret = OnRequestLogMessages(submessageArgs);
} else if (submessage == "requestCrashList") {
ret = OnRequestCrashList(submessageArgs);
} else { // unrecognized submessage
NOTREACHED();
delete submessageArgs;
......@@ -214,6 +232,33 @@ Value* GpuMessageHandler::OnRequestLogMessages(const ListValue*) {
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() {
// Get GPU Info.
scoped_ptr<base::DictionaryValue> gpu_info_val(
......@@ -229,6 +274,10 @@ void GpuMessageHandler::OnGpuInfoUpdate() {
*(gpu_info_val.get()));
}
void GpuMessageHandler::OnCrashListAvailable() {
crash_list_available_ = true;
}
} // 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