@@ -2808,7 +2808,18 @@ TEST_F(ValueSerializerTest, UnsupportedHostObject) {
2808
2808
2809
2809
class ValueSerializerTestWithHostObject : public ValueSerializerTest {
2810
2810
protected:
2811
- ValueSerializerTestWithHostObject () : serializer_delegate_(this ) {}
2811
+ ValueSerializerTestWithHostObject () : serializer_delegate_(this ) {
2812
+ ON_CALL (serializer_delegate_, HasCustomHostObject)
2813
+ .WillByDefault ([this ](Isolate* isolate) {
2814
+ return serializer_delegate_
2815
+ .ValueSerializer ::Delegate::HasCustomHostObject (isolate);
2816
+ });
2817
+ ON_CALL (serializer_delegate_, IsHostObject)
2818
+ .WillByDefault ([this ](Isolate* isolate, Local<Object> object) {
2819
+ return serializer_delegate_.ValueSerializer ::Delegate::IsHostObject (
2820
+ isolate, object);
2821
+ });
2822
+ }
2812
2823
2813
2824
static const uint8_t kExampleHostObjectTag ;
2814
2825
@@ -2832,6 +2843,9 @@ class ValueSerializerTestWithHostObject : public ValueSerializerTest {
2832
2843
public:
2833
2844
explicit SerializerDelegate (ValueSerializerTestWithHostObject* test)
2834
2845
: test_(test) {}
2846
+ MOCK_METHOD (bool , HasCustomHostObject, (Isolate*), (override ));
2847
+ MOCK_METHOD (Maybe<bool >, IsHostObject, (Isolate*, Local<Object> object),
2848
+ (override ));
2835
2849
MOCK_METHOD (Maybe<bool >, WriteHostObject, (Isolate*, Local<Object> object),
2836
2850
(override ));
2837
2851
void ThrowDataCloneError (Local<String> message) override {
@@ -3049,6 +3063,43 @@ TEST_F(ValueSerializerTestWithHostObject, DecodeSimpleHostObject) {
3049
3063
});
3050
3064
}
3051
3065
3066
+ TEST_F (ValueSerializerTestWithHostObject,
3067
+ RoundTripHostJSObjectWithoutCustomHostObject) {
3068
+ EXPECT_CALL (serializer_delegate_, HasCustomHostObject (isolate ()))
3069
+ .WillOnce (Invoke ([](Isolate* isolate) { return false ; }));
3070
+ RoundTripTest (" ({ a: { my_host_object: true }, get b() { return this.a; }})" );
3071
+ }
3072
+
3073
+ TEST_F (ValueSerializerTestWithHostObject, RoundTripHostJSObject) {
3074
+ EXPECT_CALL (serializer_delegate_, HasCustomHostObject (isolate ()))
3075
+ .WillOnce (Invoke ([](Isolate* isolate) { return true ; }));
3076
+ EXPECT_CALL (serializer_delegate_, IsHostObject (isolate (), _))
3077
+ .WillRepeatedly (Invoke ([this ](Isolate* isolate, Local<Object> object) {
3078
+ EXPECT_TRUE (object->IsObject ());
3079
+ Local<Context> context = isolate->GetCurrentContext ();
3080
+ return object->Has (context, StringFromUtf8 (" my_host_object" ));
3081
+ }));
3082
+ EXPECT_CALL (serializer_delegate_, WriteHostObject (isolate (), _))
3083
+ .WillOnce (Invoke ([this ](Isolate*, Local<Object> object) {
3084
+ EXPECT_TRUE (object->IsObject ());
3085
+ WriteExampleHostObjectTag ();
3086
+ return Just (true );
3087
+ }));
3088
+ EXPECT_CALL (deserializer_delegate_, ReadHostObject (isolate ()))
3089
+ .WillOnce (Invoke ([this ](Isolate* isolate) {
3090
+ EXPECT_TRUE (ReadExampleHostObjectTag ());
3091
+ Local<Context> context = isolate->GetCurrentContext ();
3092
+ Local<Object> obj = Object::New (isolate);
3093
+ obj->Set (context, StringFromUtf8 (" my_host_object" ), v8::True (isolate))
3094
+ .Check ();
3095
+ return obj;
3096
+ }));
3097
+ RoundTripTest (" ({ a: { my_host_object: true }, get b() { return this.a; }})" );
3098
+ ExpectScriptTrue (" !('my_host_object' in result)" );
3099
+ ExpectScriptTrue (" result.a.my_host_object" );
3100
+ ExpectScriptTrue (" result.a === result.b" );
3101
+ }
3102
+
3052
3103
class ValueSerializerTestWithHostArrayBufferView
3053
3104
: public ValueSerializerTestWithHostObject {
3054
3105
protected:
0 commit comments