| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/browser/extension_error.h" | 5 #include "extensions/browser/extension_error.h" |
| 6 | 6 |
| 7 #include "base/strings/string_number_conversions.h" | 7 #include "base/strings/string_number_conversions.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "base/values.h" | 9 #include "base/values.h" |
| 10 #include "extensions/common/constants.h" | 10 #include "extensions/common/constants.h" |
| 11 #include "url/gurl.h" | 11 #include "url/gurl.h" |
| 12 | 12 |
| 13 using base::string16; | 13 using base::string16; |
| 14 using base::DictionaryValue; |
| 14 | 15 |
| 15 namespace extensions { | 16 namespace extensions { |
| 16 | 17 |
| 17 namespace { | 18 //////////////////////////////////////////////////////////////////////////////// |
| 19 // ExtensionError |
| 18 | 20 |
| 19 const char kLineNumberKey[] = "lineNumber"; | 21 // Static JSON keys. |
| 20 const char kColumnNumberKey[] = "columnNumber"; | 22 const char ExtensionError::kExtensionIdKey[] = "extensionId"; |
| 21 const char kURLKey[] = "url"; | 23 const char ExtensionError::kFromIncognitoKey[] = "fromIncognito"; |
| 22 const char kFunctionNameKey[] = "functionName"; | 24 const char ExtensionError::kLevelKey[] = "level"; |
| 23 const char kExecutionContextURLKey[] = "executionContextURL"; | 25 const char ExtensionError::kMessageKey[] = "message"; |
| 24 const char kStackTraceKey[] = "stackTrace"; | 26 const char ExtensionError::kSourceKey[] = "source"; |
| 25 | 27 const char ExtensionError::kTypeKey[] = "type"; |
| 26 // Try to retrieve an extension ID from a |url|. On success, returns true and | |
| 27 // populates |extension_id| with the ID. On failure, returns false and leaves | |
| 28 // extension_id untouched. | |
| 29 bool GetExtensionIDFromGURL(const GURL& url, std::string* extension_id) { | |
| 30 if (url.SchemeIs(kExtensionScheme)) { | |
| 31 *extension_id = url.host(); | |
| 32 return true; | |
| 33 } | |
| 34 return false; | |
| 35 } | |
| 36 | |
| 37 } // namespace | |
| 38 | 28 |
| 39 ExtensionError::ExtensionError(Type type, | 29 ExtensionError::ExtensionError(Type type, |
| 40 const std::string& extension_id, | 30 const std::string& extension_id, |
| 41 bool from_incognito, | 31 bool from_incognito, |
| 42 logging::LogSeverity level, | 32 logging::LogSeverity level, |
| 43 const string16& source, | 33 const string16& source, |
| 44 const string16& message) | 34 const string16& message) |
| 45 : type_(type), | 35 : type_(type), |
| 46 extension_id_(extension_id), | 36 extension_id_(extension_id), |
| 47 from_incognito_(from_incognito), | 37 from_incognito_(from_incognito), |
| 48 level_(level), | 38 level_(level), |
| 49 source_(source), | 39 source_(source), |
| 50 message_(message), | 40 message_(message), |
| 51 occurrences_(1u) { | 41 occurrences_(1u) { |
| 52 } | 42 } |
| 53 | 43 |
| 54 ExtensionError::~ExtensionError() { | 44 ExtensionError::~ExtensionError() { |
| 55 } | 45 } |
| 56 | 46 |
| 47 scoped_ptr<DictionaryValue> ExtensionError::ToValue() const { |
| 48 // TODO(rdevlin.cronin): Use ValueBuilder when it's moved from |
| 49 // chrome/common/extensions. |
| 50 scoped_ptr<DictionaryValue> value(new DictionaryValue); |
| 51 value->SetInteger(kTypeKey, static_cast<int>(type_)); |
| 52 value->SetString(kExtensionIdKey, extension_id_); |
| 53 value->SetBoolean(kFromIncognitoKey, from_incognito_); |
| 54 value->SetInteger(kLevelKey, static_cast<int>(level_)); |
| 55 value->SetString(kSourceKey, source_); |
| 56 value->SetString(kMessageKey, message_); |
| 57 |
| 58 return value.Pass(); |
| 59 } |
| 60 |
| 57 std::string ExtensionError::PrintForTest() const { | 61 std::string ExtensionError::PrintForTest() const { |
| 58 return std::string("Extension Error:") + | 62 return std::string("Extension Error:") + |
| 59 "\n OTR: " + std::string(from_incognito_ ? "true" : "false") + | 63 "\n OTR: " + std::string(from_incognito_ ? "true" : "false") + |
| 60 "\n Level: " + base::IntToString(static_cast<int>(level_)); | 64 "\n Level: " + base::IntToString(static_cast<int>(level_)); |
| 61 "\n Source: " + base::UTF16ToUTF8(source_) + | 65 "\n Source: " + base::UTF16ToUTF8(source_) + |
| 62 "\n Message: " + base::UTF16ToUTF8(message_) + | 66 "\n Message: " + base::UTF16ToUTF8(message_) + |
| 63 "\n ID: " + extension_id_; | 67 "\n ID: " + extension_id_; |
| 64 } | 68 } |
| 65 | 69 |
| 66 bool ExtensionError::IsEqual(const ExtensionError* rhs) const { | 70 bool ExtensionError::IsEqual(const ExtensionError* rhs) const { |
| 67 // We don't check |source_| or |level_| here, since they are constant for | 71 // We don't check |source_| or |level_| here, since they are constant for |
| 68 // manifest errors. Check them in RuntimeError::IsEqualImpl() instead. | 72 // manifest errors. Check them in RuntimeError::IsEqualImpl() instead. |
| 69 return type_ == rhs->type_ && | 73 return type_ == rhs->type_ && |
| 70 extension_id_ == rhs->extension_id_ && | 74 extension_id_ == rhs->extension_id_ && |
| 71 message_ == rhs->message_ && | 75 message_ == rhs->message_ && |
| 72 IsEqualImpl(rhs); | 76 IsEqualImpl(rhs); |
| 73 } | 77 } |
| 74 | 78 |
| 79 //////////////////////////////////////////////////////////////////////////////// |
| 80 // ManifestError |
| 81 |
| 82 // Static JSON keys. |
| 83 const char ManifestError::kManifestKeyKey[] = "manifestKey"; |
| 84 const char ManifestError::kManifestSpecificKey[] = "manifestSpecific"; |
| 85 |
| 75 ManifestError::ManifestError(const std::string& extension_id, | 86 ManifestError::ManifestError(const std::string& extension_id, |
| 76 const string16& message, | 87 const string16& message, |
| 77 const string16& manifest_key, | 88 const string16& manifest_key, |
| 78 const string16& manifest_specific) | 89 const string16& manifest_specific) |
| 79 : ExtensionError(ExtensionError::MANIFEST_ERROR, | 90 : ExtensionError(ExtensionError::MANIFEST_ERROR, |
| 80 extension_id, | 91 extension_id, |
| 81 false, // extensions can't be installed while incognito. | 92 false, // extensions can't be installed while incognito. |
| 82 logging::LOG_WARNING, // All manifest errors are warnings. | 93 logging::LOG_WARNING, // All manifest errors are warnings. |
| 83 base::FilePath(kManifestFilename).AsUTF16Unsafe(), | 94 base::FilePath(kManifestFilename).AsUTF16Unsafe(), |
| 84 message), | 95 message), |
| 85 manifest_key_(manifest_key), | 96 manifest_key_(manifest_key), |
| 86 manifest_specific_(manifest_specific) { | 97 manifest_specific_(manifest_specific) { |
| 87 } | 98 } |
| 88 | 99 |
| 89 ManifestError::~ManifestError() { | 100 ManifestError::~ManifestError() { |
| 90 } | 101 } |
| 91 | 102 |
| 103 scoped_ptr<DictionaryValue> ManifestError::ToValue() const { |
| 104 scoped_ptr<DictionaryValue> value = ExtensionError::ToValue(); |
| 105 if (!manifest_key_.empty()) |
| 106 value->SetString(kManifestKeyKey, manifest_key_); |
| 107 if (!manifest_specific_.empty()) |
| 108 value->SetString(kManifestSpecificKey, manifest_specific_); |
| 109 return value.Pass(); |
| 110 } |
| 111 |
| 92 std::string ManifestError::PrintForTest() const { | 112 std::string ManifestError::PrintForTest() const { |
| 93 return ExtensionError::PrintForTest() + | 113 return ExtensionError::PrintForTest() + |
| 94 "\n Type: ManifestError"; | 114 "\n Type: ManifestError"; |
| 95 } | 115 } |
| 96 | 116 |
| 97 bool ManifestError::IsEqualImpl(const ExtensionError* rhs) const { | 117 bool ManifestError::IsEqualImpl(const ExtensionError* rhs) const { |
| 98 // If two manifest errors have the same extension id and message (which are | 118 // If two manifest errors have the same extension id and message (which are |
| 99 // both checked in ExtensionError::IsEqual), then they are equal. | 119 // both checked in ExtensionError::IsEqual), then they are equal. |
| 100 return true; | 120 return true; |
| 101 } | 121 } |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 // other systems), the source won't match up with the final entry in the stack | 185 // other systems), the source won't match up with the final entry in the stack |
| 166 // trace. (For instance, in a browser action error, the source is the page - | 186 // trace. (For instance, in a browser action error, the source is the page - |
| 167 // sometimes the background page - but the error is thrown from the script.) | 187 // sometimes the background page - but the error is thrown from the script.) |
| 168 // Make the source match the stack trace, since that is more likely the cause | 188 // Make the source match the stack trace, since that is more likely the cause |
| 169 // of the error. | 189 // of the error. |
| 170 if (!stack_trace_.empty() && source_ != stack_trace_[0].source) | 190 if (!stack_trace_.empty() && source_ != stack_trace_[0].source) |
| 171 source_ = stack_trace_[0].source; | 191 source_ = stack_trace_[0].source; |
| 172 } | 192 } |
| 173 | 193 |
| 174 } // namespace extensions | 194 } // namespace extensions |
| OLD | NEW |