Don't load URL if web contents is destroyed
authorKevin Sawicki <kevinsawicki@gmail.com>
Wed, 21 Dec 2016 00:51:03 +0000 (16:51 -0800)
committerKevin Sawicki <kevinsawicki@gmail.com>
Wed, 28 Dec 2016 21:40:06 +0000 (13:40 -0800)
atom/browser/api/atom_api_web_contents.cc
atom/browser/api/trackable_object.h

index 09c220c6e1cff3da0dffb8a9fffe21eb4040916a..a45e166c92d3e59fb9adf9413b9e80a2dfbca26a 100644 (file)
@@ -439,6 +439,11 @@ content::WebContents* WebContents::OpenURLFromTab(
   if (Emit("will-navigate", params.url))
     return nullptr;
 
+  // Don't load the URL if the web contents was marked as destroyed from a
+  // will-navigate event listener
+  if (IsDestroyed())
+    return nullptr;
+
   return CommonWebContentsDelegate::OpenURLFromTab(source, params);
 }
 
index 3f04783bcd55fe6a5ff4219f6a41270f2a6d4086..7ec54457886955f025fa805edf2c71c41d037406 100644 (file)
@@ -65,6 +65,12 @@ class TrackableObject : public TrackableObjectBase,
     Wrappable<T>::GetWrapper()->SetAlignedPointerInInternalField(0, nullptr);
   }
 
+  bool IsDestroyed() {
+    v8::Local<v8::Object> wrapper = Wrappable<T>::GetWrapper();
+    return wrapper->InternalFieldCount() == 0 ||
+           wrapper->GetAlignedPointerFromInternalField(0) == nullptr;
+  }
+
   // Finds out the TrackableObject from its ID in weak map.
   static T* FromWeakMapID(v8::Isolate* isolate, int32_t id) {
     if (!weak_map_)