@@ -75,23 +75,62 @@ namespace CefSharp
75
75
76
76
IBrowser^ ClientAdapter::GetBrowserWrapper(int browserId, bool isPopup)
77
77
{
78
+ if (!isPopup)
79
+ {
80
+ return _browser;
81
+ }
82
+
83
+ IBrowser^ popupBrowser;
84
+ if (_popupBrowsers->TryGetValue (browserId, popupBrowser))
85
+ {
86
+ return popupBrowser;
87
+ }
88
+
89
+ // For popups that were hosted using a ChromiumWebBrowser instance
78
90
if (_browserControl->HasParent )
79
91
{
80
92
return _browser;
81
93
}
82
94
83
- if (isPopup)
95
+ return nullptr ;
96
+ }
97
+
98
+ // Is a main browser if isPopuo == false or the IBrowser instance is directly associated
99
+ // with the ChromiumWebBrowser instance. Should be true in cases
100
+ // where ChromiumWebBrowser is instanciated directly or
101
+ // when a popup is hosted in a ChromiumWebBrowser instance
102
+ // For popups hosted in ChromiumWebBrowser instances it's important
103
+ // that DevTools popups return false;
104
+ bool ClientAdapter::IsMainBrowser (bool isPopup, int browserId)
105
+ {
106
+ // Main browser is always true
107
+ if (!isPopup)
84
108
{
85
- IBrowser^ popupBrowser;
86
- if (_popupBrowsers->TryGetValue (browserId, popupBrowser))
87
- {
88
- return popupBrowser;
89
- }
109
+ return true ;
110
+ }
90
111
91
- return nullptr ;
112
+ // If popup and HasParent == false then always false
113
+ if (!_browserControl->HasParent )
114
+ {
115
+ return false ;
92
116
}
93
117
94
- return _browser;
118
+ // This method is called from OnAfterCreated before _cefBrowser is set
119
+ // If the _cefBrowser reference is null then this should be a ChromiumWebBrowser
120
+ // hosted as a popup
121
+ if (!_cefBrowser.get ())
122
+ {
123
+ return true ;
124
+ }
125
+
126
+ // For popups hosted in ChromiumWebBrowser instance directly (non DevTools popup)
127
+ // then return true;
128
+ if (_cefBrowser->GetIdentifier () == browserId)
129
+ {
130
+ return true ;
131
+ }
132
+
133
+ return false ;
95
134
}
96
135
97
136
void ClientAdapter::CloseAllPopups (bool forceClose)
@@ -180,14 +219,7 @@ namespace CefSharp
180
219
181
220
auto browserWrapper = gcnew CefBrowserWrapper (browser);
182
221
183
- auto isPopup = browser->IsPopup () && !_browserControl->HasParent ;
184
-
185
- if (isPopup)
186
- {
187
- // Add to the list of popup browsers.
188
- _popupBrowsers->Add (browser->GetIdentifier (), browserWrapper);
189
- }
190
- else
222
+ if (IsMainBrowser (browser->IsPopup (), browser->GetIdentifier ()))
191
223
{
192
224
_browserHwnd = browser->GetHost ()->GetWindowHandle ();
193
225
_cefBrowser = browser;
@@ -199,6 +231,11 @@ namespace CefSharp
199
231
_browserAdapter->OnAfterBrowserCreated (browserWrapper);
200
232
}
201
233
}
234
+ else
235
+ {
236
+ // Add to the list of popup browsers.
237
+ _popupBrowsers->Add (browser->GetIdentifier (), browserWrapper);
238
+ }
202
239
203
240
auto handler = _browserControl->LifeSpanHandler ;
204
241
@@ -227,7 +264,6 @@ namespace CefSharp
227
264
228
265
void ClientAdapter::OnBeforeClose (CefRefPtr<CefBrowser> browser)
229
266
{
230
- auto isPopup = browser->IsPopup () && !_browserControl->HasParent ;
231
267
auto handler = _browserControl->LifeSpanHandler ;
232
268
233
269
if (handler != nullptr )
@@ -240,20 +276,18 @@ namespace CefSharp
240
276
handler->OnBeforeClose (_browserControl, %browserWrapper);
241
277
}
242
278
243
- if (isPopup)
279
+ if (IsMainBrowser (browser->IsPopup (), browser->GetIdentifier ()))
280
+ {
281
+ _cefBrowser = nullptr ;
282
+ }
283
+ else
244
284
{
245
285
// Remove from the browser popup list.
246
286
auto browserWrapper = GetBrowserWrapper (browser->GetIdentifier (), true );
247
287
_popupBrowsers->Remove (browser->GetIdentifier ());
248
288
// Dispose the CefBrowserWrapper
249
289
delete browserWrapper;
250
290
}
251
- // TODO: When creating a new ChromiumWebBrowser and passing in a newBrowser to OnBeforePopup
252
- // the handles don't match up (at least in WPF), need to investigate further.
253
- else if (_browserHwnd == browser->GetHost ()->GetWindowHandle () || _browserControl->HasParent )
254
- {
255
- _cefBrowser = nullptr ;
256
- }
257
291
258
292
BrowserRefCounter::Instance->Decrement (_browserControl->GetType ());
259
293
}
@@ -263,7 +297,7 @@ namespace CefSharp
263
297
auto browserWrapper = GetBrowserWrapper (browser->GetIdentifier (), browser->IsPopup ());
264
298
auto args = gcnew LoadingStateChangedEventArgs (browserWrapper, canGoBack, canGoForward, isLoading);
265
299
266
- if (! browser->IsPopup () || _browserControl-> HasParent )
300
+ if (IsMainBrowser ( browser->IsPopup (), browser-> GetIdentifier ()) )
267
301
{
268
302
_browserControl->SetLoadingStateChange (args);
269
303
}
@@ -281,7 +315,7 @@ namespace CefSharp
281
315
auto browserWrapper = GetBrowserWrapper (browser->GetIdentifier (), browser->IsPopup ());
282
316
auto args = gcnew AddressChangedEventArgs (browserWrapper, StringUtils::ToClr (address));
283
317
284
- if (! browser->IsPopup () || _browserControl-> HasParent )
318
+ if (IsMainBrowser ( browser->IsPopup (), browser-> GetIdentifier ()) )
285
319
{
286
320
_browserControl->SetAddress (args);
287
321
}
@@ -354,15 +388,15 @@ namespace CefSharp
354
388
auto browserWrapper = GetBrowserWrapper (browser->GetIdentifier (), browser->IsPopup ());
355
389
auto args = gcnew TitleChangedEventArgs (browserWrapper, StringUtils::ToClr (title));
356
390
357
- if (browser->IsPopup () && !_browserControl-> HasParent )
391
+ if (IsMainBrowser ( browser->IsPopup (), browser-> GetIdentifier ()) )
358
392
{
359
- // Set the popup window title
360
- auto hwnd = browser->GetHost ()->GetWindowHandle ();
361
- SetWindowText (hwnd, std::wstring (title).c_str ());
393
+ _browserControl->SetTitle (args);
362
394
}
363
395
else
364
396
{
365
- _browserControl->SetTitle (args);
397
+ // Set the popup window title
398
+ auto hwnd = browser->GetHost ()->GetWindowHandle ();
399
+ SetWindowText (hwnd, std::wstring (title).c_str ());
366
400
}
367
401
368
402
auto handler = _browserControl->DisplayHandler ;
@@ -426,7 +460,7 @@ namespace CefSharp
426
460
returnFlag = handler->OnTooltipChanged (_browserControl, tooltip);
427
461
}
428
462
429
- if (! browser->IsPopup () || _browserControl-> HasParent )
463
+ if (IsMainBrowser ( browser->IsPopup (), browser-> GetIdentifier ()) )
430
464
{
431
465
_tooltip = tooltip;
432
466
_browserControl->SetTooltipText (_tooltip);
@@ -442,7 +476,7 @@ namespace CefSharp
442
476
443
477
auto args = gcnew ConsoleMessageEventArgs (browserWrapper, (LogSeverity)level, StringUtils::ToClr (message), StringUtils::ToClr (source), line);
444
478
445
- if (! browser->IsPopup () || _browserControl-> HasParent )
479
+ if (IsMainBrowser ( browser->IsPopup (), browser-> GetIdentifier ()) )
446
480
{
447
481
_browserControl->OnConsoleMessage (args);
448
482
}
@@ -461,7 +495,7 @@ namespace CefSharp
461
495
auto browserWrapper = GetBrowserWrapper (browser->GetIdentifier (), browser->IsPopup ());
462
496
auto args = gcnew StatusMessageEventArgs (browserWrapper, StringUtils::ToClr (value));
463
497
464
- if (! browser->IsPopup () || _browserControl-> HasParent )
498
+ if (IsMainBrowser ( browser->IsPopup (), browser-> GetIdentifier ()) )
465
499
{
466
500
_browserControl->OnStatusMessage (args);
467
501
}
@@ -512,7 +546,7 @@ namespace CefSharp
512
546
auto browserWrapper = GetBrowserWrapper (browser->GetIdentifier (), browser->IsPopup ());
513
547
CefFrameWrapper frameWrapper (frame);
514
548
515
- if (! browser->IsPopup () || _browserControl-> HasParent )
549
+ if (IsMainBrowser ( browser->IsPopup (), browser-> GetIdentifier ()) )
516
550
{
517
551
_browserControl->OnFrameLoadStart (gcnew FrameLoadStartEventArgs (browserWrapper, %frameWrapper, (CefSharp::TransitionType)transitionType));
518
552
}
@@ -529,7 +563,7 @@ namespace CefSharp
529
563
auto browserWrapper = GetBrowserWrapper (browser->GetIdentifier (), browser->IsPopup ());
530
564
CefFrameWrapper frameWrapper (frame);
531
565
532
- if (! browser->IsPopup () || _browserControl-> HasParent )
566
+ if (IsMainBrowser ( browser->IsPopup (), browser-> GetIdentifier ()) )
533
567
{
534
568
_browserControl->OnFrameLoadEnd (gcnew FrameLoadEndEventArgs (browserWrapper, %frameWrapper, httpStatusCode));
535
569
}
@@ -547,7 +581,7 @@ namespace CefSharp
547
581
auto browserWrapper = GetBrowserWrapper (browser->GetIdentifier (), browser->IsPopup ());
548
582
CefFrameWrapper frameWrapper (frame);
549
583
550
- if (! browser->IsPopup () || _browserControl-> HasParent )
584
+ if (IsMainBrowser ( browser->IsPopup (), browser-> GetIdentifier ()) )
551
585
{
552
586
_browserControl->OnLoadError (gcnew LoadErrorEventArgs (browserWrapper, %frameWrapper,
553
587
(CefErrorCode)errorCode, StringUtils::ToClr (errorText), StringUtils::ToClr (failedUrl)));
@@ -1117,7 +1151,18 @@ namespace CefSharp
1117
1151
auto browserWrapper = GetBrowserWrapper (browser->GetIdentifier (), browser->IsPopup ());
1118
1152
auto frameWrapper = gcnew CefFrameWrapper (frame);
1119
1153
1120
- handler->OnFrameCreated (_browserControl, browserWrapper, frameWrapper);
1154
+ if (browserWrapper == nullptr )
1155
+ {
1156
+ // Very first OnFrameCreated called may happen before OnAfterCreated
1157
+ // so we have to create a new wrapper that's lifespan is scoped to this single call.
1158
+ CefBrowserWrapper browserWrapper (browser);
1159
+
1160
+ handler->OnFrameCreated (_browserControl, %browserWrapper, frameWrapper);
1161
+ }
1162
+ else
1163
+ {
1164
+ handler->OnFrameCreated (_browserControl, browserWrapper, frameWrapper);
1165
+ }
1121
1166
}
1122
1167
}
1123
1168
0 commit comments