Skip to content

Commit

Permalink
fix: values return from the ctx bridge with dynamic property support …
Browse files Browse the repository at this point in the history
…should themselves support dynamic properties (#27940)

Co-authored-by: Samuel Attard <sattard@slack-corp.com>
  • Loading branch information
VerteDinde and MarshallOfSound committed Mar 1, 2021
1 parent b2636e1 commit 007c960
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 2 deletions.
6 changes: 4 additions & 2 deletions shell/renderer/api/electron_api_context_bridge.cc
Original file line number Diff line number Diff line change
Expand Up @@ -475,13 +475,15 @@ v8::MaybeLocal<v8::Object> CreateProxyForAPI(
v8::Local<v8::Value> setter_proxy;
if (!getter.IsEmpty()) {
if (!PassValueToOtherContext(source_context, destination_context,
getter, object_cache, false, 1)
getter, object_cache,
support_dynamic_properties, 1)
.ToLocal(&getter_proxy))
continue;
}
if (!setter.IsEmpty()) {
if (!PassValueToOtherContext(source_context, destination_context,
setter, object_cache, false, 1)
setter, object_cache,
support_dynamic_properties, 1)
.ToLocal(&setter_proxy))
continue;
}
Expand Down
41 changes: 41 additions & 0 deletions spec-main/api-context-bridge-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1053,6 +1053,24 @@ describe('contextBridge', () => {
expect(result).to.equal('hi there');
});

it('should work with nested getters', async () => {
await makeBindingWindow(() => {
contextBridge.internalContextBridge!.overrideGlobalValueWithDynamicPropsFromIsolatedWorld(['thing'], {
get foo () {
return {
get bar () {
return 'hi there';
}
};
}
});
});
const result = await callWithBindings(async (root: any) => {
return root.thing.foo.bar;
});
expect(result).to.equal('hi there');
});

it('should work with setters', async () => {
await makeBindingWindow(() => {
let a: any = null;
Expand All @@ -1072,6 +1090,29 @@ describe('contextBridge', () => {
expect(result).to.equal(124);
});

it('should work with nested getter / setter combos', async () => {
await makeBindingWindow(() => {
let a: any = null;
contextBridge.internalContextBridge!.overrideGlobalValueWithDynamicPropsFromIsolatedWorld(['thing'], {
get thingy () {
return {
get foo () {
return a;
},
set foo (arg: any) {
a = arg + 1;
}
};
}
});
});
const result = await callWithBindings(async (root: any) => {
root.thing.thingy.foo = 123;
return root.thing.thingy.foo;
});
expect(result).to.equal(124);
});

it('should work with deep properties', async () => {
await makeBindingWindow(() => {
contextBridge.internalContextBridge.overrideGlobalValueWithDynamicPropsFromIsolatedWorld(['thing'], {
Expand Down

0 comments on commit 007c960

Please sign in to comment.