17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/extensions/api/feedback_private/feedback_private_api.h"
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/lazy_instance.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/string_util.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/values.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/extensions/api/feedback_private/feedback_service.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/feedback/tracing_manager.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/event_router.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "grit/generated_resources.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/webui/web_ui_util.h"
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/url_util.h"
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace {
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Getting the filename of a blob prepends a "C:\fakepath" to the filename.
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// This is undesirable, strip it if it exists.
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)std::string StripFakepath(const std::string& path) {
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const char kFakePathStr[] = "C:\\fakepath\\";
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (StartsWithASCII(path, kFakePathStr, false))
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return path.substr(arraysize(kFakePathStr) - 1);
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return path;
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace extensions {
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace feedback_private = api::feedback_private;
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using feedback_private::SystemInformation;
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using feedback_private::FeedbackInfo;
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)char kFeedbackExtensionId[] = "gfdkimpbcpahaombhbimeihdjnejgicl";
438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static base::LazyInstance<ProfileKeyedAPIFactory<FeedbackPrivateAPI> >
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    g_factory = LAZY_INSTANCE_INITIALIZER;
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// static
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)ProfileKeyedAPIFactory<FeedbackPrivateAPI>*
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    FeedbackPrivateAPI::GetFactoryInstance() {
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return &g_factory.Get();
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)FeedbackPrivateAPI::FeedbackPrivateAPI(Profile* profile)
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : profile_(profile),
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      service_(FeedbackService::CreateInstance()) {
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)FeedbackPrivateAPI::~FeedbackPrivateAPI() {
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  delete service_;
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  service_ = NULL;
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)FeedbackService* FeedbackPrivateAPI::GetService() const {
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return service_;
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void FeedbackPrivateAPI::RequestFeedback(
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& description_template,
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& category_tag,
7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const GURL& page_url) {
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(rkc): Remove logging once crbug.com/284662 is closed.
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LOG(WARNING) << "FEEDBACK_DEBUG: Feedback requested.";
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (profile_ && ExtensionSystem::Get(profile_)->event_router()) {
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    FeedbackInfo info;
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    info.description = description_template;
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    info.category_tag = make_scoped_ptr(new std::string(category_tag));
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    info.page_url = make_scoped_ptr(new std::string(page_url.spec()));
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    info.system_information.reset(new SystemInformationList);
7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // The manager is only available if tracing is enabled.
8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (TracingManager* manager = TracingManager::Get()) {
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      info.trace_id.reset(new int(manager->RequestTrace()));
8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<base::ListValue> args(new base::ListValue());
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    args->Append(info.ToValue().release());
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_ptr<Event> event(new Event(
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        feedback_private::OnFeedbackRequested::kEventName, args.Pass()));
897da551c69e84cdee501ba0193ee132bc3b5b2c1dTorne (Richard Coles)    event->restrict_to_browser_context = profile_;
907da551c69e84cdee501ba0193ee132bc3b5b2c1dTorne (Richard Coles)
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // TODO(rkc): Remove logging once crbug.com/284662 is closed.
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LOG(WARNING) << "FEEDBACK_DEBUG: Dispatching onFeedbackRequested event.";
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ExtensionSystem::Get(profile_)->event_router()->DispatchEventToExtension(
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        kFeedbackExtensionId,
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        event.Pass());
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// static
1008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)base::Closure* FeedbackPrivateGetStringsFunction::test_callback_ = NULL;
1018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool FeedbackPrivateGetStringsFunction::RunImpl() {
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DictionaryValue* dict = new DictionaryValue();
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SetResult(dict);
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define SET_STRING(id, idr) \
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  dict->SetString(id, l10n_util::GetStringUTF16(idr))
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("page-title", IDS_FEEDBACK_REPORT_PAGE_TITLE);
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("page-url", IDS_FEEDBACK_REPORT_URL_LABEL);
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("screenshot", IDS_FEEDBACK_SCREENSHOT_LABEL);
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("user-email", IDS_FEEDBACK_USER_EMAIL_LABEL);
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SET_STRING("sys-info",
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             IDS_FEEDBACK_INCLUDE_SYSTEM_INFORMATION_AND_METRICS_CHKBOX);
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("attach-file-label", IDS_FEEDBACK_ATTACH_FILE_LABEL);
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("attach-file-note", IDS_FEEDBACK_ATTACH_FILE_NOTE);
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("attach-file-to-big", IDS_FEEDBACK_ATTACH_FILE_TO_BIG);
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("reading-file", IDS_FEEDBACK_READING_FILE);
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("send-report", IDS_FEEDBACK_SEND_REPORT);
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("cancel", IDS_CANCEL);
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("no-description", IDS_FEEDBACK_NO_DESCRIPTION);
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("privacy-note", IDS_FEEDBACK_PRIVACY_NOTE);
12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  SET_STRING("performance-trace",
12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)             IDS_FEEDBACK_INCLUDE_PERFORMANCE_TRACE_CHECKBOX);
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#undef SET_STRING
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  webui::SetFontAndTextDirection(dict);
1278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (test_callback_ && !test_callback_->is_null())
1298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    test_callback_->Run();
1308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return true;
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool FeedbackPrivateGetUserEmailFunction::RunImpl() {
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(rkc): Remove logging once crbug.com/284662 is closed.
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LOG(WARNING) << "FEEDBACK_DEBUG: User e-mail requested.";
1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  FeedbackService* service = FeedbackPrivateAPI::GetFactoryInstance()
1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                 ->GetForProfile(GetProfile())
1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                 ->GetService();
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(service);
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SetResult(new base::StringValue(service->GetUserEmail()));
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return true;
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool FeedbackPrivateGetSystemInformationFunction::RunImpl() {
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(rkc): Remove logging once crbug.com/284662 is closed.
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LOG(WARNING) << "FEEDBACK_DEBUG: System information requested.";
1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  FeedbackService* service = FeedbackPrivateAPI::GetFactoryInstance()
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                 ->GetForProfile(GetProfile())
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                 ->GetService();
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(service);
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  service->GetSystemInformation(
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          &FeedbackPrivateGetSystemInformationFunction::OnCompleted, this));
1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return true;
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void FeedbackPrivateGetSystemInformationFunction::OnCompleted(
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const SystemInformationList& sys_info) {
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  results_ = feedback_private::GetSystemInformation::Results::Create(
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      sys_info);
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SendResponse(true);
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool FeedbackPrivateSendFeedbackFunction::RunImpl() {
1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<feedback_private::SendFeedback::Params> params(
1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      feedback_private::SendFeedback::Params::Create(*args_));
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const FeedbackInfo &feedback_info = params->feedback;
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
17268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::string attached_file_uuid;
17368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (feedback_info.attached_file_blob_uuid.get() &&
17468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      !feedback_info.attached_file_blob_uuid->empty())
17568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    attached_file_uuid = *feedback_info.attached_file_blob_uuid;
1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::string screenshot_uuid;
17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (feedback_info.screenshot_blob_uuid.get() &&
17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      !feedback_info.screenshot_blob_uuid->empty())
18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    screenshot_uuid = *feedback_info.screenshot_blob_uuid;
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Populate feedback data.
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<FeedbackData> feedback_data(new FeedbackData());
1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  feedback_data->set_profile(GetProfile());
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  feedback_data->set_description(feedback_info.description);
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (feedback_info.category_tag.get())
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    feedback_data->set_category_tag(*feedback_info.category_tag.get());
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (feedback_info.page_url.get())
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    feedback_data->set_page_url(*feedback_info.page_url.get());
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (feedback_info.email.get())
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    feedback_data->set_user_email(*feedback_info.email.get());
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
19468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!attached_file_uuid.empty()) {
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    feedback_data->set_attached_filename(
1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        StripFakepath((*feedback_info.attached_file.get()).name));
19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    feedback_data->set_attached_file_uuid(attached_file_uuid);
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!screenshot_uuid.empty())
20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    feedback_data->set_screenshot_uuid(screenshot_uuid);
20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (feedback_info.trace_id.get()) {
20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    feedback_data->set_trace_id(*feedback_info.trace_id.get());
20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<FeedbackData::SystemLogsMap> sys_logs(
2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new FeedbackData::SystemLogsMap);
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SystemInformationList* sys_info = feedback_info.system_information.get();
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (sys_info) {
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    for (SystemInformationList::iterator it = sys_info->begin();
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         it != sys_info->end(); ++it)
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      (*sys_logs.get())[it->get()->key] = it->get()->value;
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  feedback_data->SetAndCompressSystemInfo(sys_logs.Pass());
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  FeedbackService* service = FeedbackPrivateAPI::GetFactoryInstance()
2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                 ->GetForProfile(GetProfile())
2191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                 ->GetService();
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(service);
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (feedback_info.send_histograms) {
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<std::string> histograms(new std::string);
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    service->GetHistograms(histograms.get());
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!histograms->empty())
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      feedback_data->SetAndCompressHistograms(histograms.Pass());
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  service->SendFeedback(
2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      GetProfile(),
2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      feedback_data,
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      base::Bind(&FeedbackPrivateSendFeedbackFunction::OnCompleted, this));
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return true;
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void FeedbackPrivateSendFeedbackFunction::OnCompleted(
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    bool success) {
2393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  results_ = feedback_private::SendFeedback::Results::Create(
2403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      success ? feedback_private::STATUS_SUCCESS :
2413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                feedback_private::STATUS_DELAYED);
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SendResponse(true);
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace extensions
246