Browse Source

refactor: use native WeakRef instead of v8util.weaklyTrackValue() (#31165)

Co-authored-by: Milan Burda <[email protected]>
trop[bot] 3 years ago
parent
commit
4a495542cb

+ 0 - 26
shell/common/api/electron_api_v8_util.cc

@@ -106,28 +106,6 @@ bool IsSameOrigin(const GURL& l, const GURL& r) {
   return url::Origin::Create(l).IsSameOriginWith(url::Origin::Create(r));
 }
 
-#if DCHECK_IS_ON()
-std::vector<v8::Global<v8::Value>> weakly_tracked_values;
-
-void WeaklyTrackValue(v8::Isolate* isolate, v8::Local<v8::Value> value) {
-  v8::Global<v8::Value> global_value(isolate, value);
-  global_value.SetWeak();
-  weakly_tracked_values.push_back(std::move(global_value));
-}
-
-void ClearWeaklyTrackedValues() {
-  weakly_tracked_values.clear();
-}
-
-std::vector<v8::Local<v8::Value>> GetWeaklyTrackedValues(v8::Isolate* isolate) {
-  std::vector<v8::Local<v8::Value>> locals;
-  for (const auto& value : weakly_tracked_values) {
-    if (!value.IsEmpty())
-      locals.push_back(value.Get(isolate));
-  }
-  return locals;
-}
-
 // This causes a fatal error by creating a circular extension dependency.
 void TriggerFatalErrorForTesting(v8::Isolate* isolate) {
   static const char* aDeps[] = {"B"};
@@ -141,7 +119,6 @@ void TriggerFatalErrorForTesting(v8::Isolate* isolate) {
 void RunUntilIdle() {
   base::RunLoop().RunUntilIdle();
 }
-#endif
 
 void Initialize(v8::Local<v8::Object> exports,
                 v8::Local<v8::Value> unused,
@@ -158,9 +135,6 @@ void Initialize(v8::Local<v8::Object> exports,
   dict.SetMethod("isSameOrigin", &IsSameOrigin);
 #if DCHECK_IS_ON()
   dict.SetMethod("triggerFatalErrorForTesting", &TriggerFatalErrorForTesting);
-  dict.SetMethod("getWeaklyTrackedValues", &GetWeaklyTrackedValues);
-  dict.SetMethod("clearWeaklyTrackedValues", &ClearWeaklyTrackedValues);
-  dict.SetMethod("weaklyTrackValue", &WeaklyTrackValue);
   dict.SetMethod("runUntilIdle", &RunUntilIdle);
 #endif
 }

+ 6 - 6
spec-main/api-context-bridge-spec.ts

@@ -615,11 +615,11 @@ describe('contextBridge', () => {
       if (!useSandbox) {
         it('should release the global hold on methods sent across contexts', async () => {
           await makeBindingWindow(() => {
-            require('electron').ipcRenderer.on('get-gc-info', (e: Electron.IpcRendererEvent) => e.sender.send('gc-info', { trackedValues: process._linkedBinding('electron_common_v8_util').getWeaklyTrackedValues().length }));
-            const { weaklyTrackValue } = process._linkedBinding('electron_common_v8_util');
+            const trackedValues: WeakRef<object>[] = [];
+            require('electron').ipcRenderer.on('get-gc-info', e => e.sender.send('gc-info', { trackedValues: trackedValues.filter(value => value.deref()).length }));
             contextBridge.exposeInMainWorld('example', {
               getFunction: () => () => 123,
-              track: weaklyTrackValue
+              track: (value: object) => { trackedValues.push(new WeakRef(value)); }
             });
           });
           await callWithBindings(async (root: any) => {
@@ -643,11 +643,11 @@ describe('contextBridge', () => {
       if (useSandbox) {
         it('should not leak the global hold on methods sent across contexts when reloading a sandboxed renderer', async () => {
           await makeBindingWindow(() => {
-            require('electron').ipcRenderer.on('get-gc-info', e => e.sender.send('gc-info', { trackedValues: process._linkedBinding('electron_common_v8_util').getWeaklyTrackedValues().length }));
-            const { weaklyTrackValue } = process._linkedBinding('electron_common_v8_util');
+            const trackedValues: WeakRef<object>[] = [];
+            require('electron').ipcRenderer.on('get-gc-info', e => e.sender.send('gc-info', { trackedValues: trackedValues.filter(value => value.deref()).length }));
             contextBridge.exposeInMainWorld('example', {
               getFunction: () => () => 123,
-              track: weaklyTrackValue
+              track: (value: object) => { trackedValues.push(new WeakRef(value)); }
             });
             require('electron').ipcRenderer.send('window-ready-for-tasking');
           });

+ 0 - 3
typings/internal-ambient.d.ts

@@ -45,9 +45,6 @@ declare namespace NodeJS {
     setHiddenValue<T>(obj: any, key: string, value: T): void;
     deleteHiddenValue(obj: any, key: string): void;
     requestGarbageCollectionForTesting(): void;
-    weaklyTrackValue(value: any): void;
-    clearWeaklyTrackedValues(): void;
-    getWeaklyTrackedValues(): any[];
     runUntilIdle(): void;
     isSameOrigin(a: string, b: string): boolean;
     triggerFatalErrorForTesting(): void;