| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent da6e8cb commit d289b1d
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -38,7 +38,7 @@ | |||
| 38 | 38 | ||
| 39 | 39 | # Reset this number to 0 on major V8 upgrades. | |
| 40 | 40 | # Increment by one for each non-official patch applied to deps/v8. | |
| 41 | - 'v8_embedder_string': '-node.32', | ||
| 41 | + 'v8_embedder_string': '-node.33', | ||
| 42 | 42 | ||
| 43 | 43 | ##### V8 defaults for Node.js ##### | |
| 44 | 44 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -643,8 +643,17 @@ Maybe<bool> ValueSerializer::WriteJSReceiver(Handle<JSReceiver> receiver) { | |||
| 643 | 643 | case JS_DATA_VIEW_TYPE: | |
| 644 | 644 | case JS_RAB_GSAB_DATA_VIEW_TYPE: | |
| 645 | 645 | return WriteJSArrayBufferView(JSArrayBufferView::cast(*receiver)); | |
| 646 | - case JS_ERROR_TYPE: | ||
| 647 | - return WriteJSError(Handle<JSObject>::cast(receiver)); | ||
| 646 | + case JS_ERROR_TYPE: { | ||
| 647 | + Handle<JSObject> js_error = Handle<JSObject>::cast(receiver); | ||
| 648 | + Maybe<bool> is_host_object = IsHostObject(js_error); | ||
| 649 | + if (is_host_object.IsNothing()) { | ||
| 650 | + return is_host_object; | ||
| 651 | + } | ||
| 652 | + if (is_host_object.FromJust()) { | ||
| 653 | + return WriteHostObject(js_error); | ||
| 654 | + } | ||
| 655 | + return WriteJSError(js_error); | ||
| 656 | + } | ||
| 648 | 657 | case JS_SHARED_ARRAY_TYPE: | |
| 649 | 658 | return WriteJSSharedArray(Handle<JSSharedArray>::cast(receiver)); | |
| 650 | 659 | case JS_SHARED_STRUCT_TYPE: | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -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: | |
| Back | FazBrowse Home | New Git URL |
0 commit comments