Home | History | Annotate | Download | only in extensions
      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 
     16 namespace base {
     17 class FilePath;
     18 }
     19 
     20 namespace extensions {
     21 
     22 class ExtensionSet;
     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.
     27 class 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     kReloadTooFrequent,
     48     kMaxWarningType
     49   };
     50 
     51   // We allow copy&assign for passing containers of ExtensionWarnings between
     52   // threads.
     53   ExtensionWarning(const ExtensionWarning& other);
     54   ~ExtensionWarning();
     55   ExtensionWarning& operator=(const ExtensionWarning& other);
     56 
     57   // Factory methods for various warning types.
     58   static ExtensionWarning CreateNetworkDelayWarning(
     59       const std::string& extension_id);
     60   static ExtensionWarning CreateNetworkConflictWarning(
     61       const std::string& extension_id);
     62   static ExtensionWarning CreateRedirectConflictWarning(
     63       const std::string& extension_id,
     64       const std::string& winning_extension_id,
     65       const GURL& attempted_redirect_url,
     66       const GURL& winning_redirect_url);
     67   static ExtensionWarning CreateRequestHeaderConflictWarning(
     68       const std::string& extension_id,
     69       const std::string& winning_extension_id,
     70       const std::string& conflicting_header);
     71   static ExtensionWarning CreateResponseHeaderConflictWarning(
     72       const std::string& extension_id,
     73       const std::string& winning_extension_id,
     74       const std::string& conflicting_header);
     75   static ExtensionWarning CreateCredentialsConflictWarning(
     76       const std::string& extension_id,
     77       const std::string& winning_extension_id);
     78   static ExtensionWarning CreateRepeatedCacheFlushesWarning(
     79       const std::string& extension_id);
     80   static ExtensionWarning CreateDownloadFilenameConflictWarning(
     81       const std::string& losing_extension_id,
     82       const std::string& winning_extension_id,
     83       const base::FilePath& losing_filename,
     84       const base::FilePath& winning_filename);
     85   static ExtensionWarning CreateReloadTooFrequentWarning(
     86       const std::string& extension_id);
     87 
     88   // Returns the specific warning type.
     89   WarningType warning_type() const { return type_; }
     90 
     91   // Returns the id of the extension for which this warning is valid.
     92   const std::string& extension_id() const { return extension_id_; }
     93 
     94   // Returns a localized warning message.
     95   std::string GetLocalizedMessage(const ExtensionSet* extensions) const;
     96 
     97  private:
     98   // Constructs a warning of type |type| for extension |extension_id|. This
     99   // could indicate for example the fact that an extension conflicted with
    100   // others. The |message_id| refers to an IDS_ string ID. The
    101   // |message_parameters| are filled into the message template.
    102   ExtensionWarning(WarningType type,
    103                    const std::string& extension_id,
    104                    int message_id,
    105                    const std::vector<std::string>& message_parameters);
    106 
    107   WarningType type_;
    108   std::string extension_id_;
    109   // IDS_* resource ID.
    110   int message_id_;
    111   // Parameters to be filled into the string identified by |message_id_|.
    112   std::vector<std::string> message_parameters_;
    113 };
    114 
    115 // Compare ExtensionWarnings based on the tuple of (extension_id, type).
    116 // The message associated with ExtensionWarnings is purely informational
    117 // and does not contribute to distinguishing extensions.
    118 bool operator<(const ExtensionWarning& a, const ExtensionWarning& b);
    119 
    120 typedef std::set<ExtensionWarning> ExtensionWarningSet;
    121 
    122 }  // namespace extensions
    123 
    124 #endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_WARNING_SET_H_
    125