summaryrefslogtreecommitdiffstats
path: root/chrome/browser/views/bug_report_view.h
blob: feeb0f31b2684ce3190fb09eeed40a2fbe608b44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
// Copyright (c) 2010 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.

#ifndef CHROME_BROWSER_VIEWS_BUG_REPORT_VIEW_H_
#define CHROME_BROWSER_VIEWS_BUG_REPORT_VIEW_H_

#include "chrome/common/net/url_fetcher.h"
#include "gfx/rect.h"
#include "googleurl/src/gurl.h"
#include "views/controls/button/radio_button.h"
#include "views/controls/combobox/combobox.h"
#include "views/controls/textfield/textfield.h"
#include "views/controls/link.h"
#include "views/controls/image_view.h"
#include "views/view.h"
#include "views/window/dialog_delegate.h"

#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/cros/syslogs_library.h"
#include "chrome/browser/chromeos/cros/cros_library.h"
#endif

namespace views {
class Checkbox;
class Label;
class Throbber;
class Window;
class RadioButton;
class Link;
}

class Profile;
class TabContents;
class BugReportComboBoxModel;

// BugReportView draws the dialog that allows the user to report a
// bug in rendering a particular page (note: this is not a crash
// report, which are handled separately by Breakpad).  It packages
// up the URL, a text description, system information and optionally
// a screenshot; then it submits the info through https to the google
// feedback chrome end-point.
//
// Note: This UI is being used for the Chrome OS dogfood release only
//       In the very next iteration, this will be replaced by a HTML
//       based UI, which will be common for all platforms
class BugReportView : public views::View,
                      public views::DialogDelegate,
                      public views::Combobox::Listener,
#if defined(OS_CHROMEOS)
                      public views::LinkController,
#endif
                      public views::Textfield::Controller {
 public:
  BugReportView(Profile* profile, TabContents* tab);
  virtual ~BugReportView();

  // NOTE: set_captured_image takes ownership of the vector
  void set_captured_image(std::vector<unsigned char>* png_data) {
    captured_image_.reset(png_data);
  }

  void set_screen_size(const gfx::Rect& screen_size) {
    screen_size_ = screen_size;
  }

  // Set all additional reporting controls to disabled
  // if phishing report
  void UpdateReportingControls(bool is_phishing_report);

  // Overridden from views::View:
  virtual gfx::Size GetPreferredSize();

  // views::Textfield::Controller implementation:
  virtual void ContentsChanged(views::Textfield* sender,
                               const string16& new_contents);
  virtual bool HandleKeystroke(views::Textfield* sender,
                               const views::Textfield::Keystroke& key);

  // views::Combobox::Listener implementation:
  virtual void ItemChanged(views::Combobox* combobox, int prev_index,
                           int new_index);

#if defined(OS_CHROMEOS)
  // Overridden from views::LinkController:
  virtual void LinkActivated(views::Link* source, int event_flags);

  // Disable the include last image radio control
  void DisableLastImageRadio() {
    include_last_screen_image_radio_->SetEnabled(false);
  }

  // NOTE: set_last_image takes ownership of the vector
  void set_last_image(std::vector<unsigned char>* png_data) {
    last_image_.reset(png_data);
  }
#endif

  // Overridden from views::DialogDelegate:
  virtual std::wstring GetDialogButtonLabel(
      MessageBoxFlags::DialogButton button) const;
  virtual int GetDefaultDialogButton() const;
  virtual bool CanResize() const;
  virtual bool CanMaximize() const;
  virtual bool IsAlwaysOnTop() const;
  virtual bool HasAlwaysOnTopMenu() const;
  virtual bool IsModal() const;
  virtual std::wstring GetWindowTitle() const;
  virtual bool Accept();
  virtual views::View* GetContentsView();

 private:
  class PostCleanup;

  // Set OS Version information in a string (maj.minor.build SP)
  void SetOSVersion(std::string *os_version);

  // Initializes the controls on the dialog.
  void SetupControl();
  // helper function to create a MIME part boundary string
  void CreateMimeBoundary(std::string *out);
  // Sends the data via an HTTP POST
  void SendReport();

  // Redirects the user to Google's phishing reporting page.
  void ReportPhishing();

  views::Label* bug_type_label_;
  views::Combobox* bug_type_combo_;
  views::Label* page_title_label_;
  views::Label* page_title_text_;
  views::Label* page_url_label_;
  views::Textfield* page_url_text_;
  views::Label* description_label_;
  views::Textfield* description_text_;
  views::Checkbox* include_page_source_checkbox_;
#if defined(OS_CHROMEOS)
  views::Label* user_email_label_;
  views::Textfield* user_email_text_;
  views::RadioButton* include_new_screen_image_radio_;
  views::RadioButton* include_last_screen_image_radio_;
  views::RadioButton* include_no_screen_image_radio_;
  views::Link* system_information_url_control_;

  scoped_ptr<chromeos::LogDictionaryType> sys_info_;
  scoped_ptr< std::vector<unsigned char> > last_image_;
#endif
  views::Checkbox* include_page_image_checkbox_;


  scoped_ptr<BugReportComboBoxModel> bug_type_model_;

  Profile* profile_;

  std::wstring version_;
  gfx::Rect screen_size_;
  scoped_ptr< std::vector<unsigned char> > captured_image_;

  TabContents* tab_;

  // Used to distinguish the report type: Phishing or other.
  int problem_type_;

  // Save the description the user types in when we clear the dialog for the
  // phishing option. If the user changes the report type back, we reinstate
  // their original text so they don't have to type it again.
  std::wstring old_report_text_;

  DISALLOW_COPY_AND_ASSIGN(BugReportView);
};

#endif  // CHROME_BROWSER_VIEWS_BUG_REPORT_VIEW_H_