// Copyright (c) 2012 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_EXTENSIONS_EXTENSION_WARNING_SET_H_
#define CHROME_BROWSER_EXTENSIONS_EXTENSION_WARNING_SET_H_
#include <set>
#include <string>
#include <vector>
#include "url/gurl.h"
// TODO(battre) Remove the Extension prefix.
namespace base {
class FilePath;
}
class ExtensionSet;
namespace extensions {
// This class is used by the ExtensionWarningService to represent warnings if
// extensions misbehave. Note that the ExtensionWarningService deals only with
// specific warnings that should trigger a badge on the Chrome menu button.
class ExtensionWarning {
public:
enum WarningType {
// Don't use this, it is only intended for the default constructor and
// does not have localized warning messages for the UI.
kInvalid = 0,
// An extension caused excessive network delays.
kNetworkDelay,
// This extension failed to modify a network request because the
// modification conflicted with a modification of another extension.
kNetworkConflict,
// This extension failed to redirect a network request because another
// extension with higher precedence redirected to a different target.
kRedirectConflict,
// The extension repeatedly flushed WebKit's in-memory cache, which slows
// down the overall performance.
kRepeatedCacheFlushes,
// The extension failed to determine the filename of a download because
// another extension with higher precedence determined a different filename.
kDownloadFilenameConflict,
kMaxWarningType
};
// We allow copy&assign for passing containers of ExtensionWarnings between
// threads.
ExtensionWarning(const ExtensionWarning& other);
~ExtensionWarning();
ExtensionWarning& operator=(const ExtensionWarning& other);
// Factory methods for various warning types.
static ExtensionWarning CreateNetworkDelayWarning(
const std::string& extension_id);
static ExtensionWarning CreateNetworkConflictWarning(
const std::string& extension_id);
static ExtensionWarning CreateRedirectConflictWarning(
const std::string& extension_id,
const std::string& winning_extension_id,
const GURL& attempted_redirect_url,
const GURL& winning_redirect_url);
static ExtensionWarning CreateRequestHeaderConflictWarning(
const std::string& extension_id,
const std::string& winning_extension_id,
const std::string& conflicting_header);
static ExtensionWarning CreateResponseHeaderConflictWarning(
const std::string& extension_id,
const std::string& winning_extension_id,
const std::string& conflicting_header);
static ExtensionWarning CreateCredentialsConflictWarning(
const std::string& extension_id,
const std::string& winning_extension_id);
static ExtensionWarning CreateRepeatedCacheFlushesWarning(
const std::string& extension_id);
static ExtensionWarning CreateDownloadFilenameConflictWarning(
const std::string& losing_extension_id,
const std::string& winning_extension_id,
const base::FilePath& losing_filename,
const base::FilePath& winning_filename);
// Returns the specific warning type.
WarningType warning_type() const { return type_; }
// Returns the id of the extension for which this warning is valid.
const std::string& extension_id() const { return extension_id_; }
// Returns a localized warning message.
std::string GetLocalizedMessage(const ExtensionSet* extensions) const;
private:
// Constructs a warning of type |type| for extension |extension_id|. This
// could indicate for example the fact that an extension conflicted with
// others. The |message_id| refers to an IDS_ string ID. The
// |message_parameters| are filled into the message template.
ExtensionWarning(WarningType type,
const std::string& extension_id,
int message_id,
const std::vector<std::string>& message_parameters);
WarningType type_;
std::string extension_id_;
// IDS_* resource ID.
int message_id_;
// Parameters to be filled into the string identified by |message_id_|.
std::vector<std::string> message_parameters_;
};
// Compare ExtensionWarnings based on the tuple of (extension_id, type).
// The message associated with ExtensionWarnings is purely informational
// and does not contribute to distinguishing extensions.
bool operator<(const ExtensionWarning& a, const ExtensionWarning& b);
typedef std::set<ExtensionWarning> ExtensionWarningSet;
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_WARNING_SET_H_