Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(401)

Unified Diff: Source/bindings/v8/Dictionary.cpp

Issue 85263002: Improve handling of dictionary conversions. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/bindings/v8/Dictionary.cpp
diff --git a/Source/bindings/v8/Dictionary.cpp b/Source/bindings/v8/Dictionary.cpp
index 9b1050c389a5c5d881233bc7e43057fd3d084bbc..998a9ccf85783cdecb1472e56ea839fcd47bf8d8 100644
--- a/Source/bindings/v8/Dictionary.cpp
+++ b/Source/bindings/v8/Dictionary.cpp
@@ -91,6 +91,22 @@ bool Dictionary::isUndefinedOrNull() const
return WebCore::isUndefinedOrNull(m_options);
}
+bool Dictionary::hasProperty(const String& key) const
+{
+ if (isUndefinedOrNull())
+ return false;
+ v8::Local<v8::Object> options = m_options->ToObject();
+ ASSERT(!options.IsEmpty());
+
+ ASSERT(m_isolate);
+ ASSERT(m_isolate == v8::Isolate::GetCurrent());
+ v8::Handle<v8::String> v8Key = v8String(key, m_isolate);
+ if (!options->Has(v8Key))
+ return false;
+
+ return true;
+}
+
bool Dictionary::getKey(const String& key, v8::Local<v8::Value>& value) const
{
if (isUndefinedOrNull())
@@ -127,6 +143,12 @@ bool Dictionary::get(const String& key, bool& value) const
return true;
}
+bool Dictionary::convert(const String& key, bool& value, ExceptionState&) const
+{
+ get(key, value);
+ return true;
+}
+
bool Dictionary::get(const String& key, int32_t& value) const
{
v8::Local<v8::Value> v8Value;
@@ -149,7 +171,7 @@ bool Dictionary::get(const String& key, double& value, bool& hasValue) const
}
hasValue = true;
- v8::Local<v8::Number> v8Number = v8Value->ToNumber();
+ V8TRYCATCH_RETURN(v8::Local<v8::Number>, v8Number, v8Value->ToNumber(), false);
if (v8Number.IsEmpty())
return false;
value = v8Number->Value();
@@ -162,6 +184,16 @@ bool Dictionary::get(const String& key, double& value) const
return get(key, value, unused);
}
+bool Dictionary::convert(const String& key, double& value, ExceptionState& exceptionState) const
+{
+ bool hasValue = false;
+ if (!get(key, value, hasValue) && hasValue) {
+ exceptionState.throwTypeError(ExceptionMessages::illTypedProperty(key, "is not of type 'double'."));
Mike West 2013/11/25 08:22:48 So, as I noted in an earlier comment, I'd like to
sof 2013/11/25 11:57:23 I like the suggestion, we should do it. I'm reason
sof 2013/11/25 23:24:05 Done.
+ return false;
+ }
+ return true;
+}
+
bool Dictionary::get(const String& key, String& value) const
{
v8::Local<v8::Value> v8Value;
@@ -173,6 +205,17 @@ bool Dictionary::get(const String& key, String& value) const
return true;
}
+bool Dictionary::convert(const String& key, String& value, ExceptionState& exceptionState) const
+{
+ v8::Local<v8::Value> v8Value;
+ if (!getKey(key, v8Value))
+ return true;
+
+ V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, stringValue, v8Value, false);
+ value = stringValue;
+ return true;
+}
+
bool Dictionary::get(const String& key, ScriptValue& value) const
{
v8::Local<v8::Value> v8Value;
@@ -183,6 +226,12 @@ bool Dictionary::get(const String& key, ScriptValue& value) const
return true;
}
+bool Dictionary::convert(const String& key, ScriptValue& value, ExceptionState&) const
+{
+ get(key, value);
+ return true;
+}
+
bool Dictionary::get(const String& key, unsigned short& value) const
{
v8::Local<v8::Value> v8Value;
@@ -241,7 +290,7 @@ bool Dictionary::get(const String& key, unsigned long long& value) const
if (!getKey(key, v8Value))
return false;
- v8::Local<v8::Number> v8Number = v8Value->ToNumber();
+ V8TRYCATCH_RETURN(v8::Local<v8::Number>, v8Number, v8Value->ToNumber(), false);
if (v8Number.IsEmpty())
return false;
double d = v8Number->Value();
@@ -290,6 +339,15 @@ bool Dictionary::get(const String& key, MessagePortArray& value) const
return getMessagePortArray(v8Value, key, value, m_isolate);
}
+bool Dictionary::convert(const String& key, const String&, bool isNullable, MessagePortArray& value, ExceptionState& exceptionState) const
+{
+ v8::Local<v8::Value> v8Value;
+ if (!getKey(key, v8Value))
+ return true;
+
+ return get(key, value);
+}
+
bool Dictionary::get(const String& key, HashSet<AtomicString>& value) const
{
v8::Local<v8::Value> v8Value;
@@ -312,17 +370,29 @@ bool Dictionary::get(const String& key, HashSet<AtomicString>& value) const
return true;
}
-bool Dictionary::getWithUndefinedOrNullCheck(const String& key, String& value) const
+bool Dictionary::convert(const String& key, const String&, bool isNullable, HashSet<AtomicString>& value, ExceptionState& exceptionState) const
{
v8::Local<v8::Value> v8Value;
- if (!getKey(key, v8Value) || v8Value->IsNull() || v8Value->IsUndefined())
- return false;
+ if (!getKey(key, v8Value))
+ return true;
- if (WebCore::isUndefinedOrNull(v8Value)) {
- value = String();
+ if (isNullable && WebCore::isUndefinedOrNull(v8Value))
return true;
+
+ if (!v8Value->IsArray()) {
+ exceptionState.throwTypeError(ExceptionMessages::notASequenceTypeProperty(key));
+ return false;
}
+ return get(key, value);
+}
+
+bool Dictionary::getWithUndefinedOrNullCheck(const String& key, String& value) const
+{
+ v8::Local<v8::Value> v8Value;
+ if (!getKey(key, v8Value) || WebCore::isUndefinedOrNull(v8Value))
+ return false;
+
V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, stringValue, v8Value, false);
value = stringValue;
return true;
@@ -484,6 +554,22 @@ bool Dictionary::get(const String& key, Dictionary& value) const
return true;
}
+bool Dictionary::convert(const String& key, const String&, bool isNullable, Dictionary& value, ExceptionState& exceptionState) const
+{
+ v8::Local<v8::Value> v8Value;
+ if (!getKey(key, v8Value))
+ return true;
+
+ if (v8Value->IsObject())
+ return get(key, value);
+
+ if (isNullable && WebCore::isUndefinedOrNull(v8Value))
+ return true;
+
+ exceptionState.throwTypeError(ExceptionMessages::illTypedProperty(key, "does not have a Dictionary type."));
+ return false;
+}
+
bool Dictionary::get(const String& key, Vector<String>& value) const
{
v8::Local<v8::Value> v8Value;
@@ -503,6 +589,23 @@ bool Dictionary::get(const String& key, Vector<String>& value) const
return true;
}
+bool Dictionary::convert(const String& key, const String&, bool isNullable, Vector<String>& value, ExceptionState& exceptionState) const
+{
+ v8::Local<v8::Value> v8Value;
+ if (!getKey(key, v8Value))
+ return true;
+
+ if (isNullable && WebCore::isUndefinedOrNull(v8Value))
+ return true;
+
+ if (!v8Value->IsArray()) {
+ exceptionState.throwTypeError(ExceptionMessages::notASequenceTypeProperty(key));
+ return false;
+ }
+
+ return get(key, value);
+}
+
bool Dictionary::get(const String& key, ArrayValue& value) const
{
v8::Local<v8::Value> v8Value;
@@ -518,6 +621,23 @@ bool Dictionary::get(const String& key, ArrayValue& value) const
return true;
}
+bool Dictionary::convert(const String& key, const String&, bool isNullable, ArrayValue& value, ExceptionState& exceptionState) const
+{
+ v8::Local<v8::Value> v8Value;
+ if (!getKey(key, v8Value))
+ return true;
+
+ if (isNullable && WebCore::isUndefinedOrNull(v8Value))
+ return true;
+
+ if (!v8Value->IsArray()) {
+ exceptionState.throwTypeError(ExceptionMessages::notASequenceTypeProperty(key));
+ return false;
+ }
+
+ return get(key, value);
+}
+
bool Dictionary::get(const String& key, RefPtr<DOMError>& value) const
{
v8::Local<v8::Value> v8Value;

Powered by Google App Engine
This is Rietveld 408576698