summaryrefslogtreecommitdiff
path: root/chromium/extensions/browser/extension_error.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/extensions/browser/extension_error.h')
-rw-r--r--chromium/extensions/browser/extension_error.h165
1 files changed, 165 insertions, 0 deletions
diff --git a/chromium/extensions/browser/extension_error.h b/chromium/extensions/browser/extension_error.h
new file mode 100644
index 00000000000..7caa95cddd5
--- /dev/null
+++ b/chromium/extensions/browser/extension_error.h
@@ -0,0 +1,165 @@
+// 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_