Skip to content

Commit 4ade0b8

Browse files
committed
Core - ResourceRequestHandler now passes a long lived instance of IBrowser
- The methods in CefResourceRequestHandlerAdapter previously passed on a scoped instance of IBrowser which would have been disposed when the method was executed. This made it very difficult to use the callback in OnBeforeResourceLoad so now we check to see if we already have an IBrowser instance with the matching Id and only use a scoped instance if we don't have a match.
1 parent 0efd241 commit 4ade0b8

File tree

1 file changed

+104
-15
lines changed

1 file changed

+104
-15
lines changed

CefSharp.Core.Runtime/Internals/CefResourceRequestHandlerAdapter.h

Lines changed: 104 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,22 @@ namespace CefSharp
5353
//For ServiceWorker browser and frame will be null
5454
if (browser.get() && frame.get())
5555
{
56-
CefBrowserWrapper browserWrapper(browser);
56+
IBrowser^ existingBrowserWrapper;
5757
CefFrameWrapper frameWrapper(frame);
5858

59-
accessFilter = _handler->GetCookieAccessFilter(_browserControl, %browserWrapper, %frameWrapper, %requestWrapper);
59+
// If we already have an IBrowser instance then use it, otherwise we'll pass in a scoped instance
60+
// which cannot be accessed outside the scope of the method. We should under normal circumstanaces
61+
// have a IBrowser reference already ready to use.
62+
if (_browserControl->TryGetBrowserCoreById(browser->GetIdentifier(), existingBrowserWrapper))
63+
{
64+
accessFilter = _handler->GetCookieAccessFilter(_browserControl, existingBrowserWrapper, %frameWrapper, %requestWrapper);
65+
}
66+
else
67+
{
68+
CefBrowserWrapper browserWrapper(browser);
69+
70+
accessFilter = _handler->GetCookieAccessFilter(_browserControl, %browserWrapper, %frameWrapper, %requestWrapper);
71+
}
6072
}
6173
else
6274
{
@@ -76,14 +88,23 @@ namespace CefSharp
7688
//For ServiceWorker browser and frame will be null
7789
if (browser.get() && frame.get())
7890
{
79-
//TODO: We previously used GetBrowserWrapper - investigate passing in reference to this adapter
80-
CefBrowserWrapper browserWrapper(browser);
91+
IBrowser^ existingBrowserWrapper;
8192
//We pass the frame and request wrappers to CefRequestCallbackWrapper so they can be disposed of
8293
//when the callback is executed
8394
auto frameWrapper = gcnew CefFrameWrapper(frame);
8495
auto requestWrapper = gcnew Request(request);
8596
auto requestCallback = gcnew CefRequestCallbackWrapper(callback, frameWrapper, requestWrapper);
8697

98+
// If we already have an IBrowser instance then use it, otherwise we'll pass in a scoped instance
99+
// which cannot be accessed outside the scope of the method. We should under normal circumstanaces
100+
// have a IBrowser reference already ready to use.
101+
if (_browserControl->TryGetBrowserCoreById(browser->GetIdentifier(), existingBrowserWrapper))
102+
{
103+
return (cef_return_value_t)_handler->OnBeforeResourceLoad(_browserControl, existingBrowserWrapper, frameWrapper, requestWrapper, requestCallback);
104+
}
105+
106+
CefBrowserWrapper browserWrapper(browser);
107+
87108
return (cef_return_value_t)_handler->OnBeforeResourceLoad(_browserControl, %browserWrapper, frameWrapper, requestWrapper, requestCallback);
88109
}
89110

@@ -101,10 +122,22 @@ namespace CefSharp
101122
//For ServiceWorker browser and frame will be null
102123
if (browser.get() && frame.get())
103124
{
104-
CefBrowserWrapper browserWrapper(browser);
125+
IBrowser^ existingBrowserWrapper;
105126
CefFrameWrapper frameWrapper(frame);
106127

107-
resourceHandler = _handler->GetResourceHandler(_browserControl, %browserWrapper, %frameWrapper, %requestWrapper);
128+
// If we already have an IBrowser instance then use it, otherwise we'll pass in a scoped instance
129+
// which cannot be accessed outside the scope of the method. We should under normal circumstanaces
130+
// have a IBrowser reference already ready to use.
131+
if (_browserControl->TryGetBrowserCoreById(browser->GetIdentifier(), existingBrowserWrapper))
132+
{
133+
resourceHandler = _handler->GetResourceHandler(_browserControl, existingBrowserWrapper, %frameWrapper, %requestWrapper);
134+
}
135+
else
136+
{
137+
CefBrowserWrapper browserWrapper(browser);
138+
139+
resourceHandler = _handler->GetResourceHandler(_browserControl, %browserWrapper, %frameWrapper, %requestWrapper);
140+
}
108141
}
109142
else
110143
{
@@ -159,10 +192,22 @@ namespace CefSharp
159192
//For ServiceWorker browser and frame will be null
160193
if (browser.get() && frame.get())
161194
{
162-
CefBrowserWrapper browserWrapper(browser);
195+
IBrowser^ existingBrowserWrapper;
163196
CefFrameWrapper frameWrapper(frame);
164197

165-
_handler->OnResourceRedirect(_browserControl, %browserWrapper, %frameWrapper, %requestWrapper, %responseWrapper, managedNewUrl);
198+
// If we already have an IBrowser instance then use it, otherwise we'll pass in a scoped instance
199+
// which cannot be accessed outside the scope of the method. We should under normal circumstanaces
200+
// have a IBrowser reference already ready to use.
201+
if (_browserControl->TryGetBrowserCoreById(browser->GetIdentifier(), existingBrowserWrapper))
202+
{
203+
_handler->OnResourceRedirect(_browserControl, existingBrowserWrapper, %frameWrapper, %requestWrapper, %responseWrapper, managedNewUrl);
204+
}
205+
else
206+
{
207+
CefBrowserWrapper browserWrapper(browser);
208+
209+
_handler->OnResourceRedirect(_browserControl, %browserWrapper, %frameWrapper, %requestWrapper, %responseWrapper, managedNewUrl);
210+
}
166211
}
167212
else
168213
{
@@ -181,9 +226,18 @@ namespace CefSharp
181226
//For ServiceWorker browser and frame will be null
182227
if (browser.get() && frame.get())
183228
{
229+
IBrowser^ existingBrowserWrapper;
230+
CefFrameWrapper frameWrapper(frame);
231+
232+
// If we already have an IBrowser instance then use it, otherwise we'll pass in a scoped instance
233+
// which cannot be accessed outside the scope of the method. We should under normal circumstanaces
234+
// have a IBrowser reference already ready to use.
235+
if (_browserControl->TryGetBrowserCoreById(browser->GetIdentifier(), existingBrowserWrapper))
236+
{
237+
return _handler->OnResourceResponse(_browserControl, existingBrowserWrapper, %frameWrapper, %requestWrapper, %responseWrapper);
238+
}
184239

185240
CefBrowserWrapper browserWrapper(browser);
186-
CefFrameWrapper frameWrapper(frame);
187241

188242
return _handler->OnResourceResponse(_browserControl, %browserWrapper, %frameWrapper, %requestWrapper, %responseWrapper);
189243
}
@@ -200,10 +254,22 @@ namespace CefSharp
200254
//For ServiceWorker browser and frame will be null
201255
if (browser.get() && frame.get())
202256
{
203-
CefBrowserWrapper browserWrapper(browser);
257+
IBrowser^ existingBrowserWrapper;
204258
CefFrameWrapper frameWrapper(frame);
205259

206-
responseFilter = _handler->GetResourceResponseFilter(_browserControl, %browserWrapper, %frameWrapper, %requestWrapper, %responseWrapper);
260+
// If we already have an IBrowser instance then use it, otherwise we'll pass in a scoped instance
261+
// which cannot be accessed outside the scope of the method. We should under normal circumstanaces
262+
// have a IBrowser reference already ready to use.
263+
if (_browserControl->TryGetBrowserCoreById(browser->GetIdentifier(), existingBrowserWrapper))
264+
{
265+
responseFilter = _handler->GetResourceResponseFilter(_browserControl, existingBrowserWrapper, %frameWrapper, %requestWrapper, %responseWrapper);
266+
}
267+
else
268+
{
269+
CefBrowserWrapper browserWrapper(browser);
270+
271+
responseFilter = _handler->GetResourceResponseFilter(_browserControl, %browserWrapper, %frameWrapper, %requestWrapper, %responseWrapper);
272+
}
207273
}
208274
else
209275
{
@@ -226,10 +292,22 @@ namespace CefSharp
226292
//For ServiceWorker browser and frame will be null
227293
if (browser.get() && frame.get())
228294
{
229-
CefBrowserWrapper browserWrapper(browser);
295+
IBrowser^ existingBrowserWrapper;
230296
CefFrameWrapper frameWrapper(frame);
231297

232-
_handler->OnResourceLoadComplete(_browserControl, %browserWrapper, %frameWrapper, %requestWrapper, %responseWrapper, (UrlRequestStatus)status, receivedContentLength);
298+
// If we already have an IBrowser instance then use it, otherwise we'll pass in a scoped instance
299+
// which cannot be accessed outside the scope of the method. We should under normal circumstanaces
300+
// have a IBrowser reference already ready to use.
301+
if (_browserControl->TryGetBrowserCoreById(browser->GetIdentifier(), existingBrowserWrapper))
302+
{
303+
_handler->OnResourceLoadComplete(_browserControl, existingBrowserWrapper, %frameWrapper, %requestWrapper, %responseWrapper, (UrlRequestStatus)status, receivedContentLength);
304+
}
305+
else
306+
{
307+
CefBrowserWrapper browserWrapper(browser);
308+
309+
_handler->OnResourceLoadComplete(_browserControl, %browserWrapper, %frameWrapper, %requestWrapper, %responseWrapper, (UrlRequestStatus)status, receivedContentLength);
310+
}
233311
}
234312
else
235313
{
@@ -244,11 +322,22 @@ namespace CefSharp
244322
//For ServiceWorker browser and frame will be null
245323
if (browser.get() && frame.get())
246324
{
247-
CefBrowserWrapper browserWrapper(browser);
325+
IBrowser^ existingBrowserWrapper;
248326
CefFrameWrapper frameWrapper(frame);
249327

328+
// If we already have an IBrowser instance then use it, otherwise we'll pass in a scoped instance
329+
// which cannot be accessed outside the scope of the method. We should under normal circumstanaces
330+
// have a IBrowser reference already ready to use.
331+
if (_browserControl->TryGetBrowserCoreById(browser->GetIdentifier(), existingBrowserWrapper))
332+
{
333+
allowOSExecution = _handler->OnProtocolExecution(_browserControl, existingBrowserWrapper, %frameWrapper, %requestWrapper);
334+
}
335+
else
336+
{
337+
CefBrowserWrapper browserWrapper(browser);
250338

251-
allowOSExecution = _handler->OnProtocolExecution(_browserControl, %browserWrapper, %frameWrapper, %requestWrapper);
339+
allowOSExecution = _handler->OnProtocolExecution(_browserControl, %browserWrapper, %frameWrapper, %requestWrapper);
340+
}
252341
}
253342
else
254343
{

0 commit comments

Comments
 (0)