mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
- Add support for returning an HTTP status code from HandleBeforeResourceLoad and custom scheme handlers via the CefResponse class (issue #202).
- Add unit tests for custom scheme handlers (issue #221). - Fix reversed enable/disable of stop and reload buttons in cefclient. git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@222 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
1
cef.gyp
1
cef.gyp
@ -191,6 +191,7 @@
|
|||||||
'tests/unittests/dom_unittest.cc',
|
'tests/unittests/dom_unittest.cc',
|
||||||
'tests/unittests/request_unittest.cc',
|
'tests/unittests/request_unittest.cc',
|
||||||
'tests/unittests/run_all_unittests.cc',
|
'tests/unittests/run_all_unittests.cc',
|
||||||
|
'tests/unittests/scheme_handler_unittest.cc',
|
||||||
'tests/unittests/stream_unittest.cc',
|
'tests/unittests/stream_unittest.cc',
|
||||||
'tests/unittests/string_unittest.cc',
|
'tests/unittests/string_unittest.cc',
|
||||||
'tests/unittests/test_handler.h',
|
'tests/unittests/test_handler.h',
|
||||||
|
@ -818,7 +818,7 @@ public:
|
|||||||
CefRefPtr<CefRequest> request,
|
CefRefPtr<CefRequest> request,
|
||||||
CefString& redirectUrl,
|
CefString& redirectUrl,
|
||||||
CefRefPtr<CefStreamReader>& resourceStream,
|
CefRefPtr<CefStreamReader>& resourceStream,
|
||||||
CefString& mimeType,
|
CefRefPtr<CefResponse> response,
|
||||||
int loadFlags) =0;
|
int loadFlags) =0;
|
||||||
|
|
||||||
// Called on the IO thread to handle requests for URLs with an unknown
|
// Called on the IO thread to handle requests for URLs with an unknown
|
||||||
@ -1235,21 +1235,33 @@ class CefResponse : public CefBase
|
|||||||
public:
|
public:
|
||||||
typedef std::map<CefString,CefString> HeaderMap;
|
typedef std::map<CefString,CefString> HeaderMap;
|
||||||
|
|
||||||
// Returns the response status code.
|
// Returns/sets the response status code.
|
||||||
/*--cef()--*/
|
/*--cef()--*/
|
||||||
virtual int GetStatus() =0;
|
virtual int GetStatus() =0;
|
||||||
|
/*--cef()--*/
|
||||||
|
virtual void SetStatus(int status) = 0;
|
||||||
|
|
||||||
// Returns the response status text.
|
// Returns/sets the response status text.
|
||||||
/*--cef()--*/
|
/*--cef()--*/
|
||||||
virtual CefString GetStatusText() =0;
|
virtual CefString GetStatusText() =0;
|
||||||
|
/*--cef()--*/
|
||||||
|
virtual void SetStatusText(const CefString& statusText) = 0;
|
||||||
|
|
||||||
|
// Returns/sets the response mime type.
|
||||||
|
/*--cef()--*/
|
||||||
|
virtual CefString GetMimeType() = 0;
|
||||||
|
/*--cef()--*/
|
||||||
|
virtual void SetMimeType(const CefString& mimeType) = 0;
|
||||||
|
|
||||||
// Returns the value for the specified response header field.
|
// Returns the value for the specified response header field.
|
||||||
/*--cef()--*/
|
/*--cef()--*/
|
||||||
virtual CefString GetHeader(const CefString& name) =0;
|
virtual CefString GetHeader(const CefString& name) =0;
|
||||||
|
|
||||||
// Retrieves a map of all response header fields.
|
// Retrieves/sets a map of all response header fields.
|
||||||
/*--cef()--*/
|
/*--cef()--*/
|
||||||
virtual void GetHeaderMap(HeaderMap& headerMap) =0;
|
virtual void GetHeaderMap(HeaderMap& headerMap) =0;
|
||||||
|
/*--cef()--*/
|
||||||
|
virtual void SetHeaderMap(const HeaderMap& headerMap) =0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -1635,7 +1647,8 @@ public:
|
|||||||
// |mime_type| to the mime type for the response.
|
// |mime_type| to the mime type for the response.
|
||||||
/*--cef()--*/
|
/*--cef()--*/
|
||||||
virtual bool ProcessRequest(CefRefPtr<CefRequest> request,
|
virtual bool ProcessRequest(CefRefPtr<CefRequest> request,
|
||||||
CefString& mime_type, int* response_length) =0;
|
CefRefPtr<CefResponse> response,
|
||||||
|
int* response_length) =0;
|
||||||
|
|
||||||
// Cancel processing of the request.
|
// Cancel processing of the request.
|
||||||
/*--cef()--*/
|
/*--cef()--*/
|
||||||
|
@ -652,8 +652,8 @@ typedef struct _cef_handler_t
|
|||||||
enum cef_retval_t (CEF_CALLBACK *handle_before_resource_load)(
|
enum cef_retval_t (CEF_CALLBACK *handle_before_resource_load)(
|
||||||
struct _cef_handler_t* self, struct _cef_browser_t* browser,
|
struct _cef_handler_t* self, struct _cef_browser_t* browser,
|
||||||
struct _cef_request_t* request, cef_string_t* redirectUrl,
|
struct _cef_request_t* request, cef_string_t* redirectUrl,
|
||||||
struct _cef_stream_reader_t** resourceStream, cef_string_t* mimeType,
|
struct _cef_stream_reader_t** resourceStream,
|
||||||
int loadFlags);
|
struct _cef_response_t* response, int loadFlags);
|
||||||
|
|
||||||
// Called on the IO thread to handle requests for URLs with an unknown
|
// Called on the IO thread to handle requests for URLs with an unknown
|
||||||
// protocol component. Return RV_HANDLED to indicate that the request should
|
// protocol component. Return RV_HANDLED to indicate that the request should
|
||||||
@ -1020,22 +1020,34 @@ typedef struct _cef_response_t
|
|||||||
// Base structure.
|
// Base structure.
|
||||||
cef_base_t base;
|
cef_base_t base;
|
||||||
|
|
||||||
// Returns the response status code.
|
// Returns/sets the response status code.
|
||||||
int (CEF_CALLBACK *get_status)(struct _cef_response_t* self);
|
int (CEF_CALLBACK *get_status)(struct _cef_response_t* self);
|
||||||
|
void (CEF_CALLBACK *set_status)(struct _cef_response_t* self, int status);
|
||||||
|
|
||||||
// Returns the response status text.
|
// Returns/sets the response status text.
|
||||||
// The resulting string must be freed by calling cef_string_userfree_free().
|
// The resulting string must be freed by calling cef_string_userfree_free().
|
||||||
cef_string_userfree_t (CEF_CALLBACK *get_status_text)(
|
cef_string_userfree_t (CEF_CALLBACK *get_status_text)(
|
||||||
struct _cef_response_t* self);
|
struct _cef_response_t* self);
|
||||||
|
void (CEF_CALLBACK *set_status_text)(struct _cef_response_t* self,
|
||||||
|
const cef_string_t* statusText);
|
||||||
|
|
||||||
|
// Returns/sets the response mime type.
|
||||||
|
// The resulting string must be freed by calling cef_string_userfree_free().
|
||||||
|
cef_string_userfree_t (CEF_CALLBACK *get_mime_type)(
|
||||||
|
struct _cef_response_t* self);
|
||||||
|
void (CEF_CALLBACK *set_mime_type)(struct _cef_response_t* self,
|
||||||
|
const cef_string_t* mimeType);
|
||||||
|
|
||||||
// Returns the value for the specified response header field.
|
// Returns the value for the specified response header field.
|
||||||
// The resulting string must be freed by calling cef_string_userfree_free().
|
// The resulting string must be freed by calling cef_string_userfree_free().
|
||||||
cef_string_userfree_t (CEF_CALLBACK *get_header)(struct _cef_response_t* self,
|
cef_string_userfree_t (CEF_CALLBACK *get_header)(struct _cef_response_t* self,
|
||||||
const cef_string_t* name);
|
const cef_string_t* name);
|
||||||
|
|
||||||
// Retrieves a map of all response header fields.
|
// Retrieves/sets a map of all response header fields.
|
||||||
void (CEF_CALLBACK *get_header_map)(struct _cef_response_t* self,
|
void (CEF_CALLBACK *get_header_map)(struct _cef_response_t* self,
|
||||||
cef_string_map_t headerMap);
|
cef_string_map_t headerMap);
|
||||||
|
void (CEF_CALLBACK *set_header_map)(struct _cef_response_t* self,
|
||||||
|
cef_string_map_t headerMap);
|
||||||
|
|
||||||
} cef_response_t;
|
} cef_response_t;
|
||||||
|
|
||||||
@ -1396,7 +1408,7 @@ typedef struct _cef_scheme_handler_t
|
|||||||
// to 0 or the specified number of bytes have been read. If there is a
|
// to 0 or the specified number of bytes have been read. If there is a
|
||||||
// response set |mime_type| to the mime type for the response.
|
// response set |mime_type| to the mime type for the response.
|
||||||
int (CEF_CALLBACK *process_request)(struct _cef_scheme_handler_t* self,
|
int (CEF_CALLBACK *process_request)(struct _cef_scheme_handler_t* self,
|
||||||
struct _cef_request_t* request, cef_string_t* mime_type,
|
struct _cef_request_t* request, struct _cef_response_t* response,
|
||||||
int* response_length);
|
int* response_length);
|
||||||
|
|
||||||
// Cancel processing of the request.
|
// Cancel processing of the request.
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
#include "cef_process_io_thread.h"
|
#include "cef_process_io_thread.h"
|
||||||
#include "external_protocol_handler.h"
|
#include "external_protocol_handler.h"
|
||||||
#include "request_impl.h"
|
#include "request_impl.h"
|
||||||
|
#include "response_impl.h"
|
||||||
#include "http_header_utils.h"
|
#include "http_header_utils.h"
|
||||||
|
|
||||||
#include "base/file_path.h"
|
#include "base/file_path.h"
|
||||||
@ -313,10 +314,10 @@ class RequestProxy : public net::URLRequest::Delegate,
|
|||||||
// Handler output will be returned in these variables
|
// Handler output will be returned in these variables
|
||||||
CefString redirectUrl;
|
CefString redirectUrl;
|
||||||
CefRefPtr<CefStreamReader> resourceStream;
|
CefRefPtr<CefStreamReader> resourceStream;
|
||||||
CefString mimeType;
|
CefRefPtr<CefResponse> response(new CefResponseImpl());
|
||||||
|
|
||||||
CefHandler::RetVal rv = handler->HandleBeforeResourceLoad(
|
CefHandler::RetVal rv = handler->HandleBeforeResourceLoad(
|
||||||
browser_, request, redirectUrl, resourceStream, mimeType,
|
browser_, request, redirectUrl, resourceStream, response,
|
||||||
loadFlags);
|
loadFlags);
|
||||||
|
|
||||||
// Observe URL from request.
|
// Observe URL from request.
|
||||||
@ -371,10 +372,32 @@ class RequestProxy : public net::URLRequest::Delegate,
|
|||||||
|
|
||||||
resource_stream_ = resourceStream;
|
resource_stream_ = resourceStream;
|
||||||
|
|
||||||
|
CefResponseImpl* responseImpl =
|
||||||
|
static_cast<CefResponseImpl*>(response.get());
|
||||||
|
scoped_refptr<net::HttpResponseHeaders> headers(
|
||||||
|
new net::HttpResponseHeaders(
|
||||||
|
responseImpl->GenerateResponseLine()));
|
||||||
|
|
||||||
ResourceResponseInfo info;
|
ResourceResponseInfo info;
|
||||||
info.content_length = static_cast<int64>(offset);
|
info.content_length = static_cast<int64>(offset);
|
||||||
if(!mimeType.empty())
|
info.mime_type = response->GetMimeType();
|
||||||
info.mime_type = mimeType;
|
info.headers = headers;
|
||||||
|
OnReceivedResponse(info);
|
||||||
|
AsyncReadData();
|
||||||
|
} else if (response->GetStatus() != 0) {
|
||||||
|
// status set, but no resource stream
|
||||||
|
handled = true;
|
||||||
|
|
||||||
|
CefResponseImpl* responseImpl =
|
||||||
|
static_cast<CefResponseImpl*>(response.get());
|
||||||
|
scoped_refptr<net::HttpResponseHeaders> headers(
|
||||||
|
new net::HttpResponseHeaders(
|
||||||
|
responseImpl->GenerateResponseLine()));
|
||||||
|
|
||||||
|
ResourceResponseInfo info;
|
||||||
|
info.content_length = 0;
|
||||||
|
info.mime_type = response->GetMimeType();
|
||||||
|
info.headers = headers;
|
||||||
OnReceivedResponse(info);
|
OnReceivedResponse(info);
|
||||||
AsyncReadData();
|
AsyncReadData();
|
||||||
}
|
}
|
||||||
|
@ -6,10 +6,16 @@
|
|||||||
#include "response_impl.h"
|
#include "response_impl.h"
|
||||||
|
|
||||||
#include "base/logging.h"
|
#include "base/logging.h"
|
||||||
|
#include "base/stringprintf.h"
|
||||||
#include "http_header_utils.h"
|
#include "http_header_utils.h"
|
||||||
#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
|
#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
|
||||||
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLResponse.h"
|
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLResponse.h"
|
||||||
|
|
||||||
|
CefResponseImpl::CefResponseImpl()
|
||||||
|
: status_code_(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
CefResponseImpl::CefResponseImpl(const WebKit::WebURLResponse &response)
|
CefResponseImpl::CefResponseImpl(const WebKit::WebURLResponse &response)
|
||||||
{
|
{
|
||||||
DCHECK(!response.isNull());
|
DCHECK(!response.isNull());
|
||||||
@ -18,6 +24,8 @@ CefResponseImpl::CefResponseImpl(const WebKit::WebURLResponse &response)
|
|||||||
status_code_ = response.httpStatusCode();
|
status_code_ = response.httpStatusCode();
|
||||||
str = response.httpStatusText();
|
str = response.httpStatusText();
|
||||||
status_text_ = CefString(str);
|
status_text_ = CefString(str);
|
||||||
|
str = response.mimeType();
|
||||||
|
mime_type_ = CefString(str);
|
||||||
|
|
||||||
HttpHeaderUtils::HeaderVisitor visitor(&header_map_);
|
HttpHeaderUtils::HeaderVisitor visitor(&header_map_);
|
||||||
response.visitHTTPHeaderFields(&visitor);
|
response.visitHTTPHeaderFields(&visitor);
|
||||||
@ -25,16 +33,44 @@ CefResponseImpl::CefResponseImpl(const WebKit::WebURLResponse &response)
|
|||||||
|
|
||||||
int CefResponseImpl::GetStatus()
|
int CefResponseImpl::GetStatus()
|
||||||
{
|
{
|
||||||
|
AutoLock lock_scope(this);
|
||||||
return status_code_;
|
return status_code_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CefResponseImpl::SetStatus(int status)
|
||||||
|
{
|
||||||
|
AutoLock lock_scope(this);
|
||||||
|
status_code_ = status;
|
||||||
|
}
|
||||||
|
|
||||||
CefString CefResponseImpl::GetStatusText()
|
CefString CefResponseImpl::GetStatusText()
|
||||||
{
|
{
|
||||||
|
AutoLock lock_scope(this);
|
||||||
return status_text_;
|
return status_text_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CefResponseImpl::SetStatusText(const CefString& statusText)
|
||||||
|
{
|
||||||
|
AutoLock lock_scope(this);
|
||||||
|
status_text_ = statusText;
|
||||||
|
}
|
||||||
|
|
||||||
|
CefString CefResponseImpl::GetMimeType()
|
||||||
|
{
|
||||||
|
AutoLock lock_scope(this);
|
||||||
|
return mime_type_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CefResponseImpl::SetMimeType(const CefString& mimeType)
|
||||||
|
{
|
||||||
|
AutoLock lock_scope(this);
|
||||||
|
mime_type_ = mimeType;
|
||||||
|
}
|
||||||
|
|
||||||
CefString CefResponseImpl::GetHeader(const CefString& name)
|
CefString CefResponseImpl::GetHeader(const CefString& name)
|
||||||
{
|
{
|
||||||
|
AutoLock lock_scope(this);
|
||||||
|
|
||||||
CefString value;
|
CefString value;
|
||||||
|
|
||||||
HeaderMap::const_iterator it = header_map_.find(name);
|
HeaderMap::const_iterator it = header_map_.find(name);
|
||||||
@ -46,5 +82,32 @@ CefString CefResponseImpl::GetHeader(const CefString& name)
|
|||||||
|
|
||||||
void CefResponseImpl::GetHeaderMap(HeaderMap& map)
|
void CefResponseImpl::GetHeaderMap(HeaderMap& map)
|
||||||
{
|
{
|
||||||
|
AutoLock lock_scope(this);
|
||||||
map = header_map_;
|
map = header_map_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CefResponseImpl::SetHeaderMap(const HeaderMap& headerMap)
|
||||||
|
{
|
||||||
|
AutoLock lock_scope(this);
|
||||||
|
header_map_ = headerMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
CefString CefResponseImpl::GenerateResponseLine()
|
||||||
|
{
|
||||||
|
AutoLock lock_scope(this);
|
||||||
|
|
||||||
|
std::string response_line;
|
||||||
|
std::string status_text;
|
||||||
|
|
||||||
|
if(status_text_.empty())
|
||||||
|
status_text = (status_code_ == 200)?"OK":"ERROR";
|
||||||
|
else
|
||||||
|
status_text = status_text_;
|
||||||
|
|
||||||
|
base::SStringPrintf(&response_line, "HTTP/1.1 %d %s", status_code_,
|
||||||
|
status_text.c_str());
|
||||||
|
|
||||||
|
CefString value(response_line);
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
@ -15,18 +15,27 @@ class WebURLResponse;
|
|||||||
class CefResponseImpl : public CefThreadSafeBase<CefResponse>
|
class CefResponseImpl : public CefThreadSafeBase<CefResponse>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
CefResponseImpl();
|
||||||
CefResponseImpl(const WebKit::WebURLResponse& response);
|
CefResponseImpl(const WebKit::WebURLResponse& response);
|
||||||
~CefResponseImpl() {}
|
~CefResponseImpl() {}
|
||||||
|
|
||||||
// CefResponse API
|
// CefResponse API
|
||||||
virtual int GetStatus();
|
virtual int GetStatus();
|
||||||
|
virtual void SetStatus(int status);
|
||||||
virtual CefString GetStatusText();
|
virtual CefString GetStatusText();
|
||||||
|
virtual void SetStatusText(const CefString& statusText);
|
||||||
|
virtual CefString GetMimeType();
|
||||||
|
virtual void SetMimeType(const CefString& mimeType);
|
||||||
virtual CefString GetHeader(const CefString& name);
|
virtual CefString GetHeader(const CefString& name);
|
||||||
virtual void GetHeaderMap(HeaderMap& headerMap);
|
virtual void GetHeaderMap(HeaderMap& headerMap);
|
||||||
|
virtual void SetHeaderMap(const HeaderMap& headerMap);
|
||||||
|
|
||||||
|
CefString GenerateResponseLine();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
int status_code_;
|
int status_code_;
|
||||||
CefString status_text_;
|
CefString status_text_;
|
||||||
|
CefString mime_type_;
|
||||||
HeaderMap header_map_;
|
HeaderMap header_map_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "net/base/completion_callback.h"
|
#include "net/base/completion_callback.h"
|
||||||
#include "net/base/io_buffer.h"
|
#include "net/base/io_buffer.h"
|
||||||
#include "net/base/upload_data.h"
|
#include "net/base/upload_data.h"
|
||||||
|
#include "net/http/http_response_headers.h"
|
||||||
#include "net/http/http_util.h"
|
#include "net/http/http_util.h"
|
||||||
#include "net/url_request/url_request.h"
|
#include "net/url_request/url_request.h"
|
||||||
#include "net/url_request/url_request_filter.h"
|
#include "net/url_request/url_request_filter.h"
|
||||||
@ -19,6 +20,7 @@
|
|||||||
#include "tracker.h"
|
#include "tracker.h"
|
||||||
#include "cef_context.h"
|
#include "cef_context.h"
|
||||||
#include "request_impl.h"
|
#include "request_impl.h"
|
||||||
|
#include "response_impl.h"
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
@ -61,6 +63,7 @@ public:
|
|||||||
handler_->Cancel();
|
handler_->Cancel();
|
||||||
// Continue asynchronously.
|
// Continue asynchronously.
|
||||||
DCHECK(!async_resolver_);
|
DCHECK(!async_resolver_);
|
||||||
|
response_ = new CefResponseImpl();
|
||||||
async_resolver_ = new AsyncResolver(this);
|
async_resolver_ = new AsyncResolver(this);
|
||||||
CefThread::PostTask(CefThread::IO, FROM_HERE, NewRunnableMethod(
|
CefThread::PostTask(CefThread::IO, FROM_HERE, NewRunnableMethod(
|
||||||
async_resolver_.get(), &AsyncResolver::Resolve, url_));
|
async_resolver_.get(), &AsyncResolver::Resolve, url_));
|
||||||
@ -116,6 +119,14 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void GetResponseInfo(net::HttpResponseInfo* info) {
|
||||||
|
CefResponseImpl* responseImpl =
|
||||||
|
static_cast<CefResponseImpl*>(response_.get());
|
||||||
|
scoped_refptr<net::HttpResponseHeaders> headers(
|
||||||
|
new net::HttpResponseHeaders(responseImpl->GenerateResponseLine()));
|
||||||
|
info->headers = headers;
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool IsRedirectResponse(GURL* location, int* http_status_code)
|
virtual bool IsRedirectResponse(GURL* location, int* http_status_code)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -125,7 +136,7 @@ public:
|
|||||||
{
|
{
|
||||||
DCHECK(request_);
|
DCHECK(request_);
|
||||||
// call handler to get mime type
|
// call handler to get mime type
|
||||||
*mime_type = mime_type_;
|
*mime_type = response_->GetMimeType();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,7 +145,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
CefRefPtr<CefSchemeHandler> handler_;
|
CefRefPtr<CefSchemeHandler> handler_;
|
||||||
std::string mime_type_;
|
CefRefPtr<CefResponse> response_;
|
||||||
int response_length_;
|
int response_length_;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -178,15 +189,13 @@ private:
|
|||||||
static_cast<CefRequestImpl*>(req.get())->Set(owner_->request());
|
static_cast<CefRequestImpl*>(req.get())->Set(owner_->request());
|
||||||
|
|
||||||
owner_->handler_->Cancel();
|
owner_->handler_->Cancel();
|
||||||
CefString mime_type;
|
|
||||||
int response_length = 0;
|
int response_length = 0;
|
||||||
// handler should complete content generation in ProcessRequest
|
// handler should complete content generation in ProcessRequest
|
||||||
bool res = owner_->handler_->ProcessRequest(req, mime_type,
|
bool res = owner_->handler_->ProcessRequest(req, owner_->response_,
|
||||||
&response_length);
|
&response_length);
|
||||||
if (res) {
|
if (res)
|
||||||
owner_->mime_type_ = mime_type;
|
|
||||||
owner_->response_length_ = response_length;
|
owner_->response_length_ = response_length;
|
||||||
}
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
if (owner_loop_) {
|
if (owner_loop_) {
|
||||||
owner_loop_->PostTask(FROM_HERE, NewRunnableMethod(
|
owner_loop_->PostTask(FROM_HERE, NewRunnableMethod(
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include "libcef_dll/ctocpp/browser_ctocpp.h"
|
#include "libcef_dll/ctocpp/browser_ctocpp.h"
|
||||||
#include "libcef_dll/ctocpp/frame_ctocpp.h"
|
#include "libcef_dll/ctocpp/frame_ctocpp.h"
|
||||||
#include "libcef_dll/ctocpp/request_ctocpp.h"
|
#include "libcef_dll/ctocpp/request_ctocpp.h"
|
||||||
|
#include "libcef_dll/ctocpp/response_ctocpp.h"
|
||||||
#include "libcef_dll/ctocpp/stream_reader_ctocpp.h"
|
#include "libcef_dll/ctocpp/stream_reader_ctocpp.h"
|
||||||
#include "libcef_dll/ctocpp/v8value_ctocpp.h"
|
#include "libcef_dll/ctocpp/v8value_ctocpp.h"
|
||||||
|
|
||||||
@ -197,25 +198,24 @@ enum cef_retval_t CEF_CALLBACK handler_handle_load_error(
|
|||||||
enum cef_retval_t CEF_CALLBACK handler_handle_before_resource_load(
|
enum cef_retval_t CEF_CALLBACK handler_handle_before_resource_load(
|
||||||
struct _cef_handler_t* self, cef_browser_t* browser,
|
struct _cef_handler_t* self, cef_browser_t* browser,
|
||||||
struct _cef_request_t* request, cef_string_t* redirectUrl,
|
struct _cef_request_t* request, cef_string_t* redirectUrl,
|
||||||
struct _cef_stream_reader_t** resourceStream, cef_string_t* mimeType,
|
struct _cef_stream_reader_t** resourceStream,
|
||||||
int loadFlags)
|
struct _cef_response_t* response, int loadFlags)
|
||||||
{
|
{
|
||||||
DCHECK(self);
|
DCHECK(self);
|
||||||
DCHECK(browser);
|
DCHECK(browser);
|
||||||
DCHECK(redirectUrl);
|
DCHECK(redirectUrl);
|
||||||
DCHECK(resourceStream);
|
DCHECK(resourceStream);
|
||||||
DCHECK(mimeType);
|
DCHECK(response);
|
||||||
if(!self || !browser || !redirectUrl || !resourceStream || !mimeType)
|
if(!self || !browser || !redirectUrl || !resourceStream || !response)
|
||||||
return RV_CONTINUE;
|
return RV_CONTINUE;
|
||||||
|
|
||||||
CefRefPtr<CefStreamReader> streamPtr;
|
CefRefPtr<CefStreamReader> streamPtr;
|
||||||
|
|
||||||
CefString redirectUrlStr(redirectUrl);
|
CefString redirectUrlStr(redirectUrl);
|
||||||
CefString mimeTypeStr(mimeType);
|
|
||||||
enum cef_retval_t rv = CefHandlerCppToC::Get(self)->
|
enum cef_retval_t rv = CefHandlerCppToC::Get(self)->
|
||||||
HandleBeforeResourceLoad(CefBrowserCToCpp::Wrap(browser),
|
HandleBeforeResourceLoad(CefBrowserCToCpp::Wrap(browser),
|
||||||
CefRequestCToCpp::Wrap(request), redirectUrlStr, streamPtr, mimeTypeStr,
|
CefRequestCToCpp::Wrap(request), redirectUrlStr, streamPtr,
|
||||||
loadFlags);
|
CefResponseCToCpp::Wrap(response), loadFlags);
|
||||||
|
|
||||||
if(streamPtr.get())
|
if(streamPtr.get())
|
||||||
*resourceStream = CefStreamReaderCToCpp::Unwrap(streamPtr);
|
*resourceStream = CefStreamReaderCToCpp::Unwrap(streamPtr);
|
||||||
|
@ -25,6 +25,15 @@ int CEF_CALLBACK response_get_status(struct _cef_response_t* self)
|
|||||||
return CefResponseCppToC::Get(self)->GetStatus();
|
return CefResponseCppToC::Get(self)->GetStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CEF_CALLBACK response_set_status(struct _cef_response_t* self, int status)
|
||||||
|
{
|
||||||
|
DCHECK(self);
|
||||||
|
if(!self)
|
||||||
|
return;
|
||||||
|
|
||||||
|
CefResponseCppToC::Get(self)->SetStatus(status);
|
||||||
|
}
|
||||||
|
|
||||||
cef_string_userfree_t CEF_CALLBACK response_get_status_text(
|
cef_string_userfree_t CEF_CALLBACK response_get_status_text(
|
||||||
struct _cef_response_t* self)
|
struct _cef_response_t* self)
|
||||||
{
|
{
|
||||||
@ -36,6 +45,37 @@ cef_string_userfree_t CEF_CALLBACK response_get_status_text(
|
|||||||
return text.DetachToUserFree();
|
return text.DetachToUserFree();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CEF_CALLBACK response_set_status_text(struct _cef_response_t* self,
|
||||||
|
const cef_string_t* statusText)
|
||||||
|
{
|
||||||
|
DCHECK(self);
|
||||||
|
if(!self)
|
||||||
|
return;
|
||||||
|
|
||||||
|
CefResponseCppToC::Get(self)->SetStatusText(CefString(statusText));
|
||||||
|
}
|
||||||
|
|
||||||
|
cef_string_userfree_t CEF_CALLBACK response_get_mime_type(
|
||||||
|
struct _cef_response_t* self)
|
||||||
|
{
|
||||||
|
DCHECK(self);
|
||||||
|
if(!self)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
CefString text = CefResponseCppToC::Get(self)->GetMimeType();
|
||||||
|
return text.DetachToUserFree();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CEF_CALLBACK response_set_mime_type(struct _cef_response_t* self,
|
||||||
|
const cef_string_t* mimeType)
|
||||||
|
{
|
||||||
|
DCHECK(self);
|
||||||
|
if(!self)
|
||||||
|
return;
|
||||||
|
|
||||||
|
CefResponseCppToC::Get(self)->SetMimeType(CefString(mimeType));
|
||||||
|
}
|
||||||
|
|
||||||
cef_string_userfree_t CEF_CALLBACK response_get_header(
|
cef_string_userfree_t CEF_CALLBACK response_get_header(
|
||||||
struct _cef_response_t* self, const cef_string_t* name)
|
struct _cef_response_t* self, const cef_string_t* name)
|
||||||
{
|
{
|
||||||
@ -59,6 +99,20 @@ void CEF_CALLBACK response_get_header_map(struct _cef_response_t* self,
|
|||||||
transfer_string_map_contents(map, headerMap);
|
transfer_string_map_contents(map, headerMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CEF_CALLBACK response_set_header_map(struct _cef_response_t* self,
|
||||||
|
cef_string_map_t headerMap)
|
||||||
|
{
|
||||||
|
DCHECK(self);
|
||||||
|
if(!self)
|
||||||
|
return;
|
||||||
|
|
||||||
|
CefResponse::HeaderMap map;
|
||||||
|
if(headerMap)
|
||||||
|
transfer_string_map_contents(headerMap, map);
|
||||||
|
|
||||||
|
CefResponseCppToC::Get(self)->SetHeaderMap(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// CONSTRUCTOR - Do not edit by hand.
|
// CONSTRUCTOR - Do not edit by hand.
|
||||||
|
|
||||||
@ -66,9 +120,14 @@ CefResponseCppToC::CefResponseCppToC(CefResponse* cls)
|
|||||||
: CefCppToC<CefResponseCppToC, CefResponse, cef_response_t>(cls)
|
: CefCppToC<CefResponseCppToC, CefResponse, cef_response_t>(cls)
|
||||||
{
|
{
|
||||||
struct_.struct_.get_status = response_get_status;
|
struct_.struct_.get_status = response_get_status;
|
||||||
|
struct_.struct_.set_status = response_set_status;
|
||||||
struct_.struct_.get_status_text = response_get_status_text;
|
struct_.struct_.get_status_text = response_get_status_text;
|
||||||
|
struct_.struct_.set_status_text = response_set_status_text;
|
||||||
|
struct_.struct_.get_mime_type = response_get_mime_type;
|
||||||
|
struct_.struct_.set_mime_type = response_set_mime_type;
|
||||||
struct_.struct_.get_header = response_get_header;
|
struct_.struct_.get_header = response_get_header;
|
||||||
struct_.struct_.get_header_map = response_get_header_map;
|
struct_.struct_.get_header_map = response_get_header_map;
|
||||||
|
struct_.struct_.set_header_map = response_set_header_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
|
@ -12,24 +12,25 @@
|
|||||||
|
|
||||||
#include "libcef_dll/cpptoc/scheme_handler_cpptoc.h"
|
#include "libcef_dll/cpptoc/scheme_handler_cpptoc.h"
|
||||||
#include "libcef_dll/ctocpp/request_ctocpp.h"
|
#include "libcef_dll/ctocpp/request_ctocpp.h"
|
||||||
|
#include "libcef_dll/ctocpp/response_ctocpp.h"
|
||||||
|
|
||||||
|
|
||||||
// MEMBER FUNCTIONS - Body may be edited by hand.
|
// MEMBER FUNCTIONS - Body may be edited by hand.
|
||||||
|
|
||||||
int CEF_CALLBACK scheme_handler_process_request(
|
int CEF_CALLBACK scheme_handler_process_request(
|
||||||
struct _cef_scheme_handler_t* self, cef_request_t* request,
|
struct _cef_scheme_handler_t* self, cef_request_t* request,
|
||||||
cef_string_t* mime_type, int* response_length)
|
cef_response_t* response, int* response_length)
|
||||||
{
|
{
|
||||||
DCHECK(self);
|
DCHECK(self);
|
||||||
DCHECK(request);
|
DCHECK(request);
|
||||||
DCHECK(mime_type);
|
DCHECK(response);
|
||||||
DCHECK(response_length);
|
DCHECK(response_length);
|
||||||
if(!self || !request || !mime_type || !response_length)
|
if(!self || !request || !response || !response_length)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
CefString mimeTypeStr(mime_type);
|
|
||||||
return CefSchemeHandlerCppToC::Get(self)->ProcessRequest(
|
return CefSchemeHandlerCppToC::Get(self)->ProcessRequest(
|
||||||
CefRequestCToCpp::Wrap(request), mimeTypeStr, response_length);
|
CefRequestCToCpp::Wrap(request), CefResponseCToCpp::Wrap(response),
|
||||||
|
response_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CEF_CALLBACK scheme_handler_cancel(struct _cef_scheme_handler_t* self)
|
void CEF_CALLBACK scheme_handler_cancel(struct _cef_scheme_handler_t* self)
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include "libcef_dll/cpptoc/browser_cpptoc.h"
|
#include "libcef_dll/cpptoc/browser_cpptoc.h"
|
||||||
#include "libcef_dll/cpptoc/frame_cpptoc.h"
|
#include "libcef_dll/cpptoc/frame_cpptoc.h"
|
||||||
#include "libcef_dll/cpptoc/request_cpptoc.h"
|
#include "libcef_dll/cpptoc/request_cpptoc.h"
|
||||||
|
#include "libcef_dll/cpptoc/response_cpptoc.h"
|
||||||
#include "libcef_dll/cpptoc/stream_reader_cpptoc.h"
|
#include "libcef_dll/cpptoc/stream_reader_cpptoc.h"
|
||||||
#include "libcef_dll/cpptoc/v8value_cpptoc.h"
|
#include "libcef_dll/cpptoc/v8value_cpptoc.h"
|
||||||
#include "libcef_dll/ctocpp/download_handler_ctocpp.h"
|
#include "libcef_dll/ctocpp/download_handler_ctocpp.h"
|
||||||
@ -151,7 +152,7 @@ CefHandler::RetVal CefHandlerCToCpp::HandleLoadError(
|
|||||||
CefHandler::RetVal CefHandlerCToCpp::HandleBeforeResourceLoad(
|
CefHandler::RetVal CefHandlerCToCpp::HandleBeforeResourceLoad(
|
||||||
CefRefPtr<CefBrowser> browser, CefRefPtr<CefRequest> request,
|
CefRefPtr<CefBrowser> browser, CefRefPtr<CefRequest> request,
|
||||||
CefString& redirectUrl, CefRefPtr<CefStreamReader>& resourceStream,
|
CefString& redirectUrl, CefRefPtr<CefStreamReader>& resourceStream,
|
||||||
CefString& mimeType, int loadFlags)
|
CefRefPtr<CefResponse> response, int loadFlags)
|
||||||
{
|
{
|
||||||
if(CEF_MEMBER_MISSING(struct_, handle_before_resource_load))
|
if(CEF_MEMBER_MISSING(struct_, handle_before_resource_load))
|
||||||
return RV_CONTINUE;
|
return RV_CONTINUE;
|
||||||
@ -160,8 +161,8 @@ CefHandler::RetVal CefHandlerCToCpp::HandleBeforeResourceLoad(
|
|||||||
|
|
||||||
cef_retval_t rv = struct_->handle_before_resource_load(struct_,
|
cef_retval_t rv = struct_->handle_before_resource_load(struct_,
|
||||||
CefBrowserCppToC::Wrap(browser), CefRequestCppToC::Wrap(request),
|
CefBrowserCppToC::Wrap(browser), CefRequestCppToC::Wrap(request),
|
||||||
redirectUrl.GetWritableStruct(), &streamRet, mimeType.GetWritableStruct(),
|
redirectUrl.GetWritableStruct(), &streamRet,
|
||||||
loadFlags);
|
CefResponseCppToC::Wrap(response), loadFlags);
|
||||||
|
|
||||||
if(streamRet)
|
if(streamRet)
|
||||||
resourceStream = CefStreamReaderCppToC::Unwrap(streamRet);
|
resourceStream = CefStreamReaderCppToC::Unwrap(streamRet);
|
||||||
|
@ -54,8 +54,8 @@ public:
|
|||||||
const CefString& failedUrl, CefString& errorText);
|
const CefString& failedUrl, CefString& errorText);
|
||||||
virtual RetVal HandleBeforeResourceLoad(CefRefPtr<CefBrowser> browser,
|
virtual RetVal HandleBeforeResourceLoad(CefRefPtr<CefBrowser> browser,
|
||||||
CefRefPtr<CefRequest> request, CefString& redirectUrl,
|
CefRefPtr<CefRequest> request, CefString& redirectUrl,
|
||||||
CefRefPtr<CefStreamReader>& resourceStream, CefString& mimeType,
|
CefRefPtr<CefStreamReader>& resourceStream,
|
||||||
int loadFlags);
|
CefRefPtr<CefResponse> response, int loadFlags);
|
||||||
virtual RetVal HandleProtocolExecution(CefRefPtr<CefBrowser> browser,
|
virtual RetVal HandleProtocolExecution(CefRefPtr<CefBrowser> browser,
|
||||||
const CefString& url, bool& allow_os_execution);
|
const CefString& url, bool& allow_os_execution);
|
||||||
virtual RetVal HandleDownloadResponse(CefRefPtr<CefBrowser> browser,
|
virtual RetVal HandleDownloadResponse(CefRefPtr<CefBrowser> browser,
|
||||||
|
@ -24,6 +24,14 @@ int CefResponseCToCpp::GetStatus()
|
|||||||
return struct_->get_status(struct_);
|
return struct_->get_status(struct_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CefResponseCToCpp::SetStatus(int status)
|
||||||
|
{
|
||||||
|
if(CEF_MEMBER_MISSING(struct_, set_status))
|
||||||
|
return;
|
||||||
|
|
||||||
|
struct_->set_status(struct_, status);
|
||||||
|
}
|
||||||
|
|
||||||
CefString CefResponseCToCpp::GetStatusText()
|
CefString CefResponseCToCpp::GetStatusText()
|
||||||
{
|
{
|
||||||
CefString str;
|
CefString str;
|
||||||
@ -35,6 +43,33 @@ CefString CefResponseCToCpp::GetStatusText()
|
|||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CefResponseCToCpp::SetStatusText(const CefString& statusText)
|
||||||
|
{
|
||||||
|
if(CEF_MEMBER_MISSING(struct_, set_status_text))
|
||||||
|
return;
|
||||||
|
|
||||||
|
struct_->set_status_text(struct_, statusText.GetStruct());
|
||||||
|
}
|
||||||
|
|
||||||
|
CefString CefResponseCToCpp::GetMimeType()
|
||||||
|
{
|
||||||
|
CefString str;
|
||||||
|
if(CEF_MEMBER_MISSING(struct_, get_mime_type))
|
||||||
|
return str;
|
||||||
|
|
||||||
|
cef_string_userfree_t strPtr = struct_->get_mime_type(struct_);
|
||||||
|
str.AttachToUserFree(strPtr);
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CefResponseCToCpp::SetMimeType(const CefString& mimeType)
|
||||||
|
{
|
||||||
|
if(CEF_MEMBER_MISSING(struct_, set_mime_type))
|
||||||
|
return;
|
||||||
|
|
||||||
|
struct_->set_mime_type(struct_, mimeType.GetStruct());
|
||||||
|
}
|
||||||
|
|
||||||
CefString CefResponseCToCpp::GetHeader(const CefString& name)
|
CefString CefResponseCToCpp::GetHeader(const CefString& name)
|
||||||
{
|
{
|
||||||
CefString str;
|
CefString str;
|
||||||
@ -60,6 +95,25 @@ void CefResponseCToCpp::GetHeaderMap(HeaderMap& headerMap)
|
|||||||
cef_string_map_free(map);
|
cef_string_map_free(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CefResponseCToCpp::SetHeaderMap(const HeaderMap& headerMap)
|
||||||
|
{
|
||||||
|
if(CEF_MEMBER_MISSING(struct_, set_header_map))
|
||||||
|
return;
|
||||||
|
|
||||||
|
cef_string_map_t map = NULL;
|
||||||
|
if(!headerMap.empty()) {
|
||||||
|
map = cef_string_map_alloc();
|
||||||
|
if(!map)
|
||||||
|
return;
|
||||||
|
transfer_string_map_contents(headerMap, map);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct_->set_header_map(struct_, map);
|
||||||
|
|
||||||
|
if(map)
|
||||||
|
cef_string_map_free(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
template<> long CefCToCpp<CefResponseCToCpp, CefResponse,
|
template<> long CefCToCpp<CefResponseCToCpp, CefResponse,
|
||||||
|
@ -32,9 +32,14 @@ public:
|
|||||||
|
|
||||||
// CefResponse methods
|
// CefResponse methods
|
||||||
virtual int GetStatus();
|
virtual int GetStatus();
|
||||||
|
virtual void SetStatus(int status);
|
||||||
virtual CefString GetStatusText();
|
virtual CefString GetStatusText();
|
||||||
|
virtual void SetStatusText(const CefString& statusText);
|
||||||
|
virtual CefString GetMimeType();
|
||||||
|
virtual void SetMimeType(const CefString& mimeType);
|
||||||
virtual CefString GetHeader(const CefString& name);
|
virtual CefString GetHeader(const CefString& name);
|
||||||
virtual void GetHeaderMap(HeaderMap& headerMap);
|
virtual void GetHeaderMap(HeaderMap& headerMap);
|
||||||
|
virtual void SetHeaderMap(const HeaderMap& headerMap);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // USING_CEF_SHARED
|
#endif // USING_CEF_SHARED
|
||||||
|
@ -11,19 +11,20 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#include "libcef_dll/cpptoc/request_cpptoc.h"
|
#include "libcef_dll/cpptoc/request_cpptoc.h"
|
||||||
|
#include "libcef_dll/cpptoc/response_cpptoc.h"
|
||||||
#include "libcef_dll/ctocpp/scheme_handler_ctocpp.h"
|
#include "libcef_dll/ctocpp/scheme_handler_ctocpp.h"
|
||||||
|
|
||||||
|
|
||||||
// VIRTUAL METHODS - Body may be edited by hand.
|
// VIRTUAL METHODS - Body may be edited by hand.
|
||||||
|
|
||||||
bool CefSchemeHandlerCToCpp::ProcessRequest(CefRefPtr<CefRequest> request,
|
bool CefSchemeHandlerCToCpp::ProcessRequest(CefRefPtr<CefRequest> request,
|
||||||
CefString& mime_type, int* response_length)
|
CefRefPtr<CefResponse> response, int* response_length)
|
||||||
{
|
{
|
||||||
if(CEF_MEMBER_MISSING(struct_, process_request))
|
if(CEF_MEMBER_MISSING(struct_, process_request))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return struct_->process_request(struct_, CefRequestCppToC::Wrap(request),
|
return struct_->process_request(struct_, CefRequestCppToC::Wrap(request),
|
||||||
mime_type.GetWritableStruct(), response_length) ? true : false;
|
CefResponseCppToC::Wrap(response), response_length) ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CefSchemeHandlerCToCpp::Cancel()
|
void CefSchemeHandlerCToCpp::Cancel()
|
||||||
|
@ -34,7 +34,7 @@ public:
|
|||||||
|
|
||||||
// CefSchemeHandler methods
|
// CefSchemeHandler methods
|
||||||
virtual bool ProcessRequest(CefRefPtr<CefRequest> request,
|
virtual bool ProcessRequest(CefRefPtr<CefRequest> request,
|
||||||
CefString& mime_type, int* response_length);
|
CefRefPtr<CefResponse> response, int* response_length);
|
||||||
virtual void Cancel();
|
virtual void Cancel();
|
||||||
virtual bool ReadResponse(void* data_out, int bytes_to_read, int* bytes_read);
|
virtual bool ReadResponse(void* data_out, int bytes_to_read, int* bytes_read);
|
||||||
};
|
};
|
||||||
|
@ -251,14 +251,14 @@ void ClientHandler::SetEditHwnd(CefWindowHandle hwnd)
|
|||||||
|
|
||||||
void ClientHandler::SetButtonHwnds(CefWindowHandle backHwnd,
|
void ClientHandler::SetButtonHwnds(CefWindowHandle backHwnd,
|
||||||
CefWindowHandle forwardHwnd,
|
CefWindowHandle forwardHwnd,
|
||||||
CefWindowHandle stopHwnd,
|
CefWindowHandle reloadHwnd,
|
||||||
CefWindowHandle reloadHwnd)
|
CefWindowHandle stopHwnd)
|
||||||
{
|
{
|
||||||
Lock();
|
Lock();
|
||||||
m_BackHwnd = backHwnd;
|
m_BackHwnd = backHwnd;
|
||||||
m_ForwardHwnd = forwardHwnd;
|
m_ForwardHwnd = forwardHwnd;
|
||||||
m_StopHwnd = stopHwnd;
|
|
||||||
m_ReloadHwnd = reloadHwnd;
|
m_ReloadHwnd = reloadHwnd;
|
||||||
|
m_StopHwnd = stopHwnd;
|
||||||
Unlock();
|
Unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,7 +128,7 @@ public:
|
|||||||
CefRefPtr<CefRequest> request,
|
CefRefPtr<CefRequest> request,
|
||||||
CefString& redirectUrl,
|
CefString& redirectUrl,
|
||||||
CefRefPtr<CefStreamReader>& resourceStream,
|
CefRefPtr<CefStreamReader>& resourceStream,
|
||||||
CefString& mimeType,
|
CefRefPtr<CefResponse> response,
|
||||||
int loadFlags);
|
int loadFlags);
|
||||||
|
|
||||||
// Called on the IO thread to handle requests for URLs with an unknown
|
// Called on the IO thread to handle requests for URLs with an unknown
|
||||||
|
@ -536,7 +536,7 @@ CefHandler::RetVal ClientHandler::HandleTitleChange(
|
|||||||
CefHandler::RetVal ClientHandler::HandleBeforeResourceLoad(
|
CefHandler::RetVal ClientHandler::HandleBeforeResourceLoad(
|
||||||
CefRefPtr<CefBrowser> browser, CefRefPtr<CefRequest> request,
|
CefRefPtr<CefBrowser> browser, CefRefPtr<CefRequest> request,
|
||||||
CefString& redirectUrl, CefRefPtr<CefStreamReader>& resourceStream,
|
CefString& redirectUrl, CefRefPtr<CefStreamReader>& resourceStream,
|
||||||
CefString& mimeType, int loadFlags)
|
CefRefPtr<CefResponse> response, int loadFlags)
|
||||||
{
|
{
|
||||||
REQUIRE_IO_THREAD();
|
REQUIRE_IO_THREAD();
|
||||||
|
|
||||||
@ -547,23 +547,28 @@ CefHandler::RetVal ClientHandler::HandleBeforeResourceLoad(
|
|||||||
DumpRequestContents(request, dump);
|
DumpRequestContents(request, dump);
|
||||||
resourceStream = CefStreamReader::CreateForData(
|
resourceStream = CefStreamReader::CreateForData(
|
||||||
(void*)dump.c_str(), dump.size());
|
(void*)dump.c_str(), dump.size());
|
||||||
mimeType = "text/plain";
|
response->SetMimeType("text/plain");
|
||||||
|
response->SetStatus(200);
|
||||||
} else if (strstr(url.c_str(), "/ps_logo2.png") != NULL) {
|
} else if (strstr(url.c_str(), "/ps_logo2.png") != NULL) {
|
||||||
// Any time we find "ps_logo2.png" in the URL substitute in our own image
|
// Any time we find "ps_logo2.png" in the URL substitute in our own image
|
||||||
resourceStream = GetBinaryResourceReader("logo.png");
|
resourceStream = GetBinaryResourceReader("logo.png");
|
||||||
mimeType = "image/png";
|
response->SetMimeType("image/png");
|
||||||
|
response->SetStatus(200);
|
||||||
} else if(url == "http://tests/localstorage") {
|
} else if(url == "http://tests/localstorage") {
|
||||||
// Show the localstorage contents
|
// Show the localstorage contents
|
||||||
resourceStream = GetBinaryResourceReader("localstorage.html");
|
resourceStream = GetBinaryResourceReader("localstorage.html");
|
||||||
mimeType = "text/html";
|
response->SetMimeType("text/html");
|
||||||
|
response->SetStatus(200);
|
||||||
} else if(url == "http://tests/xmlhttprequest") {
|
} else if(url == "http://tests/xmlhttprequest") {
|
||||||
// Show the xmlhttprequest HTML contents
|
// Show the xmlhttprequest HTML contents
|
||||||
resourceStream = GetBinaryResourceReader("xmlhttprequest.html");
|
resourceStream = GetBinaryResourceReader("xmlhttprequest.html");
|
||||||
mimeType = "text/html";
|
response->SetMimeType("text/html");
|
||||||
|
response->SetStatus(200);
|
||||||
} else if(url == "http://tests/domaccess") {
|
} else if(url == "http://tests/domaccess") {
|
||||||
// Show the domaccess HTML contents
|
// Show the domaccess HTML contents
|
||||||
resourceStream = GetBinaryResourceReader("domaccess.html");
|
resourceStream = GetBinaryResourceReader("domaccess.html");
|
||||||
mimeType = "text/html";
|
response->SetMimeType("text/html");
|
||||||
|
response->SetStatus(200);
|
||||||
}
|
}
|
||||||
|
|
||||||
return RV_CONTINUE;
|
return RV_CONTINUE;
|
||||||
|
@ -695,7 +695,7 @@ CefHandler::RetVal ClientHandler::HandleTitleChange(
|
|||||||
CefHandler::RetVal ClientHandler::HandleBeforeResourceLoad(
|
CefHandler::RetVal ClientHandler::HandleBeforeResourceLoad(
|
||||||
CefRefPtr<CefBrowser> browser, CefRefPtr<CefRequest> request,
|
CefRefPtr<CefBrowser> browser, CefRefPtr<CefRequest> request,
|
||||||
CefString& redirectUrl, CefRefPtr<CefStreamReader>& resourceStream,
|
CefString& redirectUrl, CefRefPtr<CefStreamReader>& resourceStream,
|
||||||
CefString& mimeType, int loadFlags)
|
CefRefPtr<CefResponse> response, int loadFlags)
|
||||||
{
|
{
|
||||||
REQUIRE_IO_THREAD();
|
REQUIRE_IO_THREAD();
|
||||||
|
|
||||||
@ -706,35 +706,43 @@ CefHandler::RetVal ClientHandler::HandleBeforeResourceLoad(
|
|||||||
DumpRequestContents(request, dump);
|
DumpRequestContents(request, dump);
|
||||||
resourceStream =
|
resourceStream =
|
||||||
CefStreamReader::CreateForData((void*)dump.c_str(), dump.size());
|
CefStreamReader::CreateForData((void*)dump.c_str(), dump.size());
|
||||||
mimeType = "text/plain";
|
response->SetMimeType("text/plain");
|
||||||
|
response->SetStatus(200);
|
||||||
} else if(strstr(url.c_str(), "/ps_logo2.png") != NULL) {
|
} else if(strstr(url.c_str(), "/ps_logo2.png") != NULL) {
|
||||||
// Any time we find "ps_logo2.png" in the URL substitute in our own image
|
// Any time we find "ps_logo2.png" in the URL substitute in our own image
|
||||||
resourceStream = GetBinaryResourceReader(IDS_LOGO);
|
resourceStream = GetBinaryResourceReader(IDS_LOGO);
|
||||||
mimeType = "image/png";
|
response->SetMimeType("image/png");
|
||||||
|
response->SetStatus(200);
|
||||||
} else if(url == "http://tests/uiapp") {
|
} else if(url == "http://tests/uiapp") {
|
||||||
// Show the uiapp contents
|
// Show the uiapp contents
|
||||||
resourceStream = GetBinaryResourceReader(IDS_UIPLUGIN);
|
resourceStream = GetBinaryResourceReader(IDS_UIPLUGIN);
|
||||||
mimeType = "text/html";
|
response->SetMimeType("text/html");
|
||||||
|
response->SetStatus(200);
|
||||||
} else if(url == "http://tests/osrapp") {
|
} else if(url == "http://tests/osrapp") {
|
||||||
// Show the osrapp contents
|
// Show the osrapp contents
|
||||||
resourceStream = GetBinaryResourceReader(IDS_OSRPLUGIN);
|
resourceStream = GetBinaryResourceReader(IDS_OSRPLUGIN);
|
||||||
mimeType = "text/html";
|
response->SetMimeType("text/html");
|
||||||
|
response->SetStatus(200);
|
||||||
} else if(url == "http://tests/localstorage") {
|
} else if(url == "http://tests/localstorage") {
|
||||||
// Show the localstorage contents
|
// Show the localstorage contents
|
||||||
resourceStream = GetBinaryResourceReader(IDS_LOCALSTORAGE);
|
resourceStream = GetBinaryResourceReader(IDS_LOCALSTORAGE);
|
||||||
mimeType = "text/html";
|
response->SetMimeType("text/html");
|
||||||
|
response->SetStatus(200);
|
||||||
} else if(url == "http://tests/xmlhttprequest") {
|
} else if(url == "http://tests/xmlhttprequest") {
|
||||||
// Show the xmlhttprequest HTML contents
|
// Show the xmlhttprequest HTML contents
|
||||||
resourceStream = GetBinaryResourceReader(IDS_XMLHTTPREQUEST);
|
resourceStream = GetBinaryResourceReader(IDS_XMLHTTPREQUEST);
|
||||||
mimeType = "text/html";
|
response->SetMimeType("text/html");
|
||||||
|
response->SetStatus(200);
|
||||||
} else if(url == "http://tests/domaccess") {
|
} else if(url == "http://tests/domaccess") {
|
||||||
// Show the domaccess HTML contents
|
// Show the domaccess HTML contents
|
||||||
resourceStream = GetBinaryResourceReader(IDS_DOMACCESS);
|
resourceStream = GetBinaryResourceReader(IDS_DOMACCESS);
|
||||||
mimeType = "text/html";
|
response->SetMimeType("text/html");
|
||||||
|
response->SetStatus(200);
|
||||||
} else if(strstr(url.c_str(), "/logoball.png") != NULL) {
|
} else if(strstr(url.c_str(), "/logoball.png") != NULL) {
|
||||||
// Load the "logoball.png" image resource.
|
// Load the "logoball.png" image resource.
|
||||||
resourceStream = GetBinaryResourceReader(IDS_LOGOBALL);
|
resourceStream = GetBinaryResourceReader(IDS_LOGOBALL);
|
||||||
mimeType = "image/png";
|
response->SetMimeType("image/png");
|
||||||
|
response->SetStatus(200);
|
||||||
}
|
}
|
||||||
return RV_CONTINUE;
|
return RV_CONTINUE;
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ function execXMLHttpRequest()
|
|||||||
xhr.open("GET",document.getElementById("url").value,false);
|
xhr.open("GET",document.getElementById("url").value,false);
|
||||||
xhr.setRequestHeader('My-Custom-Header', 'Some Value');
|
xhr.setRequestHeader('My-Custom-Header', 'Some Value');
|
||||||
xhr.send();
|
xhr.send();
|
||||||
document.getElementById('ta').value = "Request\n\n"+xhr.responseText;
|
document.getElementById('ta').value = "Status Code: "+xhr.status+"\n\n"+xhr.responseText;
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<form>
|
<form>
|
||||||
|
@ -29,7 +29,8 @@ public:
|
|||||||
// specified number of bytes have been read. If there is a response set
|
// specified number of bytes have been read. If there is a response set
|
||||||
// |mime_type| to the mime type for the response.
|
// |mime_type| to the mime type for the response.
|
||||||
virtual bool ProcessRequest(CefRefPtr<CefRequest> request,
|
virtual bool ProcessRequest(CefRefPtr<CefRequest> request,
|
||||||
CefString& mime_type, int* response_length)
|
CefRefPtr<CefResponse> response,
|
||||||
|
int* response_length)
|
||||||
{
|
{
|
||||||
REQUIRE_IO_THREAD();
|
REQUIRE_IO_THREAD();
|
||||||
|
|
||||||
@ -60,7 +61,8 @@ public:
|
|||||||
handled = true;
|
handled = true;
|
||||||
|
|
||||||
// Set the resulting mime type
|
// Set the resulting mime type
|
||||||
mime_type = "text/html";
|
response->SetMimeType("text/html");
|
||||||
|
response->SetStatus(200);
|
||||||
}
|
}
|
||||||
else if(strstr(url.c_str(), "client.png") != NULL) {
|
else if(strstr(url.c_str(), "client.png") != NULL) {
|
||||||
// Load the response image
|
// Load the response image
|
||||||
@ -70,7 +72,9 @@ public:
|
|||||||
if(LoadBinaryResource(IDS_LOGO, dwSize, pBytes)) {
|
if(LoadBinaryResource(IDS_LOGO, dwSize, pBytes)) {
|
||||||
data_ = std::string(reinterpret_cast<const char*>(pBytes), dwSize);
|
data_ = std::string(reinterpret_cast<const char*>(pBytes), dwSize);
|
||||||
handled = true;
|
handled = true;
|
||||||
mime_type = "image/png";
|
// Set the resulting mime type
|
||||||
|
response->SetMimeType("image/jpg");
|
||||||
|
response->SetStatus(200);
|
||||||
}
|
}
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if(LoadBinaryResource("logo.png", data_)) {
|
if(LoadBinaryResource("logo.png", data_)) {
|
||||||
|
@ -259,7 +259,7 @@ public:
|
|||||||
CefRefPtr<CefRequest> request,
|
CefRefPtr<CefRequest> request,
|
||||||
CefString& redirectUrl,
|
CefString& redirectUrl,
|
||||||
CefRefPtr<CefStreamReader>& resourceStream,
|
CefRefPtr<CefStreamReader>& resourceStream,
|
||||||
CefString& mimeType,
|
CefRefPtr<CefResponse> response,
|
||||||
int loadFlags)
|
int loadFlags)
|
||||||
{
|
{
|
||||||
g_RequestSendRecvTestHandlerHandleBeforeResourceLoadCalled = true;
|
g_RequestSendRecvTestHandlerHandleBeforeResourceLoadCalled = true;
|
||||||
|
315
tests/unittests/scheme_handler_unittest.cc
Normal file
315
tests/unittests/scheme_handler_unittest.cc
Normal file
@ -0,0 +1,315 @@
|
|||||||
|
// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights
|
||||||
|
// reserved. Use of this source code is governed by a BSD-style license that
|
||||||
|
// can be found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "test_handler.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
class TestResults
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TestResults()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset()
|
||||||
|
{
|
||||||
|
url.clear();
|
||||||
|
html.clear();
|
||||||
|
status_code = 0;
|
||||||
|
got_request.reset();
|
||||||
|
got_read.reset();
|
||||||
|
got_output.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string url;
|
||||||
|
std::string html;
|
||||||
|
int status_code;
|
||||||
|
|
||||||
|
TrackCallback
|
||||||
|
got_request,
|
||||||
|
got_read,
|
||||||
|
got_output;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TestSchemeHandler : public TestHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TestSchemeHandler(TestResults* tr)
|
||||||
|
: test_results_(tr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void RunTest()
|
||||||
|
{
|
||||||
|
CreateBrowser(test_results_->url);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual RetVal HandleLoadEnd(CefRefPtr<CefBrowser> browser,
|
||||||
|
CefRefPtr<CefFrame> frame,
|
||||||
|
int httpStatusCode)
|
||||||
|
{
|
||||||
|
// Test that the output is correct.
|
||||||
|
std::string output = frame->GetSource();
|
||||||
|
if (output == test_results_->html)
|
||||||
|
test_results_->got_output.yes();
|
||||||
|
|
||||||
|
// Test that the status code is correct.
|
||||||
|
EXPECT_EQ(httpStatusCode, test_results_->status_code);
|
||||||
|
|
||||||
|
DestroyTest();
|
||||||
|
|
||||||
|
return RV_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
TestResults* test_results_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ClientSchemeHandler : public CefThreadSafeBase<CefSchemeHandler>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ClientSchemeHandler(TestResults* tr)
|
||||||
|
: test_results_(tr), offset_(0) {}
|
||||||
|
|
||||||
|
virtual bool ProcessRequest(CefRefPtr<CefRequest> request,
|
||||||
|
CefRefPtr<CefResponse> response,
|
||||||
|
int* response_length)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(CefCurrentlyOn(TID_IO));
|
||||||
|
|
||||||
|
test_results_->got_request.yes();
|
||||||
|
|
||||||
|
std::string url = request->GetURL();
|
||||||
|
EXPECT_EQ(url, test_results_->url);
|
||||||
|
|
||||||
|
response->SetStatus(test_results_->status_code);
|
||||||
|
|
||||||
|
bool handled = !test_results_->html.empty();
|
||||||
|
if(handled) {
|
||||||
|
response->SetMimeType("text/html");
|
||||||
|
*response_length = test_results_->html.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
return handled;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void Cancel()
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(CefCurrentlyOn(TID_IO));
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool ReadResponse(void* data_out, int bytes_to_read, int* bytes_read)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(CefCurrentlyOn(TID_IO));
|
||||||
|
|
||||||
|
test_results_->got_read.yes();
|
||||||
|
|
||||||
|
bool has_data = false;
|
||||||
|
*bytes_read = 0;
|
||||||
|
|
||||||
|
Lock();
|
||||||
|
|
||||||
|
size_t size = test_results_->html.size();
|
||||||
|
if(offset_ < size) {
|
||||||
|
int transfer_size =
|
||||||
|
std::min(bytes_to_read, static_cast<int>(size - offset_));
|
||||||
|
memcpy(data_out, test_results_->html.c_str() + offset_, transfer_size);
|
||||||
|
offset_ += transfer_size;
|
||||||
|
|
||||||
|
*bytes_read = transfer_size;
|
||||||
|
has_data = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Unlock();
|
||||||
|
|
||||||
|
return has_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
TestResults* test_results_;
|
||||||
|
size_t offset_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ClientSchemeHandlerFactory :
|
||||||
|
public CefThreadSafeBase<CefSchemeHandlerFactory>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ClientSchemeHandlerFactory(TestResults* tr)
|
||||||
|
: test_results_(tr){}
|
||||||
|
|
||||||
|
virtual CefRefPtr<CefSchemeHandler> Create()
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(CefCurrentlyOn(TID_IO));
|
||||||
|
return new ClientSchemeHandler(test_results_);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestResults* test_results_;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Global test results object.
|
||||||
|
TestResults g_TestResults;
|
||||||
|
|
||||||
|
void CreateStandardTestScheme()
|
||||||
|
{
|
||||||
|
g_TestResults.reset();
|
||||||
|
static bool registered = false;
|
||||||
|
if (!registered) {
|
||||||
|
CefRegisterScheme("stdscheme", "tests", true,
|
||||||
|
new ClientSchemeHandlerFactory(&g_TestResults));
|
||||||
|
registered = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreateNonStandardTestScheme()
|
||||||
|
{
|
||||||
|
g_TestResults.reset();
|
||||||
|
static bool registered = false;
|
||||||
|
if (!registered) {
|
||||||
|
CefRegisterScheme("nonstdscheme", CefString(), false,
|
||||||
|
new ClientSchemeHandlerFactory(&g_TestResults));
|
||||||
|
registered = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // anonymous
|
||||||
|
|
||||||
|
// Test that a standard scheme can return normal results.
|
||||||
|
TEST(SchemeHandlerTest, StandardSchemeNormalResponse)
|
||||||
|
{
|
||||||
|
CreateStandardTestScheme();
|
||||||
|
g_TestResults.url = "stdscheme://tests/run.html";
|
||||||
|
g_TestResults.html =
|
||||||
|
"<html><head></head><body><h1>Success!</h1></body></html>";
|
||||||
|
g_TestResults.status_code = 200;
|
||||||
|
|
||||||
|
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
|
||||||
|
handler->ExecuteTest();
|
||||||
|
|
||||||
|
EXPECT_TRUE(g_TestResults.got_request);
|
||||||
|
EXPECT_TRUE(g_TestResults.got_read);
|
||||||
|
EXPECT_TRUE(g_TestResults.got_output);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test that a standard scheme can return an error code.
|
||||||
|
TEST(SchemeHandlerTest, StandardSchemeErrorResponse)
|
||||||
|
{
|
||||||
|
CreateStandardTestScheme();
|
||||||
|
g_TestResults.url = "stdscheme://tests/run.html";
|
||||||
|
g_TestResults.html =
|
||||||
|
"<html><head></head><body><h1>404</h1></body></html>";
|
||||||
|
g_TestResults.status_code = 404;
|
||||||
|
|
||||||
|
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
|
||||||
|
handler->ExecuteTest();
|
||||||
|
|
||||||
|
EXPECT_TRUE(g_TestResults.got_request);
|
||||||
|
EXPECT_TRUE(g_TestResults.got_read);
|
||||||
|
EXPECT_TRUE(g_TestResults.got_output);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test that standard scheme handling fails when the scheme name is incorrect.
|
||||||
|
TEST(SchemeHandlerTest, StandardSchemeNameNotHandled)
|
||||||
|
{
|
||||||
|
CreateStandardTestScheme();
|
||||||
|
g_TestResults.url = "stdscheme2://tests/run.html";
|
||||||
|
|
||||||
|
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
|
||||||
|
handler->ExecuteTest();
|
||||||
|
|
||||||
|
EXPECT_FALSE(g_TestResults.got_request);
|
||||||
|
EXPECT_FALSE(g_TestResults.got_read);
|
||||||
|
EXPECT_FALSE(g_TestResults.got_output);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test that standard scheme handling fails when the domain name is incorrect.
|
||||||
|
TEST(SchemeHandlerTest, StandardSchemeDomainNotHandled)
|
||||||
|
{
|
||||||
|
CreateStandardTestScheme();
|
||||||
|
g_TestResults.url = "stdscheme://tests2/run.html";
|
||||||
|
|
||||||
|
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
|
||||||
|
handler->ExecuteTest();
|
||||||
|
|
||||||
|
EXPECT_FALSE(g_TestResults.got_request);
|
||||||
|
EXPECT_FALSE(g_TestResults.got_read);
|
||||||
|
EXPECT_FALSE(g_TestResults.got_output);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test that a standard scheme can return no response.
|
||||||
|
TEST(SchemeHandlerTest, StandardSchemeNoResponse)
|
||||||
|
{
|
||||||
|
CreateStandardTestScheme();
|
||||||
|
g_TestResults.url = "stdscheme://tests/run.html";
|
||||||
|
|
||||||
|
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
|
||||||
|
handler->ExecuteTest();
|
||||||
|
|
||||||
|
EXPECT_TRUE(g_TestResults.got_request);
|
||||||
|
EXPECT_FALSE(g_TestResults.got_read);
|
||||||
|
EXPECT_FALSE(g_TestResults.got_output);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test that a non-standard scheme can return normal results.
|
||||||
|
TEST(SchemeHandlerTest, NonStandardSchemeNormalResponse)
|
||||||
|
{
|
||||||
|
CreateNonStandardTestScheme();
|
||||||
|
g_TestResults.url = "nonstdscheme:some%20value";
|
||||||
|
g_TestResults.html =
|
||||||
|
"<html><head></head><body><h1>Success!</h1></body></html>";
|
||||||
|
g_TestResults.status_code = 200;
|
||||||
|
|
||||||
|
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
|
||||||
|
handler->ExecuteTest();
|
||||||
|
|
||||||
|
EXPECT_TRUE(g_TestResults.got_request);
|
||||||
|
EXPECT_TRUE(g_TestResults.got_read);
|
||||||
|
EXPECT_TRUE(g_TestResults.got_output);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test that a non-standard scheme can return an error code.
|
||||||
|
TEST(SchemeHandlerTest, NonStandardSchemeErrorResponse)
|
||||||
|
{
|
||||||
|
CreateNonStandardTestScheme();
|
||||||
|
g_TestResults.url = "nonstdscheme:some%20value";
|
||||||
|
g_TestResults.html =
|
||||||
|
"<html><head></head><body><h1>404</h1></body></html>";
|
||||||
|
g_TestResults.status_code = 404;
|
||||||
|
|
||||||
|
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
|
||||||
|
handler->ExecuteTest();
|
||||||
|
|
||||||
|
EXPECT_TRUE(g_TestResults.got_request);
|
||||||
|
EXPECT_TRUE(g_TestResults.got_read);
|
||||||
|
EXPECT_TRUE(g_TestResults.got_output);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test that non-standard scheme handling fails when the scheme name is
|
||||||
|
// incorrect.
|
||||||
|
TEST(SchemeHandlerTest, NonStandardSchemeNameNotHandled)
|
||||||
|
{
|
||||||
|
CreateNonStandardTestScheme();
|
||||||
|
g_TestResults.url = "nonstdscheme2:some%20value";
|
||||||
|
|
||||||
|
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
|
||||||
|
handler->ExecuteTest();
|
||||||
|
|
||||||
|
EXPECT_FALSE(g_TestResults.got_request);
|
||||||
|
EXPECT_FALSE(g_TestResults.got_read);
|
||||||
|
EXPECT_FALSE(g_TestResults.got_output);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test that a non-standard scheme can return no response.
|
||||||
|
TEST(SchemeHandlerTest, NonStandardSchemeNoResponse)
|
||||||
|
{
|
||||||
|
CreateNonStandardTestScheme();
|
||||||
|
g_TestResults.url = "nonstdscheme:some%20value";
|
||||||
|
|
||||||
|
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
|
||||||
|
handler->ExecuteTest();
|
||||||
|
|
||||||
|
EXPECT_TRUE(g_TestResults.got_request);
|
||||||
|
EXPECT_FALSE(g_TestResults.got_read);
|
||||||
|
EXPECT_FALSE(g_TestResults.got_output);
|
||||||
|
}
|
@ -15,6 +15,7 @@ public:
|
|||||||
TrackCallback(): gotit_(false) {}
|
TrackCallback(): gotit_(false) {}
|
||||||
void yes() { gotit_ = true; }
|
void yes() { gotit_ = true; }
|
||||||
bool isSet() { return gotit_; }
|
bool isSet() { return gotit_; }
|
||||||
|
void reset() { gotit_ = false; }
|
||||||
operator bool() const { return gotit_; }
|
operator bool() const { return gotit_; }
|
||||||
protected:
|
protected:
|
||||||
bool gotit_;
|
bool gotit_;
|
||||||
@ -111,7 +112,7 @@ public:
|
|||||||
CefRefPtr<CefRequest> request,
|
CefRefPtr<CefRequest> request,
|
||||||
CefString& redirectUrl,
|
CefString& redirectUrl,
|
||||||
CefRefPtr<CefStreamReader>& resourceStream,
|
CefRefPtr<CefStreamReader>& resourceStream,
|
||||||
CefString& mimeType,
|
CefRefPtr<CefResponse> response,
|
||||||
int loadFlags)
|
int loadFlags)
|
||||||
{
|
{
|
||||||
Lock();
|
Lock();
|
||||||
@ -122,7 +123,8 @@ public:
|
|||||||
// Return the previously mapped resource
|
// Return the previously mapped resource
|
||||||
resourceStream = CefStreamReader::CreateForData(
|
resourceStream = CefStreamReader::CreateForData(
|
||||||
(void*)it->second.first.c_str(), it->second.first.length());
|
(void*)it->second.first.c_str(), it->second.first.length());
|
||||||
mimeType = it->second.second;
|
response->SetMimeType(it->second.second);
|
||||||
|
response->SetStatus(200);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Unlock();
|
Unlock();
|
||||||
|
Reference in New Issue
Block a user