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

Side by Side 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: Have conversion methods take a context argument; elaborate error msgs further. Created 7 years 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010 Google Inc. All rights reserved. 2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 20 matching lines...) Expand all
31 #include "V8IDBKeyRange.h" 31 #include "V8IDBKeyRange.h"
32 #include "V8MIDIPort.h" 32 #include "V8MIDIPort.h"
33 #include "V8MediaKeyError.h" 33 #include "V8MediaKeyError.h"
34 #include "V8SpeechRecognitionError.h" 34 #include "V8SpeechRecognitionError.h"
35 #include "V8SpeechRecognitionResult.h" 35 #include "V8SpeechRecognitionResult.h"
36 #include "V8SpeechRecognitionResultList.h" 36 #include "V8SpeechRecognitionResultList.h"
37 #include "V8Storage.h" 37 #include "V8Storage.h"
38 #include "V8VoidCallback.h" 38 #include "V8VoidCallback.h"
39 #include "V8Window.h" 39 #include "V8Window.h"
40 #include "bindings/v8/ArrayValue.h" 40 #include "bindings/v8/ArrayValue.h"
41 #include "bindings/v8/ExceptionMessages.h"
42 #include "bindings/v8/ExceptionState.h"
41 #include "bindings/v8/V8Binding.h" 43 #include "bindings/v8/V8Binding.h"
42 #include "bindings/v8/V8Utilities.h" 44 #include "bindings/v8/V8Utilities.h"
43 #include "bindings/v8/custom/V8ArrayBufferViewCustom.h" 45 #include "bindings/v8/custom/V8ArrayBufferViewCustom.h"
44 #include "bindings/v8/custom/V8Uint8ArrayCustom.h" 46 #include "bindings/v8/custom/V8Uint8ArrayCustom.h"
45 #include "modules/indexeddb/IDBKeyRange.h" 47 #include "modules/indexeddb/IDBKeyRange.h"
46 #include "modules/speech/SpeechRecognitionError.h" 48 #include "modules/speech/SpeechRecognitionError.h"
47 #include "modules/speech/SpeechRecognitionResult.h" 49 #include "modules/speech/SpeechRecognitionResult.h"
48 #include "modules/speech/SpeechRecognitionResultList.h" 50 #include "modules/speech/SpeechRecognitionResultList.h"
49 #include "wtf/MathExtras.h" 51 #include "wtf/MathExtras.h"
50 52
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 return !isUndefinedOrNull() && m_options->IsObject(); 86 return !isUndefinedOrNull() && m_options->IsObject();
85 } 87 }
86 88
87 bool Dictionary::isUndefinedOrNull() const 89 bool Dictionary::isUndefinedOrNull() const
88 { 90 {
89 if (m_options.IsEmpty()) 91 if (m_options.IsEmpty())
90 return true; 92 return true;
91 return WebCore::isUndefinedOrNull(m_options); 93 return WebCore::isUndefinedOrNull(m_options);
92 } 94 }
93 95
96 bool Dictionary::hasProperty(const String& key) const
97 {
98 if (isUndefinedOrNull())
99 return false;
100 v8::Local<v8::Object> options = m_options->ToObject();
101 ASSERT(!options.IsEmpty());
102
103 ASSERT(m_isolate);
104 ASSERT(m_isolate == v8::Isolate::GetCurrent());
105 v8::Handle<v8::String> v8Key = v8String(key, m_isolate);
106 if (!options->Has(v8Key))
107 return false;
108
109 return true;
110 }
111
94 bool Dictionary::getKey(const String& key, v8::Local<v8::Value>& value) const 112 bool Dictionary::getKey(const String& key, v8::Local<v8::Value>& value) const
95 { 113 {
96 if (isUndefinedOrNull()) 114 if (isUndefinedOrNull())
97 return false; 115 return false;
98 v8::Local<v8::Object> options = m_options->ToObject(); 116 v8::Local<v8::Object> options = m_options->ToObject();
99 ASSERT(!options.IsEmpty()); 117 ASSERT(!options.IsEmpty());
100 118
101 ASSERT(m_isolate); 119 ASSERT(m_isolate);
102 ASSERT(m_isolate == v8::Isolate::GetCurrent()); 120 ASSERT(m_isolate == v8::Isolate::GetCurrent());
103 v8::Handle<v8::String> v8Key = v8String(key, m_isolate); 121 v8::Handle<v8::String> v8Key = v8String(key, m_isolate);
(...skipping 16 matching lines...) Expand all
120 if (!getKey(key, v8Value)) 138 if (!getKey(key, v8Value))
121 return false; 139 return false;
122 140
123 v8::Local<v8::Boolean> v8Bool = v8Value->ToBoolean(); 141 v8::Local<v8::Boolean> v8Bool = v8Value->ToBoolean();
124 if (v8Bool.IsEmpty()) 142 if (v8Bool.IsEmpty())
125 return false; 143 return false;
126 value = v8Bool->Value(); 144 value = v8Bool->Value();
127 return true; 145 return true;
128 } 146 }
129 147
148 bool Dictionary::convert(ConversionContext& context, const String& key, bool& va lue) const
149 {
150 ConversionContextScope scope(context);
151 get(key, value);
152 return true;
153 }
154
130 bool Dictionary::get(const String& key, int32_t& value) const 155 bool Dictionary::get(const String& key, int32_t& value) const
131 { 156 {
132 v8::Local<v8::Value> v8Value; 157 v8::Local<v8::Value> v8Value;
133 if (!getKey(key, v8Value)) 158 if (!getKey(key, v8Value))
134 return false; 159 return false;
135 160
136 v8::Local<v8::Int32> v8Int32 = v8Value->ToInt32(); 161 v8::Local<v8::Int32> v8Int32 = v8Value->ToInt32();
137 if (v8Int32.IsEmpty()) 162 if (v8Int32.IsEmpty())
138 return false; 163 return false;
139 value = v8Int32->Value(); 164 value = v8Int32->Value();
140 return true; 165 return true;
141 } 166 }
142 167
143 bool Dictionary::get(const String& key, double& value, bool& hasValue) const 168 bool Dictionary::get(const String& key, double& value, bool& hasValue) const
144 { 169 {
145 v8::Local<v8::Value> v8Value; 170 v8::Local<v8::Value> v8Value;
146 if (!getKey(key, v8Value)) { 171 if (!getKey(key, v8Value)) {
147 hasValue = false; 172 hasValue = false;
148 return false; 173 return false;
149 } 174 }
150 175
151 hasValue = true; 176 hasValue = true;
152 v8::Local<v8::Number> v8Number = v8Value->ToNumber(); 177 V8TRYCATCH_RETURN(v8::Local<v8::Number>, v8Number, v8Value->ToNumber(), fals e);
153 if (v8Number.IsEmpty()) 178 if (v8Number.IsEmpty())
154 return false; 179 return false;
155 value = v8Number->Value(); 180 value = v8Number->Value();
156 return true; 181 return true;
157 } 182 }
158 183
159 bool Dictionary::get(const String& key, double& value) const 184 bool Dictionary::get(const String& key, double& value) const
160 { 185 {
161 bool unused; 186 bool unused;
162 return get(key, value, unused); 187 return get(key, value, unused);
163 } 188 }
164 189
190 bool Dictionary::convert(ConversionContext& context, const String& key, double& value) const
191 {
192 ConversionContextScope scope(context);
193
194 bool hasValue = false;
195 if (!get(key, value, hasValue) && hasValue) {
196 context.throwTypeError(ExceptionMessages::incorrectPropertyType(key, "is not of type 'double'."));
197 return false;
198 }
199 return true;
200 }
201
165 bool Dictionary::get(const String& key, String& value) const 202 bool Dictionary::get(const String& key, String& value) const
166 { 203 {
167 v8::Local<v8::Value> v8Value; 204 v8::Local<v8::Value> v8Value;
168 if (!getKey(key, v8Value)) 205 if (!getKey(key, v8Value))
169 return false; 206 return false;
170 207
171 V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, stringValue, v8Va lue, false); 208 V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, stringValue, v8Va lue, false);
172 value = stringValue; 209 value = stringValue;
173 return true; 210 return true;
174 } 211 }
175 212
213 bool Dictionary::convert(ConversionContext& context, const String& key, String& value) const
214 {
215 ConversionContextScope scope(context);
216
217 v8::Local<v8::Value> v8Value;
218 if (!getKey(key, v8Value))
219 return true;
220
221 V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, stringValue, v8Va lue, false);
222 value = stringValue;
223 return true;
224 }
225
176 bool Dictionary::get(const String& key, ScriptValue& value) const 226 bool Dictionary::get(const String& key, ScriptValue& value) const
177 { 227 {
178 v8::Local<v8::Value> v8Value; 228 v8::Local<v8::Value> v8Value;
179 if (!getKey(key, v8Value)) 229 if (!getKey(key, v8Value))
180 return false; 230 return false;
181 231
182 value = ScriptValue(v8Value, m_isolate); 232 value = ScriptValue(v8Value, m_isolate);
183 return true; 233 return true;
184 } 234 }
185 235
236 bool Dictionary::convert(ConversionContext& context, const String& key, ScriptVa lue& value) const
237 {
238 ConversionContextScope scope(context);
239
240 get(key, value);
241 return true;
242 }
243
186 bool Dictionary::get(const String& key, unsigned short& value) const 244 bool Dictionary::get(const String& key, unsigned short& value) const
187 { 245 {
188 v8::Local<v8::Value> v8Value; 246 v8::Local<v8::Value> v8Value;
189 if (!getKey(key, v8Value)) 247 if (!getKey(key, v8Value))
190 return false; 248 return false;
191 249
192 v8::Local<v8::Int32> v8Int32 = v8Value->ToInt32(); 250 v8::Local<v8::Int32> v8Int32 = v8Value->ToInt32();
193 if (v8Int32.IsEmpty()) 251 if (v8Int32.IsEmpty())
194 return false; 252 return false;
195 value = static_cast<unsigned short>(v8Int32->Value()); 253 value = static_cast<unsigned short>(v8Int32->Value());
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 value = static_cast<unsigned long>(v8Integer->Value()); 292 value = static_cast<unsigned long>(v8Integer->Value());
235 return true; 293 return true;
236 } 294 }
237 295
238 bool Dictionary::get(const String& key, unsigned long long& value) const 296 bool Dictionary::get(const String& key, unsigned long long& value) const
239 { 297 {
240 v8::Local<v8::Value> v8Value; 298 v8::Local<v8::Value> v8Value;
241 if (!getKey(key, v8Value)) 299 if (!getKey(key, v8Value))
242 return false; 300 return false;
243 301
244 v8::Local<v8::Number> v8Number = v8Value->ToNumber(); 302 V8TRYCATCH_RETURN(v8::Local<v8::Number>, v8Number, v8Value->ToNumber(), fals e);
245 if (v8Number.IsEmpty()) 303 if (v8Number.IsEmpty())
246 return false; 304 return false;
247 double d = v8Number->Value(); 305 double d = v8Number->Value();
248 doubleToInteger(d, value); 306 doubleToInteger(d, value);
249 return true; 307 return true;
250 } 308 }
251 309
252 bool Dictionary::get(const String& key, RefPtr<DOMWindow>& value) const 310 bool Dictionary::get(const String& key, RefPtr<DOMWindow>& value) const
253 { 311 {
254 v8::Local<v8::Value> v8Value; 312 v8::Local<v8::Value> v8Value;
(...skipping 28 matching lines...) Expand all
283 { 341 {
284 v8::Local<v8::Value> v8Value; 342 v8::Local<v8::Value> v8Value;
285 if (!getKey(key, v8Value)) 343 if (!getKey(key, v8Value))
286 return false; 344 return false;
287 345
288 ASSERT(m_isolate); 346 ASSERT(m_isolate);
289 ASSERT(m_isolate == v8::Isolate::GetCurrent()); 347 ASSERT(m_isolate == v8::Isolate::GetCurrent());
290 return getMessagePortArray(v8Value, key, value, m_isolate); 348 return getMessagePortArray(v8Value, key, value, m_isolate);
291 } 349 }
292 350
351 bool Dictionary::convert(ConversionContext& context, const String& key, MessageP ortArray& value) const
352 {
353 ConversionContextScope scope(context);
354
355 v8::Local<v8::Value> v8Value;
356 if (!getKey(key, v8Value))
357 return true;
358
359 return get(key, value);
360 }
361
293 bool Dictionary::get(const String& key, HashSet<AtomicString>& value) const 362 bool Dictionary::get(const String& key, HashSet<AtomicString>& value) const
294 { 363 {
295 v8::Local<v8::Value> v8Value; 364 v8::Local<v8::Value> v8Value;
296 if (!getKey(key, v8Value)) 365 if (!getKey(key, v8Value))
297 return false; 366 return false;
298 367
299 // FIXME: Support array-like objects 368 // FIXME: Support array-like objects
300 if (!v8Value->IsArray()) 369 if (!v8Value->IsArray())
301 return false; 370 return false;
302 371
303 ASSERT(m_isolate); 372 ASSERT(m_isolate);
304 ASSERT(m_isolate == v8::Isolate::GetCurrent()); 373 ASSERT(m_isolate == v8::Isolate::GetCurrent());
305 v8::Local<v8::Array> v8Array = v8::Local<v8::Array>::Cast(v8Value); 374 v8::Local<v8::Array> v8Array = v8::Local<v8::Array>::Cast(v8Value);
306 for (size_t i = 0; i < v8Array->Length(); ++i) { 375 for (size_t i = 0; i < v8Array->Length(); ++i) {
307 v8::Local<v8::Value> indexedValue = v8Array->Get(v8::Integer::New(i, m_i solate)); 376 v8::Local<v8::Value> indexedValue = v8Array->Get(v8::Integer::New(i, m_i solate));
308 V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, stringValue, indexedValue, false); 377 V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, stringValue, indexedValue, false);
309 value.add(stringValue); 378 value.add(stringValue);
310 } 379 }
311 380
312 return true; 381 return true;
313 } 382 }
314 383
384 bool Dictionary::convert(ConversionContext& context, const String& key, HashSet< AtomicString>& value) const
385 {
386 ConversionContextScope scope(context);
387
388 v8::Local<v8::Value> v8Value;
389 if (!getKey(key, v8Value))
390 return true;
391
392 if (context.isNullable() && WebCore::isUndefinedOrNull(v8Value))
393 return true;
394
395 if (!v8Value->IsArray()) {
396 context.throwTypeError(ExceptionMessages::notASequenceTypeProperty(key)) ;
397 return false;
398 }
399
400 return get(key, value);
401 }
402
315 bool Dictionary::getWithUndefinedOrNullCheck(const String& key, String& value) c onst 403 bool Dictionary::getWithUndefinedOrNullCheck(const String& key, String& value) c onst
316 { 404 {
317 v8::Local<v8::Value> v8Value; 405 v8::Local<v8::Value> v8Value;
318 if (!getKey(key, v8Value) || v8Value->IsNull() || v8Value->IsUndefined()) 406 if (!getKey(key, v8Value) || WebCore::isUndefinedOrNull(v8Value))
319 return false; 407 return false;
320 408
321 if (WebCore::isUndefinedOrNull(v8Value)) {
322 value = String();
323 return true;
324 }
325
326 V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, stringValue, v8Va lue, false); 409 V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, stringValue, v8Va lue, false);
327 value = stringValue; 410 value = stringValue;
328 return true; 411 return true;
329 } 412 }
330 413
331 bool Dictionary::get(const String& key, RefPtr<Uint8Array>& value) const 414 bool Dictionary::get(const String& key, RefPtr<Uint8Array>& value) const
332 { 415 {
333 v8::Local<v8::Value> v8Value; 416 v8::Local<v8::Value> v8Value;
334 if (!getKey(key, v8Value)) 417 if (!getKey(key, v8Value))
335 return false; 418 return false;
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 560
478 if (v8Value->IsObject()) { 561 if (v8Value->IsObject()) {
479 ASSERT(m_isolate); 562 ASSERT(m_isolate);
480 ASSERT(m_isolate == v8::Isolate::GetCurrent()); 563 ASSERT(m_isolate == v8::Isolate::GetCurrent());
481 value = Dictionary(v8Value, m_isolate); 564 value = Dictionary(v8Value, m_isolate);
482 } 565 }
483 566
484 return true; 567 return true;
485 } 568 }
486 569
570 bool Dictionary::convert(ConversionContext& context, const String& key, Dictiona ry& value) const
571 {
572 ConversionContextScope scope(context);
573
574 v8::Local<v8::Value> v8Value;
575 if (!getKey(key, v8Value))
576 return true;
577
578 if (v8Value->IsObject())
579 return get(key, value);
580
581 if (context.isNullable() && WebCore::isUndefinedOrNull(v8Value))
582 return true;
583
584 context.throwTypeError(ExceptionMessages::incorrectPropertyType(key, "does n ot have a Dictionary type."));
585 return false;
586 }
587
487 bool Dictionary::get(const String& key, Vector<String>& value) const 588 bool Dictionary::get(const String& key, Vector<String>& value) const
488 { 589 {
489 v8::Local<v8::Value> v8Value; 590 v8::Local<v8::Value> v8Value;
490 if (!getKey(key, v8Value)) 591 if (!getKey(key, v8Value))
491 return false; 592 return false;
492 593
493 if (!v8Value->IsArray()) 594 if (!v8Value->IsArray())
494 return false; 595 return false;
495 596
496 v8::Local<v8::Array> v8Array = v8::Local<v8::Array>::Cast(v8Value); 597 v8::Local<v8::Array> v8Array = v8::Local<v8::Array>::Cast(v8Value);
497 for (size_t i = 0; i < v8Array->Length(); ++i) { 598 for (size_t i = 0; i < v8Array->Length(); ++i) {
498 v8::Local<v8::Value> indexedValue = v8Array->Get(v8::Uint32::New(i, m_is olate)); 599 v8::Local<v8::Value> indexedValue = v8Array->Get(v8::Uint32::New(i, m_is olate));
499 V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, stringValue, indexedValue, false); 600 V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, stringValue, indexedValue, false);
500 value.append(stringValue); 601 value.append(stringValue);
501 } 602 }
502 603
503 return true; 604 return true;
504 } 605 }
505 606
607 bool Dictionary::convert(ConversionContext& context, const String& key, Vector<S tring>& value) const
608 {
609 ConversionContextScope scope(context);
610
611 v8::Local<v8::Value> v8Value;
612 if (!getKey(key, v8Value))
613 return true;
614
615 if (context.isNullable() && WebCore::isUndefinedOrNull(v8Value))
616 return true;
617
618 if (!v8Value->IsArray()) {
619 context.throwTypeError(ExceptionMessages::notASequenceTypeProperty(key)) ;
620 return false;
621 }
622
623 return get(key, value);
624 }
625
506 bool Dictionary::get(const String& key, ArrayValue& value) const 626 bool Dictionary::get(const String& key, ArrayValue& value) const
507 { 627 {
508 v8::Local<v8::Value> v8Value; 628 v8::Local<v8::Value> v8Value;
509 if (!getKey(key, v8Value)) 629 if (!getKey(key, v8Value))
510 return false; 630 return false;
511 631
512 if (!v8Value->IsArray()) 632 if (!v8Value->IsArray())
513 return false; 633 return false;
514 634
515 ASSERT(m_isolate); 635 ASSERT(m_isolate);
516 ASSERT(m_isolate == v8::Isolate::GetCurrent()); 636 ASSERT(m_isolate == v8::Isolate::GetCurrent());
517 value = ArrayValue(v8::Local<v8::Array>::Cast(v8Value), m_isolate); 637 value = ArrayValue(v8::Local<v8::Array>::Cast(v8Value), m_isolate);
518 return true; 638 return true;
519 } 639 }
520 640
641 bool Dictionary::convert(ConversionContext& context, const String& key, ArrayVal ue& value) const
642 {
643 ConversionContextScope scope(context);
644
645 v8::Local<v8::Value> v8Value;
646 if (!getKey(key, v8Value))
647 return true;
648
649 if (context.isNullable() && WebCore::isUndefinedOrNull(v8Value))
650 return true;
651
652 if (!v8Value->IsArray()) {
653 context.throwTypeError(ExceptionMessages::notASequenceTypeProperty(key)) ;
654 return false;
655 }
656
657 return get(key, value);
658 }
659
521 bool Dictionary::get(const String& key, RefPtr<DOMError>& value) const 660 bool Dictionary::get(const String& key, RefPtr<DOMError>& value) const
522 { 661 {
523 v8::Local<v8::Value> v8Value; 662 v8::Local<v8::Value> v8Value;
524 if (!getKey(key, v8Value)) 663 if (!getKey(key, v8Value))
525 return false; 664 return false;
526 665
527 DOMError* error = 0; 666 DOMError* error = 0;
528 if (v8Value->IsObject()) { 667 if (v8Value->IsObject()) {
529 v8::Handle<v8::Object> wrapper = v8::Handle<v8::Object>::Cast(v8Value); 668 v8::Handle<v8::Object> wrapper = v8::Handle<v8::Object>::Cast(v8Value);
530 v8::Handle<v8::Object> domError = wrapper->FindInstanceInPrototypeChain( V8DOMError::GetTemplate(m_isolate, worldType(m_isolate))); 669 v8::Handle<v8::Object> domError = wrapper->FindInstanceInPrototypeChain( V8DOMError::GetTemplate(m_isolate, worldType(m_isolate)));
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
591 v8::Local<v8::String> key = properties->Get(i)->ToString(); 730 v8::Local<v8::String> key = properties->Get(i)->ToString();
592 if (!options->Has(key)) 731 if (!options->Has(key))
593 continue; 732 continue;
594 V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, stringKey, ke y, false); 733 V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, stringKey, ke y, false);
595 names.append(stringKey); 734 names.append(stringKey);
596 } 735 }
597 736
598 return true; 737 return true;
599 } 738 }
600 739
740 void Dictionary::ConversionContext::resetPerPropertyContext()
741 {
742 if (m_dirty) {
743 m_dirty = false;
744 m_isNullable = false;
745 m_propertyTypeName = "";
746 m_numberConversion = NormalConversion;
747 }
748 }
749
750 Dictionary::ConversionContext& Dictionary::ConversionContext::withAttributes(boo l isNullable, IntegerConversionConfiguration conversion, const String& typeName)
751 {
752 ASSERT(!m_dirty);
753 m_dirty = true;
754 m_isNullable = isNullable;
755 m_propertyTypeName = typeName;
756 m_numberConversion = conversion;
757
758 return *this;
759 }
760
761 Dictionary::ConversionContext& Dictionary::ConversionContext::withAttributes(boo l isNullable, const String& typeName)
762 {
763 return withAttributes(isNullable, NormalConversion, typeName);
764 }
765
766 Dictionary::ConversionContext& Dictionary::ConversionContext::withAttributes(boo l isNullable, IntegerConversionConfiguration conversion)
767 {
768 return withAttributes(isNullable, conversion, "");
769 }
770
771 Dictionary::ConversionContext& Dictionary::ConversionContext::withAttributes(con st String& typeName)
772 {
773 return withAttributes(false, NormalConversion, typeName);
774 }
775
776 Dictionary::ConversionContext& Dictionary::ConversionContext::withAttributes(boo l isNullable)
777 {
778 return withAttributes(isNullable, NormalConversion, "");
779 }
780
781 void Dictionary::ConversionContext::throwTypeError(const String& detail)
782 {
783 if (forConstructor()) {
784 exceptionState().throwTypeError(ExceptionMessages::failedToConstruct(int erfaceName(), detail));
785 } else {
786 ASSERT(!methodName().isEmpty());
787 exceptionState().throwTypeError(ExceptionMessages::failedToExecute(inter faceName(), methodName(), detail));
788 }
789 }
790
601 } // namespace WebCore 791 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698