Browse Source

fix: crash when clicking links with target=_blank from webview (#29949)

Co-authored-by: deepak1556 <[email protected]>
trop[bot] 3 years ago
parent
commit
5a202219b6

+ 12 - 7
shell/browser/web_view_guest_delegate.cc

@@ -105,13 +105,18 @@ content::WebContents* WebViewGuestDelegate::CreateNewGuestWindow(
   guest_params.context = embedder_web_contents_->GetNativeView();
   std::unique_ptr<content::WebContents> guest_contents =
       content::WebContents::Create(guest_params);
-  content::RenderWidgetHost* render_widget_host =
-      guest_contents->GetRenderViewHost()->GetWidget();
-  auto* guest_contents_impl =
-      static_cast<content::WebContentsImpl*>(guest_contents.release());
-  guest_contents_impl->GetView()->CreateViewForWidget(render_widget_host);
-
-  return guest_contents_impl;
+  if (!create_params.opener_suppressed) {
+    auto* guest_contents_impl =
+        static_cast<content::WebContentsImpl*>(guest_contents.release());
+    auto* new_guest_view = guest_contents_impl->GetView();
+    content::RenderWidgetHostView* widget_view =
+        new_guest_view->CreateViewForWidget(
+            guest_contents_impl->GetRenderViewHost()->GetWidget());
+    if (!create_params.initially_hidden)
+      widget_view->Show();
+    return guest_contents_impl;
+  }
+  return guest_contents.release();
 }
 
 }  // namespace electron

+ 9 - 0
spec-main/webview-spec.ts

@@ -488,6 +488,15 @@ describe('<webview> tag', function () {
 
       await webContentsCreated;
     });
+
+    it('does not crash when creating window with noopener', async () => {
+      loadWebView(w.webContents, {
+        allowpopups: 'on',
+        webpreferences: 'nativeWindowOpen=1',
+        src: `file://${path.join(fixtures, 'api', 'native-window-open-noopener.html')}`
+      });
+      await emittedOnce(app, 'browser-window-created');
+    });
   });
 
   describe('webpreferences attribute', () => {

+ 10 - 0
spec/fixtures/api/native-window-open-noopener.html

@@ -0,0 +1,10 @@
+<html>
+<body>
+<a href="blank.html" target="_blank">noopener example</a>
+</body>
+<script type="text/javascript" charset="utf-8">
+window.onload = () => {
+    document.querySelector('a').click()
+}
+</script>
+</html>