blob: 1cd4a7b69bfd6f6252f0b71bf75786f923fcb684 [file] [log] [blame]
// 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 <string>
#include <vector>
#include "base/compiler_specific.h"
#include "base/logging.h"
#include "base/strings/string16.h"
namespace extensions {
class ExtensionError {
public:
enum Type {
MANIFEST_PARSING_ERROR,
JAVASCRIPT_RUNTIME_ERROR
};
virtual ~ExtensionError();
virtual std::string PrintForTest() const;
Type type() const { return type_; }
const base::string16& source() const { return source_; }
const base::string16& message() const { return message_; }
const std::string& extension_id() const { return extension_id_; }
bool from_incognito() const { return from_incognito_; }
protected:
ExtensionError(Type type,
const std::string& extension_id,
bool from_incognito,
const base::string16& source,
const base::string16& message);
// Which type of error this is.
Type type_;
// The ID of the extension which caused the error.
std::string extension_id_;
// Whether or not the error was caused while incognito.
bool from_incognito_;
// 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_;
DISALLOW_COPY_AND_ASSIGN(ExtensionError);
};
class ManifestParsingError : public ExtensionError {
public:
ManifestParsingError(const std::string& extension_id,
const base::string16& message);
virtual ~ManifestParsingError();
virtual std::string PrintForTest() const OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(ManifestParsingError);
};
class JavascriptRuntimeError : public ExtensionError {
public:
struct StackFrame {
size_t line_number;
size_t column_number;
// 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 url;
base::string16 function; // optional
// STL-Required constructor
StackFrame();
StackFrame(size_t frame_line,
size_t frame_column,
const base::string16& frame_url,
const base::string16& frame_function /* can be empty */);
~StackFrame();
};
typedef std::vector<StackFrame> StackTrace;
JavascriptRuntimeError(bool from_incognito,
const base::string16& source,
const base::string16& message,
logging::LogSeverity level,
const base::string16& details);
virtual ~JavascriptRuntimeError();
virtual std::string PrintForTest() const OVERRIDE;
logging::LogSeverity level() const { return level_; }
const base::string16& execution_context_url() const {
return execution_context_url_;
}
const StackTrace& stack_trace() const { return stack_trace_; }
private:
// Parse the JSON |details| passed to the error. This includes a stack trace
// and an execution context url.
void ParseDetails(const base::string16& details);
// Try to determine the ID of the extension. This may be obtained through the
// reported source, or through the execution context url.
void DetermineExtensionID();
logging::LogSeverity level_;
base::string16 execution_context_url_;
StackTrace stack_trace_;
DISALLOW_COPY_AND_ASSIGN(JavascriptRuntimeError);
};
} // namespace extensions
#endif // EXTENSIONS_BROWSER_EXTENSION_ERROR_H_