@@ -2811,7 +2811,18 @@ TEST_F(ValueSerializerTest, UnsupportedHostObject) {
28112811
28122812class ValueSerializerTestWithHostObject : public ValueSerializerTest {
28132813 protected:
2814- ValueSerializerTestWithHostObject () : serializer_delegate_(this ) {}
2814+ ValueSerializerTestWithHostObject () : serializer_delegate_(this ) {
2815+ ON_CALL (serializer_delegate_, HasCustomHostObject)
2816+ .WillByDefault ([this ](Isolate* isolate) {
2817+ return serializer_delegate_
2818+ .ValueSerializer ::Delegate::HasCustomHostObject (isolate);
2819+ });
2820+ ON_CALL (serializer_delegate_, IsHostObject)
2821+ .WillByDefault ([this ](Isolate* isolate, Local<Object> object) {
2822+ return serializer_delegate_.ValueSerializer ::Delegate::IsHostObject (
2823+ isolate, object);
2824+ });
2825+ }
28152826
28162827 static const uint8_t kExampleHostObjectTag ;
28172828
@@ -2835,6 +2846,9 @@ class ValueSerializerTestWithHostObject : public ValueSerializerTest {
28352846 public:
28362847 explicit SerializerDelegate (ValueSerializerTestWithHostObject* test)
28372848 : test_(test) {}
2849+ MOCK_METHOD (bool , HasCustomHostObject, (Isolate*), (override ));
2850+ MOCK_METHOD (Maybe<bool >, IsHostObject, (Isolate*, Local<Object> object),
2851+ (override ));
28382852 MOCK_METHOD (Maybe<bool >, WriteHostObject, (Isolate*, Local<Object> object),
28392853 (override ));
28402854 void ThrowDataCloneError (Local<String> message) override {
@@ -3052,6 +3066,43 @@ TEST_F(ValueSerializerTestWithHostObject, DecodeSimpleHostObject) {
30523066 });
30533067}
30543068
3069+ TEST_F (ValueSerializerTestWithHostObject,
3070+ RoundTripHostJSObjectWithoutCustomHostObject) {
3071+ EXPECT_CALL (serializer_delegate_, HasCustomHostObject (isolate ()))
3072+ .WillOnce (Invoke ([](Isolate* isolate) { return false ; }));
3073+ RoundTripTest (" ({ a: { my_host_object: true }, get b() { return this.a; }})" );
3074+ }
3075+
3076+ TEST_F (ValueSerializerTestWithHostObject, RoundTripHostJSObject) {
3077+ EXPECT_CALL (serializer_delegate_, HasCustomHostObject (isolate ()))
3078+ .WillOnce (Invoke ([](Isolate* isolate) { return true ; }));
3079+ EXPECT_CALL (serializer_delegate_, IsHostObject (isolate (), _))
3080+ .WillRepeatedly (Invoke ([this ](Isolate* isolate, Local<Object> object) {
3081+ EXPECT_TRUE (object->IsObject ());
3082+ Local<Context> context = isolate->GetCurrentContext ();
3083+ return object->Has (context, StringFromUtf8 (" my_host_object" ));
3084+ }));
3085+ EXPECT_CALL (serializer_delegate_, WriteHostObject (isolate (), _))
3086+ .WillOnce (Invoke ([this ](Isolate*, Local<Object> object) {
3087+ EXPECT_TRUE (object->IsObject ());
3088+ WriteExampleHostObjectTag ();
3089+ return Just (true );
3090+ }));
3091+ EXPECT_CALL (deserializer_delegate_, ReadHostObject (isolate ()))
3092+ .WillOnce (Invoke ([this ](Isolate* isolate) {
3093+ EXPECT_TRUE (ReadExampleHostObjectTag ());
3094+ Local<Context> context = isolate->GetCurrentContext ();
3095+ Local<Object> obj = Object::New (isolate);
3096+ obj->Set (context, StringFromUtf8 (" my_host_object" ), v8::True (isolate))
3097+ .Check ();
3098+ return obj;
3099+ }));
3100+ RoundTripTest (" ({ a: { my_host_object: true }, get b() { return this.a; }})" );
3101+ ExpectScriptTrue (" !('my_host_object' in result)" );
3102+ ExpectScriptTrue (" result.a.my_host_object" );
3103+ ExpectScriptTrue (" result.a === result.b" );
3104+ }
3105+
30553106class ValueSerializerTestWithHostArrayBufferView
30563107 : public ValueSerializerTestWithHostObject {
30573108 protected:
0 commit comments