1// Copyright (c) 2012 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#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_WARNING_SET_H_
6#define CHROME_BROWSER_EXTENSIONS_EXTENSION_WARNING_SET_H_
7
8#include <set>
9#include <string>
10#include <vector>
11
12#include "url/gurl.h"
13
14// TODO(battre) Remove the Extension prefix.
15
16namespace base {
17class FilePath;
18}
19
20class ExtensionSet;
21
22namespace extensions {
23
24// This class is used by the ExtensionWarningService to represent warnings if
25// extensions misbehave. Note that the ExtensionWarningService deals only with
26// specific warnings that should trigger a badge on the Chrome menu button.
27class ExtensionWarning {
28 public:
29  enum WarningType {
30    // Don't use this, it is only intended for the default constructor and
31    // does not have localized warning messages for the UI.
32    kInvalid = 0,
33    // An extension caused excessive network delays.
34    kNetworkDelay,
35    // This extension failed to modify a network request because the
36    // modification conflicted with a modification of another extension.
37    kNetworkConflict,
38    // This extension failed to redirect a network request because another
39    // extension with higher precedence redirected to a different target.
40    kRedirectConflict,
41    // The extension repeatedly flushed WebKit's in-memory cache, which slows
42    // down the overall performance.
43    kRepeatedCacheFlushes,
44    // The extension failed to determine the filename of a download because
45    // another extension with higher precedence determined a different filename.
46    kDownloadFilenameConflict,
47    kMaxWarningType
48  };
49
50  // We allow copy&assign for passing containers of ExtensionWarnings between
51  // threads.
52  ExtensionWarning(const ExtensionWarning& other);
53  ~ExtensionWarning();
54  ExtensionWarning& operator=(const ExtensionWarning& other);
55
56  // Factory methods for various warning types.
57  static ExtensionWarning CreateNetworkDelayWarning(
58      const std::string& extension_id);
59  static ExtensionWarning CreateNetworkConflictWarning(
60      const std::string& extension_id);
61  static ExtensionWarning CreateRedirectConflictWarning(
62      const std::string& extension_id,
63      const std::string& winning_extension_id,
64      const GURL& attempted_redirect_url,
65      const GURL& winning_redirect_url);
66  static ExtensionWarning CreateRequestHeaderConflictWarning(
67      const std::string& extension_id,
68      const std::string& winning_extension_id,
69      const std::string& conflicting_header);
70  static ExtensionWarning CreateResponseHeaderConflictWarning(
71      const std::string& extension_id,
72      const std::string& winning_extension_id,
73      const std::string& conflicting_header);
74  static ExtensionWarning CreateCredentialsConflictWarning(
75      const std::string& extension_id,
76      const std::string& winning_extension_id);
77  static ExtensionWarning CreateRepeatedCacheFlushesWarning(
78      const std::string& extension_id);
79  static ExtensionWarning CreateDownloadFilenameConflictWarning(
80      const std::string& losing_extension_id,
81      const std::string& winning_extension_id,
82      const base::FilePath& losing_filename,
83      const base::FilePath& winning_filename);
84
85  // Returns the specific warning type.
86  WarningType warning_type() const { return type_; }
87
88  // Returns the id of the extension for which this warning is valid.
89  const std::string& extension_id() const { return extension_id_; }
90
91  // Returns a localized warning message.
92  std::string GetLocalizedMessage(const ExtensionSet* extensions) const;
93
94 private:
95  // Constructs a warning of type |type| for extension |extension_id|. This
96  // could indicate for example the fact that an extension conflicted with
97  // others. The |message_id| refers to an IDS_ string ID. The
98  // |message_parameters| are filled into the message template.
99  ExtensionWarning(WarningType type,
100                   const std::string& extension_id,
101                   int message_id,
102                   const std::vector<std::string>& message_parameters);
103
104  WarningType type_;
105  std::string extension_id_;
106  // IDS_* resource ID.
107  int message_id_;
108  // Parameters to be filled into the string identified by |message_id_|.
109  std::vector<std::string> message_parameters_;
110};
111
112// Compare ExtensionWarnings based on the tuple of (extension_id, type).
113// The message associated with ExtensionWarnings is purely informational
114// and does not contribute to distinguishing extensions.
115bool operator<(const ExtensionWarning& a, const ExtensionWarning& b);
116
117typedef std::set<ExtensionWarning> ExtensionWarningSet;
118
119}  // namespace extensions
120
121#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_WARNING_SET_H_
122