@@ -3139,6 +3139,69 @@ TEST_F(ValueSerializerTestWithHostObject, RoundTripHostJSObject) {
3139
3139
ExpectScriptTrue (" result.a === result.b" );
3140
3140
}
3141
3141
3142
+ TEST_F (ValueSerializerTestWithHostObject, RoundTripJSErrorObject) {
3143
+ i::DisableHandleChecksForMockingScope mocking_scope;
3144
+
3145
+ EXPECT_CALL (serializer_delegate_, HasCustomHostObject (isolate ()))
3146
+ .WillOnce (Invoke ([](Isolate* isolate) { return true ; }));
3147
+ EXPECT_CALL (serializer_delegate_, IsHostObject (isolate (), _))
3148
+ .WillRepeatedly (Invoke ([this ](Isolate* isolate, Local<Object> object) {
3149
+ EXPECT_TRUE (object->IsObject ());
3150
+ Local<Context> context = isolate->GetCurrentContext ();
3151
+ return object->Has (context, StringFromUtf8 (" my_host_object" ));
3152
+ }));
3153
+ // Read/Write HostObject methods are not invoked for non-host JSErrors.
3154
+ EXPECT_CALL (serializer_delegate_, WriteHostObject (isolate (), _)).Times (0 );
3155
+ EXPECT_CALL (deserializer_delegate_, ReadHostObject (isolate ())).Times (0 );
3156
+
3157
+ RoundTripTest (
3158
+ " var e = new Error('before serialize');"
3159
+ " ({ a: e, get b() { return this.a; } })" );
3160
+ ExpectScriptTrue (" !('my_host_object' in result)" );
3161
+ ExpectScriptTrue (" !('my_host_object' in result.a)" );
3162
+ ExpectScriptTrue (" result.a.message === 'before serialize'" );
3163
+ ExpectScriptTrue (" result.a instanceof Error" );
3164
+ ExpectScriptTrue (" result.a === result.b" );
3165
+ }
3166
+
3167
+ TEST_F (ValueSerializerTestWithHostObject, RoundTripHostJSErrorObject) {
3168
+ i::DisableHandleChecksForMockingScope mocking_scope;
3169
+
3170
+ EXPECT_CALL (serializer_delegate_, HasCustomHostObject (isolate ()))
3171
+ .WillOnce (Invoke ([](Isolate* isolate) { return true ; }));
3172
+ EXPECT_CALL (serializer_delegate_, IsHostObject (isolate (), _))
3173
+ .WillRepeatedly (Invoke ([this ](Isolate* isolate, Local<Object> object) {
3174
+ EXPECT_TRUE (object->IsObject ());
3175
+ Local<Context> context = isolate->GetCurrentContext ();
3176
+ return object->Has (context, StringFromUtf8 (" my_host_object" ));
3177
+ }));
3178
+ EXPECT_CALL (serializer_delegate_, WriteHostObject (isolate (), _))
3179
+ .WillOnce (Invoke ([this ](Isolate*, Local<Object> object) {
3180
+ EXPECT_TRUE (object->IsObject ());
3181
+ WriteExampleHostObjectTag ();
3182
+ return Just (true );
3183
+ }));
3184
+ EXPECT_CALL (deserializer_delegate_, ReadHostObject (isolate ()))
3185
+ .WillOnce (Invoke ([this ](Isolate* isolate) {
3186
+ EXPECT_TRUE (ReadExampleHostObjectTag ());
3187
+ Local<Context> context = isolate->GetCurrentContext ();
3188
+ Local<Object> obj =
3189
+ v8::Exception::Error (StringFromUtf8 (" deserialized" )).As <Object>();
3190
+ obj->Set (context, StringFromUtf8 (" my_host_object" ), v8::True (isolate))
3191
+ .Check ();
3192
+ return obj;
3193
+ }));
3194
+ RoundTripTest (
3195
+ " var e = new Error('before serialize');"
3196
+ " e.my_host_object = true;"
3197
+ " ({ a: e, get b() { return this.a; } })" );
3198
+ ExpectScriptTrue (" !('my_host_object' in result)" );
3199
+ ExpectScriptTrue (" result.a.my_host_object" );
3200
+ ExpectScriptTrue (" result.a.message === 'deserialized'" );
3201
+ ExpectScriptTrue (" result.a instanceof Error" );
3202
+ ExpectScriptTrue (" result.a === result.b" );
3203
+ }
3204
+
3142
3205
class ValueSerializerTestWithHostArrayBufferView
3143
3206
: public ValueSerializerTestWithHostObject {
3144
3207
protected:
0 commit comments