Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2054)

Unified Diff: content/renderer/render_frame_impl.cc

Issue 1304373007: Browser test for LoadDataWithBaseURL reload (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: reverts Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..1ac25e120f877651cb6a5f5037715d71001ec32a 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.
Charlie Reis 2015/11/24 00:22:59 nit: Add: "(if any), storing it in |output|."
boliu 2015/11/24 19:03:25 Done.
+// Return true if there is an override URL.
Charlie Reis 2015/11/24 00:22:59 nit: Returns (to be consistent with "Gets")
boliu 2015/11/24 19:03:25 Done.
+bool MaybeGetURLOverride(WebDataSource* ds, GURL* output) {
Charlie Reis 2015/11/24 00:22:59 nit: MaybeGetOverriddenURL
boliu 2015/11/24 19:03:25 Done.
+ 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 (MaybeGetURLOverride(ds, &overriden_url))
+ return overriden_url;
std::vector<GURL> redirects;
GetRedirectChain(ds, &redirects);
@@ -2614,7 +2635,11 @@ void RenderFrameImpl::didCreateDataSource(blink::WebLocalFrame* frame,
PopulateDocumentStateFromPending(document_state);
}
- // Carry over the user agent override flag, if it exists.
+ // The rest of RenderView assumes that a WebDataSource will always have a
+ // non-null NavigationState.
+ UpdateNavigationState(document_state);
+
+ // Carry over the user agent override flag and data URL if necessary.
blink::WebView* webview = render_view_->webview();
if (content_initiated && webview && webview->mainFrame() &&
webview->mainFrame()->isWebLocalFrame() &&
@@ -2628,13 +2653,13 @@ void RenderFrameImpl::didCreateDataSource(blink::WebLocalFrame* frame,
InternalDocumentStateData::FromDocumentState(old_document_state);
internal_data->set_is_overriding_user_agent(
old_internal_data->is_overriding_user_agent());
+
+ document_state->set_was_load_data_with_base_url_request(
Charlie Reis 2015/11/24 00:22:59 Looking closer, I'm skeptical about this call. Wo
boliu 2015/11/24 19:03:25 Err, this is not needed afaict. in-page navigation
Charlie Reis 2015/11/24 19:32:38 Great, I'm glad it's not needed.
+ old_document_state->was_load_data_with_base_url_request());
+ document_state->set_data_url(old_document_state->data_url());
}
}
- // The rest of RenderView assumes that a WebDataSource will always have a
- // non-null NavigationState.
- UpdateNavigationState(document_state);
-
// DocumentState::referred_by_prefetcher_ is true if we are
// navigating from a page that used prefetching using a link on that
// page. We are early enough in the request process here that we
@@ -4840,7 +4865,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 +5105,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 +5185,10 @@ bool RenderFrameImpl::ShouldDisplayErrorPageForFailedLoad(
GURL RenderFrameImpl::GetLoadingUrl() const {
WebDataSource* ds = frame_->dataSource();
- if (ds->hasUnreachableURL())
- return ds->unreachableURL();
+
+ GURL overriden_url;
+ if (MaybeGetURLOverride(ds, &overriden_url))
+ return overriden_url;
const WebURLRequest& request = ds->request();
return request.url();
@@ -5224,6 +5255,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(

Powered by Google App Engine
This is Rietveld 408576698