|
7 | 7 | #include "Internals/CefRequestWrapper.h" |
8 | 8 | #include "Internals/CefWebPluginInfoWrapper.h" |
9 | 9 | #include "Internals/JavascriptBinding/BindingHandler.h" |
10 | | -#include "Internals/RequestResponse.h" |
11 | 10 | #include "ClientAdapter.h" |
12 | 11 | #include "Cef.h" |
13 | 12 | #include "DownloadAdapter.h" |
14 | 13 | #include "StreamAdapter.h" |
| 14 | +#include "include/wrapper/cef_stream_resource_handler.h" |
15 | 15 |
|
16 | 16 | using namespace std; |
| 17 | +using namespace CefSharp; |
17 | 18 | using namespace CefSharp::Internals::JavascriptBinding; |
18 | 19 |
|
19 | 20 | namespace CefSharp |
@@ -193,7 +194,7 @@ namespace CefSharp |
193 | 194 | _browserControl->OnLoadError(StringUtils::ToClr(failedUrl), (CefErrorCode)errorCode, StringUtils::ToClr(errorText)); |
194 | 195 | } |
195 | 196 |
|
196 | | - bool ClientAdapter:: OnBeforeBrowse(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request, bool isRedirect) |
| 197 | + bool ClientAdapter::OnBeforeBrowse(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request, bool isRedirect) |
197 | 198 | { |
198 | 199 | IRequestHandler^ handler = _browserControl->RequestHandler; |
199 | 200 | if (handler == nullptr) |
@@ -243,46 +244,65 @@ namespace CefSharp |
243 | 244 | } |
244 | 245 | } |
245 | 246 |
|
246 | | - bool ClientAdapter::OnBeforeResourceLoad(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request) |
| 247 | + // Called on the IO thread before a resource is loaded. To allow the resource |
| 248 | + // to load normally return NULL. To specify a handler for the resource return |
| 249 | + // a CefResourceHandler object. The |request| object should not be modified in |
| 250 | + // this callback. |
| 251 | + CefRefPtr<CefResourceHandler> ClientAdapter::GetResourceHandler(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request) |
247 | 252 | { |
248 | | - // TOOD: Try to support with CEF3; seems quite difficult because the method signature has changed greatly with many parts |
249 | | - // seemingly MIA... |
250 | 253 | IRequestHandler^ handler = _browserControl->RequestHandler; |
251 | 254 |
|
252 | 255 | if (handler == nullptr) |
253 | 256 | { |
254 | | - return false; |
| 257 | + return NULL; |
255 | 258 | } |
256 | 259 |
|
257 | | - CefRequestWrapper^ wrapper = gcnew CefRequestWrapper(request); |
258 | | - RequestResponse^ requestResponse = gcnew RequestResponse(wrapper); |
| 260 | + auto requestWrapper = gcnew CefRequestWrapper(request); |
259 | 261 |
|
260 | | - bool ret = handler->OnBeforeResourceLoad(_browserControl, requestResponse); |
| 262 | + auto resourceHandler = handler->GetResourceHandler(_browserControl, requestWrapper); |
261 | 263 |
|
262 | | - if (requestResponse->Action == ResponseAction::Redirect) |
| 264 | + if(resourceHandler != nullptr) |
263 | 265 | { |
264 | | - request->SetURL(StringUtils::ToNative(requestResponse->RedirectUrl)); |
| 266 | + auto mimeType = StringUtils::ToNative(resourceHandler->MimeType); |
| 267 | + auto statusText = StringUtils::ToNative(resourceHandler->StatusText); |
| 268 | + |
| 269 | + CefRefPtr<StreamAdapter> streamAdapter = new StreamAdapter(resourceHandler->Stream); |
| 270 | + |
| 271 | + CefRefPtr<CefStreamReader> stream = CefStreamReader::CreateForHandler(static_cast<CefRefPtr<CefReadHandler>>(streamAdapter)); |
| 272 | + if (stream.get()) |
| 273 | + { |
| 274 | + CefResponse::HeaderMap map = SchemeHandlerWrapper::ToHeaderMap(resourceHandler->Headers); |
| 275 | + |
| 276 | + //TODO: Investigate crash when using full response |
| 277 | + //return new CefStreamResourceHandler(resourceHandler->StatusCode, statusText, mimeType, map, stream); |
| 278 | + return new CefStreamResourceHandler(mimeType, stream); |
| 279 | + } |
265 | 280 | } |
266 | | - else if (requestResponse->Action == ResponseAction::Respond) |
267 | | - { |
268 | | - throw gcnew NotImplementedException("Respond is not yet supported."); |
269 | 281 |
|
270 | | - //resourceStream = CefStreamReader::CreateForHandler(static_cast<CefRefPtr<CefReadHandler>>(adapter)); |
271 | | - //response->SetMimeType(StringUtils::ToNative(requestResponse->MimeType)); |
272 | | - //response->SetStatus(requestResponse->StatusCode); |
273 | | - //response->SetStatusText(StringUtils::ToNative(requestResponse->StatusText)); |
| 282 | + return NULL; |
| 283 | + } |
| 284 | + |
| 285 | + bool ClientAdapter::OnBeforeResourceLoad(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request) |
| 286 | + { |
| 287 | + IRequestHandler^ handler = _browserControl->RequestHandler; |
| 288 | + |
| 289 | + if (handler == nullptr) |
| 290 | + { |
| 291 | + return false; |
| 292 | + } |
274 | 293 |
|
275 | | - //CefResponse::HeaderMap map; |
| 294 | + auto requestWrapper = gcnew CefRequestWrapper(request); |
| 295 | + auto response = gcnew Response(); |
276 | 296 |
|
277 | | - //if (requestResponse->ResponseHeaders != nullptr) |
278 | | - //{ |
279 | | - // for each (KeyValuePair<String^, String^>^ kvp in requestResponse->ResponseHeaders) |
280 | | - // { |
281 | | - // map.insert(pair<CefString,CefString>(StringUtils::ToNative(kvp->Key),StringUtils::ToNative(kvp->Value))); |
282 | | - // } |
283 | | - //} |
| 297 | + bool ret = handler->OnBeforeResourceLoad(_browserControl, requestWrapper, response); |
284 | 298 |
|
285 | | - //response->SetHeaderMap(map); |
| 299 | + if (response->Action == ResponseAction::Redirect) |
| 300 | + { |
| 301 | + request->SetURL(StringUtils::ToNative(response->RedirectUrl)); |
| 302 | + } |
| 303 | + else if (response->Action == ResponseAction::Cancel) |
| 304 | + { |
| 305 | + return true; |
286 | 306 | } |
287 | 307 |
|
288 | 308 | return ret; |
@@ -339,42 +359,6 @@ namespace CefSharp |
339 | 359 | return handled; |
340 | 360 | } |
341 | 361 |
|
342 | | - // TODO: Investigate how we can support in CEF3. |
343 | | - /* |
344 | | - void ClientAdapter::OnResourceResponse(CefRefPtr<CefBrowser> browser, const CefString& url, CefRefPtr<CefResponse> response, CefRefPtr<CefContentFilter>& filter) |
345 | | - { |
346 | | - IRequestHandler^ handler = _browserControl->RequestHandler; |
347 | | - if (handler == nullptr) |
348 | | - { |
349 | | - return; |
350 | | - } |
351 | | -
|
352 | | - WebHeaderCollection^ headers = gcnew WebHeaderCollection(); |
353 | | - CefResponse::HeaderMap map; |
354 | | - response->GetHeaderMap(map); |
355 | | - for (CefResponse::HeaderMap::iterator it = map.begin(); it != map.end(); ++it) |
356 | | - { |
357 | | - try |
358 | | - { |
359 | | - headers->Add(StringUtils::ToClr(it->first), StringUtils::ToClr(it->second)); |
360 | | - } |
361 | | - catch (Exception ^ex) |
362 | | - { |
363 | | - // adding a header with invalid characters can cause an exception to be |
364 | | - // thrown. we will drop those headers for now. |
365 | | - // we could eventually use reflection to call headers->AddWithoutValidate(). |
366 | | - } |
367 | | - } |
368 | | -
|
369 | | - handler->OnResourceResponse( |
370 | | - _browserControl, |
371 | | - StringUtils::ToClr(url), |
372 | | - response->GetStatus(), |
373 | | - StringUtils::ToClr(response->GetStatusText()), |
374 | | - StringUtils::ToClr(response->GetMimeType()), |
375 | | - headers); |
376 | | - }*/ |
377 | | - |
378 | 362 | void ClientAdapter::OnBeforeContextMenu(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, |
379 | 363 | CefRefPtr<CefContextMenuParams> params, CefRefPtr<CefMenuModel> model) |
380 | 364 | { |
|
0 commit comments