|  | // Copyright 2013 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 EXTENSIONS_BROWSER_EXTENSION_ERROR_H_ | 
|  | #define EXTENSIONS_BROWSER_EXTENSION_ERROR_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  |  | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "base/compiler_specific.h" | 
|  | #include "base/logging.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/strings/string16.h" | 
|  | #include "extensions/common/stack_frame.h" | 
|  | #include "url/gurl.h" | 
|  |  | 
|  | namespace extensions { | 
|  |  | 
|  | class ExtensionError { | 
|  | public: | 
|  | enum Type { | 
|  | MANIFEST_ERROR = 0, | 
|  | RUNTIME_ERROR, | 
|  | INTERNAL_ERROR, | 
|  | NUM_ERROR_TYPES,  // Put new values above this. | 
|  | }; | 
|  |  | 
|  | virtual ~ExtensionError(); | 
|  |  | 
|  | virtual std::string GetDebugString() const; | 
|  |  | 
|  | // Return true if this error and |rhs| are considered equal, and should be | 
|  | // grouped together. | 
|  | bool IsEqual(const ExtensionError* rhs) const; | 
|  |  | 
|  | Type type() const { return type_; } | 
|  | const std::string& extension_id() const { return extension_id_; } | 
|  | int id() const { return id_; } | 
|  | void set_id(int id) { id_ = id; } | 
|  | bool from_incognito() const { return from_incognito_; } | 
|  | logging::LogSeverity level() const { return level_; } | 
|  | const base::string16& source() const { return source_; } | 
|  | const base::string16& message() const { return message_; } | 
|  | size_t occurrences() const { return occurrences_; } | 
|  | void set_occurrences(size_t occurrences) { occurrences_ = occurrences; } | 
|  |  | 
|  | protected: | 
|  | ExtensionError(Type type, | 
|  | const std::string& extension_id, | 
|  | bool from_incognito, | 
|  | logging::LogSeverity level, | 
|  | const base::string16& source, | 
|  | const base::string16& message); | 
|  |  | 
|  | virtual bool IsEqualImpl(const ExtensionError* rhs) const = 0; | 
|  |  | 
|  | // Which type of error this is. | 
|  | Type type_; | 
|  | // The ID of the extension which caused the error. | 
|  | std::string extension_id_; | 
|  | // The id of this particular error. This can be zero if the id is never set. | 
|  | int id_; | 
|  | // Whether or not the error was caused while incognito. | 
|  | bool from_incognito_; | 
|  | // The severity level of the error. | 
|  | logging::LogSeverity level_; | 
|  | // The source for the error; this can be a script, web page, or manifest file. | 
|  | // This is stored as a string (rather than a url) since it can be a Chrome | 
|  | // script file (e.g., event_bindings.js). | 
|  | base::string16 source_; | 
|  | // The error message itself. | 
|  | base::string16 message_; | 
|  | // The number of times this error has occurred. | 
|  | size_t occurrences_; | 
|  |  | 
|  | private: | 
|  | DISALLOW_COPY_AND_ASSIGN(ExtensionError); | 
|  | }; | 
|  |  | 
|  | class ManifestError : public ExtensionError { | 
|  | public: | 
|  | ManifestError(const std::string& extension_id, | 
|  | const base::string16& message, | 
|  | const base::string16& manifest_key, | 
|  | const base::string16& manifest_specific); | 
|  | ~ManifestError() override; | 
|  |  | 
|  | std::string GetDebugString() const override; | 
|  |  | 
|  | const base::string16& manifest_key() const { return manifest_key_; } | 
|  | const base::string16& manifest_specific() const { return manifest_specific_; } | 
|  |  | 
|  | private: | 
|  | bool IsEqualImpl(const ExtensionError* rhs) const override; | 
|  |  | 
|  | // If present, this indicates the feature in the manifest which caused the | 
|  | // error. | 
|  | base::string16 manifest_key_; | 
|  | // If present, this is a more-specific location of the error - for instance, | 
|  | // a specific permission which is incorrect, rather than simply "permissions". | 
|  | base::string16 manifest_specific_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(ManifestError); | 
|  | }; | 
|  |  | 
|  | class RuntimeError : public ExtensionError { | 
|  | public: | 
|  | RuntimeError(const std::string& extension_id,  // optional, sometimes unknown. | 
|  | bool from_incognito, | 
|  | const base::string16& source, | 
|  | const base::string16& message, | 
|  | const StackTrace& stack_trace, | 
|  | const GURL& context_url, | 
|  | logging::LogSeverity level, | 
|  | int render_view_id, | 
|  | int render_process_id); | 
|  | ~RuntimeError() override; | 
|  |  | 
|  | std::string GetDebugString() const override; | 
|  |  | 
|  | const GURL& context_url() const { return context_url_; } | 
|  | const StackTrace& stack_trace() const { return stack_trace_; } | 
|  | int render_frame_id() const { return render_frame_id_; } | 
|  | int render_process_id() const { return render_process_id_; } | 
|  |  | 
|  | private: | 
|  | bool IsEqualImpl(const ExtensionError* rhs) const override; | 
|  |  | 
|  | // Since we piggy-back onto other error reporting systems (like V8 and | 
|  | // WebKit), the reported information may need to be cleaned up in order to be | 
|  | // in a consistent format. | 
|  | void CleanUpInit(); | 
|  |  | 
|  | GURL context_url_; | 
|  | StackTrace stack_trace_; | 
|  |  | 
|  | // Keep track of the render process which caused the error in order to | 
|  | // inspect the frame later, if possible. | 
|  | int render_frame_id_; | 
|  | int render_process_id_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(RuntimeError); | 
|  | }; | 
|  |  | 
|  | class InternalError : public ExtensionError { | 
|  | public: | 
|  | InternalError(const std::string& extension_id, | 
|  | const base::string16& message, | 
|  | logging::LogSeverity level); | 
|  | ~InternalError() override; | 
|  |  | 
|  | std::string GetDebugString() const override; | 
|  |  | 
|  | private: | 
|  | bool IsEqualImpl(const ExtensionError* rhs) const override; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(InternalError); | 
|  | }; | 
|  |  | 
|  | }  // namespace extensions | 
|  |  | 
|  | #endif  // EXTENSIONS_BROWSER_EXTENSION_ERROR_H_ |