Fix loading of http(s) sub-resources from custom scheme initiator (fixes issue #2685, see issue #2622).
Determine external request status based on the current URL instead of the request initiator.
This commit is contained in:
parent
732a307c75
commit
02a6b3bb38
|
@ -241,8 +241,7 @@ class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler {
|
||||||
int frame_tree_node_id,
|
int frame_tree_node_id,
|
||||||
bool is_navigation,
|
bool is_navigation,
|
||||||
bool is_download,
|
bool is_download,
|
||||||
const url::Origin& request_initiator,
|
const url::Origin& request_initiator) {
|
||||||
bool is_external) {
|
|
||||||
CEF_REQUIRE_UIT();
|
CEF_REQUIRE_UIT();
|
||||||
|
|
||||||
browser_context_ = browser_context;
|
browser_context_ = browser_context;
|
||||||
|
@ -271,7 +270,6 @@ class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler {
|
||||||
is_navigation_ = is_navigation;
|
is_navigation_ = is_navigation;
|
||||||
is_download_ = is_download;
|
is_download_ = is_download;
|
||||||
request_initiator_ = request_initiator.Serialize();
|
request_initiator_ = request_initiator.Serialize();
|
||||||
is_external_ = is_external;
|
|
||||||
|
|
||||||
// Default values for standard headers.
|
// Default values for standard headers.
|
||||||
accept_language_ = ComputeAcceptLanguageFromPref(
|
accept_language_ = ComputeAcceptLanguageFromPref(
|
||||||
|
@ -295,7 +293,6 @@ class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler {
|
||||||
bool is_navigation_ = true;
|
bool is_navigation_ = true;
|
||||||
bool is_download_ = false;
|
bool is_download_ = false;
|
||||||
CefString request_initiator_;
|
CefString request_initiator_;
|
||||||
bool is_external_ = false;
|
|
||||||
|
|
||||||
// Default values for standard headers.
|
// Default values for standard headers.
|
||||||
std::string accept_language_;
|
std::string accept_language_;
|
||||||
|
@ -417,8 +414,10 @@ class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler {
|
||||||
request->headers.SetHeaderIfMissing(net::HttpRequestHeaders::kUserAgent,
|
request->headers.SetHeaderIfMissing(net::HttpRequestHeaders::kUserAgent,
|
||||||
init_state_->user_agent_);
|
init_state_->user_agent_);
|
||||||
|
|
||||||
|
const bool is_external = IsExternalRequest(request);
|
||||||
|
|
||||||
// External requests will not have a default handler.
|
// External requests will not have a default handler.
|
||||||
bool intercept_only = init_state_->is_external_;
|
bool intercept_only = is_external;
|
||||||
|
|
||||||
CefRefPtr<CefRequestImpl> requestPtr;
|
CefRefPtr<CefRequestImpl> requestPtr;
|
||||||
CefRefPtr<CefResourceRequestHandler> handler =
|
CefRefPtr<CefResourceRequestHandler> handler =
|
||||||
|
@ -446,7 +445,7 @@ class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler {
|
||||||
|
|
||||||
auto exec_callback =
|
auto exec_callback =
|
||||||
base::BindOnce(std::move(callback), maybe_intercept_request,
|
base::BindOnce(std::move(callback), maybe_intercept_request,
|
||||||
init_state_->is_external_ ? true : intercept_only);
|
is_external ? true : intercept_only);
|
||||||
|
|
||||||
if (!maybe_intercept_request) {
|
if (!maybe_intercept_request) {
|
||||||
// Cookies will be handled by the NetworkService.
|
// Cookies will be handled by the NetworkService.
|
||||||
|
@ -936,11 +935,12 @@ class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const bool is_external = IsExternalRequest(&request);
|
||||||
|
|
||||||
// Redirection of standard custom schemes is handled with a restart, so we
|
// Redirection of standard custom schemes is handled with a restart, so we
|
||||||
// get completion notifications for both the original (redirected) request
|
// get completion notifications for both the original (redirected) request
|
||||||
// and the final request. Don't report completion of the redirected request.
|
// and the final request. Don't report completion of the redirected request.
|
||||||
const bool ignore_result = init_state_->is_external_ &&
|
const bool ignore_result = is_external && request.url.IsStandard() &&
|
||||||
request.url.IsStandard() &&
|
|
||||||
status.error_code == net::ERR_ABORTED &&
|
status.error_code == net::ERR_ABORTED &&
|
||||||
state->pending_response_.get() &&
|
state->pending_response_.get() &&
|
||||||
net::HttpResponseHeaders::IsRedirectResponseCode(
|
net::HttpResponseHeaders::IsRedirectResponseCode(
|
||||||
|
@ -951,7 +951,7 @@ class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler {
|
||||||
|
|
||||||
CallHandlerOnComplete(state, status);
|
CallHandlerOnComplete(state, status);
|
||||||
|
|
||||||
if (status.error_code != 0 && init_state_->is_external_) {
|
if (status.error_code != 0 && is_external) {
|
||||||
bool allow_os_execution = false;
|
bool allow_os_execution = false;
|
||||||
state->handler_->OnProtocolExecution(
|
state->handler_->OnProtocolExecution(
|
||||||
init_state_->browser_, init_state_->frame_,
|
init_state_->browser_, init_state_->frame_,
|
||||||
|
@ -1128,6 +1128,11 @@ class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler {
|
||||||
return requestPtr;
|
return requestPtr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns true if |request| cannot be handled internally.
|
||||||
|
static bool IsExternalRequest(const network::ResourceRequest* request) {
|
||||||
|
return !scheme::IsInternalHandledScheme(request->url.scheme());
|
||||||
|
}
|
||||||
|
|
||||||
scoped_refptr<InitHelper> init_helper_;
|
scoped_refptr<InitHelper> init_helper_;
|
||||||
std::unique_ptr<InitState> init_state_;
|
std::unique_ptr<InitState> init_state_;
|
||||||
|
|
||||||
|
@ -1224,7 +1229,7 @@ void InitOnUIThread(
|
||||||
init_state->Initialize(browser_context, browserPtr, framePtr,
|
init_state->Initialize(browser_context, browserPtr, framePtr,
|
||||||
render_process_id, request.render_frame_id,
|
render_process_id, request.render_frame_id,
|
||||||
frame_tree_node_id, is_navigation, is_download,
|
frame_tree_node_id, is_navigation, is_download,
|
||||||
request_initiator, true /* is_external */);
|
request_initiator);
|
||||||
|
|
||||||
init_helper->MaybeSetInitialized(std::move(init_state));
|
init_helper->MaybeSetInitialized(std::move(init_state));
|
||||||
}
|
}
|
||||||
|
@ -1255,17 +1260,11 @@ std::unique_ptr<InterceptedRequestHandler> CreateInterceptedRequestHandler(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Flag subresource loads of custom schemes.
|
|
||||||
const bool is_external =
|
|
||||||
!is_navigation && !is_download && !request_initiator.scheme().empty() &&
|
|
||||||
!scheme::IsInternalHandledScheme(request_initiator.scheme());
|
|
||||||
|
|
||||||
auto init_state =
|
auto init_state =
|
||||||
std::make_unique<InterceptedRequestHandlerWrapper::InitState>();
|
std::make_unique<InterceptedRequestHandlerWrapper::InitState>();
|
||||||
init_state->Initialize(browser_context, browserPtr, framePtr,
|
init_state->Initialize(browser_context, browserPtr, framePtr,
|
||||||
render_process_id, render_frame_id, frame_tree_node_id,
|
render_process_id, render_frame_id, frame_tree_node_id,
|
||||||
is_navigation, is_download, request_initiator,
|
is_navigation, is_download, request_initiator);
|
||||||
is_external);
|
|
||||||
|
|
||||||
auto wrapper = std::make_unique<InterceptedRequestHandlerWrapper>();
|
auto wrapper = std::make_unique<InterceptedRequestHandlerWrapper>();
|
||||||
wrapper->init_helper()->MaybeSetInitialized(std::move(init_state));
|
wrapper->init_helper()->MaybeSetInitialized(std::move(init_state));
|
||||||
|
|
Loading…
Reference in New Issue