Skip to content

Commit 6691d00

Browse files
committed
Refactor ResourceHandler, split FileResourceHandler out into it's own class, rather than relaying on ResourceHandlerType - this allows us to add more underlying CEF type wrappers without a huge amount of effort now.
Add new ByteArrayResourceHandler - uses CefStreamReader::CreateForData to load the byte array, for use with CefStreamResourceHandler Add ResourceHandler.FromByteArray method for ease of use Change ResourceHandler.FromString to use the new ByteArrayResourceHandler class
1 parent 5b472f7 commit 6691d00

9 files changed

Lines changed: 290 additions & 73 deletions

File tree

CefSharp.Core/Internals/ClientAdapter.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -700,13 +700,22 @@ namespace CefSharp
700700
return NULL;
701701
}
702702

703-
if (handler->GetType() == ResourceHandler::typeid)
703+
if (handler->GetType() == FileResourceHandler::typeid)
704704
{
705-
auto resourceHandler = static_cast<ResourceHandler^>(handler);
706-
if (resourceHandler->Type == ResourceHandlerType::File)
707-
{
708-
return new CefStreamResourceHandler(StringUtils::ToNative(resourceHandler->MimeType), CefStreamReader::CreateForFile(StringUtils::ToNative(resourceHandler->FilePath)));
709-
}
705+
auto resourceHandler = static_cast<FileResourceHandler^>(handler);
706+
707+
return new CefStreamResourceHandler(StringUtils::ToNative(resourceHandler->MimeType), CefStreamReader::CreateForFile(StringUtils::ToNative(resourceHandler->FilePath)));
708+
}
709+
else if (handler->GetType() == ByteArrayResourceHandler::typeid)
710+
{
711+
auto resourceHandler = static_cast<ByteArrayResourceHandler^>(handler);
712+
713+
array<Byte>^ buffer = resourceHandler->Data;
714+
pin_ptr<Byte> src = &buffer[0];
715+
716+
auto streamReader = CefStreamReader::CreateForData(static_cast<void*>(src), buffer->Length);
717+
718+
return new CefStreamResourceHandler(StringUtils::ToNative(resourceHandler->MimeType), streamReader);
710719
}
711720

712721
return new ResourceHandlerWrapper(handler);

CefSharp.Core/SchemeHandlerFactoryWrapper.h

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,22 @@ namespace CefSharp
4444
return NULL;
4545
}
4646

47-
if (handler->GetType() == ResourceHandler::typeid)
47+
if (handler->GetType() == FileResourceHandler::typeid)
4848
{
49-
auto resourceHandler = static_cast<ResourceHandler^>(handler);
50-
if (resourceHandler->Type == ResourceHandlerType::File)
51-
{
52-
return new CefStreamResourceHandler(StringUtils::ToNative(resourceHandler->MimeType), CefStreamReader::CreateForFile(StringUtils::ToNative(resourceHandler->FilePath)));
53-
}
49+
auto resourceHandler = static_cast<FileResourceHandler^>(handler);
50+
51+
return new CefStreamResourceHandler(StringUtils::ToNative(resourceHandler->MimeType), CefStreamReader::CreateForFile(StringUtils::ToNative(resourceHandler->FilePath)));
52+
}
53+
else if (handler->GetType() == ByteArrayResourceHandler::typeid)
54+
{
55+
auto resourceHandler = static_cast<ByteArrayResourceHandler^>(handler);
56+
57+
array<Byte>^ buffer = resourceHandler->Data;
58+
pin_ptr<Byte> src = &buffer[0];
59+
60+
auto streamReader = CefStreamReader::CreateForData(static_cast<void*>(src), buffer->Length);
61+
62+
return new CefStreamResourceHandler(StringUtils::ToNative(resourceHandler->MimeType), streamReader);
5463
}
5564

5665
return new ResourceHandlerWrapper(handler);

CefSharp.Example/CefExample.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,6 @@ public static async void RegisterTestResources(IWebBrowser browser)
197197

198198
const string responseBody = "<html><body><h1>Success</h1><p>This document is loaded from a System.IO.Stream</p></body></html>";
199199
var response = ResourceHandler.FromString(responseBody);
200-
response.Headers.Add("HeaderTest1", "HeaderTest1Value");
201200
handler.RegisterHandler(TestResourceUrl, response);
202201

203202
const string unicodeResponseBody = "<html><body>整体满意度</body></html>";

CefSharp/CefSharp.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@
9898
<Compile Include="Callback\TaskPrintToPdfCallback.cs" />
9999
<Compile Include="Callback\TaskResolveCallback.cs" />
100100
<Compile Include="CdmRegistration.cs" />
101+
<Compile Include="Internals\ByteArrayResourceHandler.cs" />
102+
<Compile Include="Internals\FileResourceHandler.cs" />
101103
<Compile Include="Structs\CefDirtyRect.cs" />
102104
<Compile Include="CefExtension.cs" />
103105
<Compile Include="CefLibraryHandle.cs" />
@@ -134,7 +136,6 @@
134136
<Compile Include="Enums\PluginPolicy.cs" />
135137
<Compile Include="Enums\PostDataElementType.cs" />
136138
<Compile Include="Enums\ReferrerPolicy.cs" />
137-
<Compile Include="Enums\ResourceHandlerType.cs" />
138139
<Compile Include="Enums\ResourceType.cs" />
139140
<Compile Include="Enums\SslContentStatus.cs" />
140141
<Compile Include="Enums\SslVersion.cs" />

CefSharp/Enums/ResourceHandlerType.cs

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// Copyright © 2010-2017 The CefSharp Authors. All rights reserved.
2+
//
3+
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
4+
5+
using System;
6+
using System.Collections.Generic;
7+
using System.Collections.Specialized;
8+
using System.IO;
9+
using System.Text;
10+
11+
namespace CefSharp
12+
{
13+
/// <summary>
14+
/// ByteArrayResourceHandler is used as a placeholder to represent the underlying CefStreamResourceHandler
15+
/// </summary>
16+
public class ByteArrayResourceHandler : IResourceHandler
17+
{
18+
/// <summary>
19+
/// Underlying byte array that represents the data
20+
/// </summary>
21+
public byte[] Data { get; private set; }
22+
23+
/// <summary>
24+
/// Gets or sets the Mime Type.
25+
/// </summary>
26+
public string MimeType { get; set; }
27+
28+
/// <summary>
29+
/// Initializes a new instance of the <see cref="ByteArrayResourceHandler"/> class.
30+
/// </summary>
31+
/// <param name="mimeType">mimeType</param>
32+
/// <param name="filePath">filePath</param>
33+
public ByteArrayResourceHandler(string mimeType, byte[] data)
34+
{
35+
if(string.IsNullOrEmpty(mimeType))
36+
{
37+
throw new ArgumentNullException("mimeType", "Please provide a valid mimeType");
38+
}
39+
40+
if(data == null)
41+
{
42+
throw new ArgumentNullException("data", "Please provide a valid array");
43+
}
44+
45+
46+
MimeType = mimeType;
47+
Data = data;
48+
}
49+
50+
bool IResourceHandler.ProcessRequest(IRequest request, ICallback callback)
51+
{
52+
//Should never be called
53+
throw new NotImplementedException("This method should never be called");
54+
}
55+
56+
void IResourceHandler.GetResponseHeaders(IResponse response, out long responseLength, out string redirectUrl)
57+
{
58+
//Should never be called
59+
throw new NotImplementedException("This method should never be called");
60+
}
61+
62+
bool IResourceHandler.ReadResponse(Stream dataOut, out int bytesRead, ICallback callback)
63+
{
64+
//Should never be called
65+
throw new NotImplementedException("This method should never be called");
66+
}
67+
68+
bool IResourceHandler.CanGetCookie(Cookie cookie)
69+
{
70+
//Should never be called
71+
throw new NotImplementedException("This method should never be called");
72+
}
73+
74+
bool IResourceHandler.CanSetCookie(Cookie cookie)
75+
{
76+
//Should never be called
77+
throw new NotImplementedException("This method should never be called");
78+
}
79+
80+
void IResourceHandler.Cancel()
81+
{
82+
//Should never be called
83+
throw new NotImplementedException("This method should never be called");
84+
}
85+
86+
void IDisposable.Dispose()
87+
{
88+
//NOOP
89+
}
90+
}
91+
}
92+
93+
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// Copyright © 2010-2017 The CefSharp Authors. All rights reserved.
2+
//
3+
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
4+
5+
using System;
6+
using System.Collections.Generic;
7+
using System.Collections.Specialized;
8+
using System.IO;
9+
using System.Text;
10+
11+
namespace CefSharp
12+
{
13+
/// <summary>
14+
/// FileResourceHandler is used as a placeholder to represent the underlying CefStreamResourceHandler
15+
/// (Was previously ResourceHandlerType::File to differentiate, going for a more flexible approach now)
16+
/// </summary>
17+
public class FileResourceHandler : IResourceHandler
18+
{
19+
/// <summary>
20+
/// Path of the underlying file
21+
/// </summary>
22+
public string FilePath { get; private set; }
23+
24+
/// <summary>
25+
/// Gets or sets the Mime Type.
26+
/// </summary>
27+
public string MimeType { get; set; }
28+
29+
/// <summary>
30+
/// Initializes a new instance of the <see cref="FileResourceHandler"/> class.
31+
/// </summary>
32+
/// <param name="mimeType">mimeType</param>
33+
/// <param name="filePath">filePath</param>
34+
public FileResourceHandler(string mimeType, string filePath)
35+
{
36+
if(string.IsNullOrEmpty(mimeType))
37+
{
38+
throw new ArgumentNullException("mimeType", "Please provide a valid mimeType");
39+
}
40+
41+
if(string.IsNullOrEmpty(filePath))
42+
{
43+
throw new ArgumentNullException("filePath", "Please provide a valid filePath");
44+
}
45+
46+
47+
MimeType = mimeType;
48+
FilePath = filePath;
49+
}
50+
51+
bool IResourceHandler.ProcessRequest(IRequest request, ICallback callback)
52+
{
53+
//Should never be called
54+
throw new NotImplementedException("This method should never be called");
55+
}
56+
57+
void IResourceHandler.GetResponseHeaders(IResponse response, out long responseLength, out string redirectUrl)
58+
{
59+
//Should never be called
60+
throw new NotImplementedException("This method should never be called");
61+
}
62+
63+
bool IResourceHandler.ReadResponse(Stream dataOut, out int bytesRead, ICallback callback)
64+
{
65+
//Should never be called
66+
throw new NotImplementedException("This method should never be called");
67+
}
68+
69+
bool IResourceHandler.CanGetCookie(Cookie cookie)
70+
{
71+
//Should never be called
72+
throw new NotImplementedException("This method should never be called");
73+
}
74+
75+
bool IResourceHandler.CanSetCookie(Cookie cookie)
76+
{
77+
//Should never be called
78+
throw new NotImplementedException("This method should never be called");
79+
}
80+
81+
void IResourceHandler.Cancel()
82+
{
83+
//Should never be called
84+
throw new NotImplementedException("This method should never be called");
85+
}
86+
87+
void IDisposable.Dispose()
88+
{
89+
//NOOP
90+
}
91+
}
92+
}
93+

0 commit comments

Comments
 (0)