Home | History | Annotate | Download | only in feedback
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "components/feedback/feedback_util.h"
      6 
      7 #include <string>
      8 
      9 #include "base/bind.h"
     10 #include "base/files/file_util.h"
     11 #include "components/feedback/feedback_data.h"
     12 #include "components/feedback/feedback_uploader.h"
     13 #include "components/feedback/feedback_uploader_factory.h"
     14 #include "components/feedback/proto/common.pb.h"
     15 #include "components/feedback/proto/dom.pb.h"
     16 #include "components/feedback/proto/extension.pb.h"
     17 #include "components/feedback/proto/math.pb.h"
     18 #include "third_party/zlib/google/zip.h"
     19 
     20 using feedback::FeedbackData;
     21 
     22 namespace {
     23 
     24 #if defined(OS_CHROMEOS)
     25 const int kChromeOSProductId = 208;
     26 #else
     27 const int kChromeBrowserProductId = 237;
     28 #endif
     29 
     30 }  // namespace
     31 
     32 namespace feedback_util {
     33 
     34 void SendReport(scoped_refptr<FeedbackData> data) {
     35   if (!data.get()) {
     36     LOG(ERROR) << "SendReport called with NULL data!";
     37     NOTREACHED();
     38     return;
     39   }
     40 
     41   userfeedback::ExtensionSubmit feedback_data;
     42   data->PrepareReport(&feedback_data);
     43 
     44   // Set whether we're reporting from ChromeOS or Chrome on another platform.
     45   userfeedback::ChromeData chrome_data;
     46 #if defined(OS_CHROMEOS)
     47   chrome_data.set_chrome_platform(
     48       userfeedback::ChromeData_ChromePlatform_CHROME_OS);
     49   userfeedback::ChromeOsData chrome_os_data;
     50   chrome_os_data.set_category(
     51       userfeedback::ChromeOsData_ChromeOsCategory_OTHER);
     52   *(chrome_data.mutable_chrome_os_data()) = chrome_os_data;
     53   feedback_data.set_product_id(kChromeOSProductId);
     54 #else
     55   chrome_data.set_chrome_platform(
     56       userfeedback::ChromeData_ChromePlatform_CHROME_BROWSER);
     57   userfeedback::ChromeBrowserData chrome_browser_data;
     58   chrome_browser_data.set_category(
     59       userfeedback::ChromeBrowserData_ChromeBrowserCategory_OTHER);
     60   *(chrome_data.mutable_chrome_browser_data()) = chrome_browser_data;
     61   feedback_data.set_product_id(kChromeBrowserProductId);
     62 #endif
     63 
     64   *(feedback_data.mutable_chrome_data()) = chrome_data;
     65 
     66   // This pointer will eventually get deleted by the PostCleanup class, after
     67   // we've either managed to successfully upload the report or died trying.
     68   std::string post_body;
     69   feedback_data.SerializeToString(&post_body);
     70 
     71   feedback::FeedbackUploader *uploader =
     72       feedback::FeedbackUploaderFactory::GetForBrowserContext(data->context());
     73   uploader->QueueReport(post_body);
     74 }
     75 
     76 bool ZipString(const base::FilePath& filename,
     77                const std::string& data, std::string* compressed_logs) {
     78   base::FilePath temp_path;
     79   base::FilePath zip_file;
     80 
     81   // Create a temporary directory, put the logs into a file in it. Create
     82   // another temporary file to receive the zip file in.
     83   if (!base::CreateNewTempDirectory(base::FilePath::StringType(), &temp_path))
     84     return false;
     85   if (base::WriteFile(temp_path.Append(filename), data.c_str(), data.size()) ==
     86       -1)
     87     return false;
     88 
     89   bool succeed = base::CreateTemporaryFile(&zip_file) &&
     90       zip::Zip(temp_path, zip_file, false) &&
     91       base::ReadFileToString(zip_file, compressed_logs);
     92 
     93   base::DeleteFile(temp_path, true);
     94   base::DeleteFile(zip_file, false);
     95 
     96   return succeed;
     97 }
     98 
     99 }  // namespace feedback_util
    100