@@ -2808,7 +2808,18 @@ TEST_F(ValueSerializerTest, UnsupportedHostObject) {
28082808
28092809class ValueSerializerTestWithHostObject : public ValueSerializerTest {
28102810 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+ }
28122823
28132824 static const uint8_t kExampleHostObjectTag ;
28142825
@@ -2832,6 +2843,9 @@ class ValueSerializerTestWithHostObject : public ValueSerializerTest {
28322843 public:
28332844 explicit SerializerDelegate (ValueSerializerTestWithHostObject* test)
28342845 : test_(test) {}
2846+ MOCK_METHOD (bool , HasCustomHostObject, (Isolate*), (override ));
2847+ MOCK_METHOD (Maybe<bool >, IsHostObject, (Isolate*, Local<Object> object),
2848+ (override ));
28352849 MOCK_METHOD (Maybe<bool >, WriteHostObject, (Isolate*, Local<Object> object),
28362850 (override ));
28372851 void ThrowDataCloneError (Local<String> message) override {
@@ -3049,6 +3063,43 @@ TEST_F(ValueSerializerTestWithHostObject, DecodeSimpleHostObject) {
30493063 });
30503064}
30513065
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+
30523103class ValueSerializerTestWithHostArrayBufferView
30533104 : public ValueSerializerTestWithHostObject {
30543105 protected:
0 commit comments