| Index: content/renderer/render_frame_impl.cc
|
| diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
|
| index 8ab011d7f3a8acb0145c0cd6233d7404def82219..8a8f31af59987977ada118fe7f3451f3a3fcc25c 100644
|
| --- a/content/renderer/render_frame_impl.cc
|
| +++ b/content/renderer/render_frame_impl.cc
|
| @@ -307,16 +307,37 @@ void GetRedirectChain(WebDataSource* ds, std::vector<GURL>* result) {
|
| }
|
| }
|
|
|
| -// Returns the original request url. If there is no redirect, the original
|
| -// url is the same as ds->request()->url(). If the WebDataSource belongs to a
|
| -// frame was loaded by loadData, the original url will be ds->unreachableURL()
|
| -GURL GetOriginalRequestURL(WebDataSource* ds) {
|
| +// Gets URL that should override the default getter for this data source
|
| +// (if any), storing it in |output|. Returns true if there is an override URL.
|
| +bool MaybeGetOverriddenURL(WebDataSource* ds, GURL* output) {
|
| + DocumentState* document_state = DocumentState::FromDataSource(ds);
|
| +
|
| + // If load was from a data URL, then the saved data URL, not the history
|
| + // URL, should be the URL of the data source.
|
| + if (document_state->was_load_data_with_base_url_request()) {
|
| + *output = document_state->data_url();
|
| + return true;
|
| + }
|
| +
|
| // WebDataSource has unreachable URL means that the frame is loaded through
|
| // blink::WebFrame::loadData(), and the base URL will be in the redirect
|
| // chain. However, we never visited the baseURL. So in this case, we should
|
| // use the unreachable URL as the original URL.
|
| - if (ds->hasUnreachableURL())
|
| - return ds->unreachableURL();
|
| + if (ds->hasUnreachableURL()) {
|
| + *output = ds->unreachableURL();
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| +}
|
| +
|
| +// Returns the original request url. If there is no redirect, the original
|
| +// url is the same as ds->request()->url(). If the WebDataSource belongs to a
|
| +// frame was loaded by loadData, the original url will be ds->unreachableURL()
|
| +GURL GetOriginalRequestURL(WebDataSource* ds) {
|
| + GURL overriden_url;
|
| + if (MaybeGetOverriddenURL(ds, &overriden_url))
|
| + return overriden_url;
|
|
|
| std::vector<GURL> redirects;
|
| GetRedirectChain(ds, &redirects);
|
| @@ -4840,7 +4861,7 @@ void RenderFrameImpl::NavigateInternal(
|
| if (!common_params.base_url_for_data_url.is_empty() ||
|
| (browser_side_navigation &&
|
| common_params.url.SchemeIs(url::kDataScheme))) {
|
| - LoadDataURL(common_params, frame_);
|
| + LoadDataURL(common_params, frame_, load_type);
|
| } else {
|
| // Load the request.
|
| frame_->toWebLocalFrame()->load(request, load_type,
|
| @@ -5080,19 +5101,23 @@ void RenderFrameImpl::BeginNavigation(blink::WebURLRequest* request) {
|
| }
|
|
|
| void RenderFrameImpl::LoadDataURL(const CommonNavigationParams& params,
|
| - WebFrame* frame) {
|
| + WebFrame* frame,
|
| + blink::WebFrameLoadType load_type) {
|
| // A loadData request with a specified base URL.
|
| std::string mime_type, charset, data;
|
| if (net::DataURL::Parse(params.url, &mime_type, &charset, &data)) {
|
| const GURL base_url = params.base_url_for_data_url.is_empty() ?
|
| params.url : params.base_url_for_data_url;
|
| + bool replace = load_type == blink::WebFrameLoadType::ReloadFromOrigin ||
|
| + load_type == blink::WebFrameLoadType::Reload;
|
| frame->loadData(
|
| WebData(data.c_str(), data.length()),
|
| WebString::fromUTF8(mime_type),
|
| WebString::fromUTF8(charset),
|
| base_url,
|
| + // Needed so that history-url-only changes don't become reloads.
|
| params.history_url_for_data_url,
|
| - false);
|
| + replace);
|
| } else {
|
| CHECK(false) << "Invalid URL passed: "
|
| << params.url.possibly_invalid_spec();
|
| @@ -5156,8 +5181,10 @@ bool RenderFrameImpl::ShouldDisplayErrorPageForFailedLoad(
|
|
|
| GURL RenderFrameImpl::GetLoadingUrl() const {
|
| WebDataSource* ds = frame_->dataSource();
|
| - if (ds->hasUnreachableURL())
|
| - return ds->unreachableURL();
|
| +
|
| + GURL overriden_url;
|
| + if (MaybeGetOverriddenURL(ds, &overriden_url))
|
| + return overriden_url;
|
|
|
| const WebURLRequest& request = ds->request();
|
| return request.url();
|
| @@ -5224,6 +5251,16 @@ void RenderFrameImpl::UpdateNavigationState(DocumentState* document_state) {
|
| base::TimeTicks::Now();
|
| }
|
| document_state->set_navigation_state(CreateNavigationStateFromPending());
|
| +
|
| + const CommonNavigationParams& common_params =
|
| + pending_navigation_params_->common_params;
|
| + bool load_data = !common_params.base_url_for_data_url.is_empty() &&
|
| + !common_params.history_url_for_data_url.is_empty() &&
|
| + common_params.url.SchemeIs(url::kDataScheme);
|
| + document_state->set_was_load_data_with_base_url_request(load_data);
|
| + if (load_data)
|
| + document_state->set_data_url(common_params.url);
|
| +
|
| pending_navigation_params_.reset();
|
| } else {
|
| document_state->set_navigation_state(
|
|
|