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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/render_frame_impl.h" 5 #include "content/renderer/render_frame_impl.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 ds->redirectChain(urls); 300 ds->redirectChain(urls);
301 result->reserve(urls.size()); 301 result->reserve(urls.size());
302 for (size_t i = 0; i < urls.size(); ++i) { 302 for (size_t i = 0; i < urls.size(); ++i) {
303 if (urls[i] != GURL(kSwappedOutURL)) 303 if (urls[i] != GURL(kSwappedOutURL))
304 result->push_back(urls[i]); 304 result->push_back(urls[i]);
305 else 305 else
306 result->push_back(blank_url); 306 result->push_back(blank_url);
307 } 307 }
308 } 308 }
309 309
310 // 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.
311 // 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.
312 bool MaybeGetURLOverride(WebDataSource* ds, GURL* output) {
Charlie Reis 2015/11/24 00:22:59 nit: MaybeGetOverriddenURL
boliu 2015/11/24 19:03:25 Done.
313 DocumentState* document_state = DocumentState::FromDataSource(ds);
314
315 // If load was from a data URL, then the saved data URL, not the history
316 // URL, should be the URL of the data source.
317 if (document_state->was_load_data_with_base_url_request()) {
318 *output = document_state->data_url();
319 return true;
320 }
321
322 // WebDataSource has unreachable URL means that the frame is loaded through
323 // blink::WebFrame::loadData(), and the base URL will be in the redirect
324 // chain. However, we never visited the baseURL. So in this case, we should
325 // use the unreachable URL as the original URL.
326 if (ds->hasUnreachableURL()) {
327 *output = ds->unreachableURL();
328 return true;
329 }
330
331 return false;
332 }
333
310 // Returns the original request url. If there is no redirect, the original 334 // Returns the original request url. If there is no redirect, the original
311 // url is the same as ds->request()->url(). If the WebDataSource belongs to a 335 // url is the same as ds->request()->url(). If the WebDataSource belongs to a
312 // frame was loaded by loadData, the original url will be ds->unreachableURL() 336 // frame was loaded by loadData, the original url will be ds->unreachableURL()
313 GURL GetOriginalRequestURL(WebDataSource* ds) { 337 GURL GetOriginalRequestURL(WebDataSource* ds) {
314 // WebDataSource has unreachable URL means that the frame is loaded through 338 GURL overriden_url;
315 // blink::WebFrame::loadData(), and the base URL will be in the redirect 339 if (MaybeGetURLOverride(ds, &overriden_url))
316 // chain. However, we never visited the baseURL. So in this case, we should 340 return overriden_url;
317 // use the unreachable URL as the original URL.
318 if (ds->hasUnreachableURL())
319 return ds->unreachableURL();
320 341
321 std::vector<GURL> redirects; 342 std::vector<GURL> redirects;
322 GetRedirectChain(ds, &redirects); 343 GetRedirectChain(ds, &redirects);
323 if (!redirects.empty()) 344 if (!redirects.empty())
324 return redirects.at(0); 345 return redirects.at(0);
325 346
326 return ds->originalRequest().url(); 347 return ds->originalRequest().url();
327 } 348 }
328 349
329 bool IsBrowserInitiated(NavigationParams* pending) { 350 bool IsBrowserInitiated(NavigationParams* pending) {
(...skipping 2277 matching lines...) Expand 10 before | Expand all | Expand 10 after
2607 } 2628 }
2608 2629
2609 DocumentState* document_state = DocumentState::FromDataSource(datasource); 2630 DocumentState* document_state = DocumentState::FromDataSource(datasource);
2610 if (!document_state) { 2631 if (!document_state) {
2611 document_state = new DocumentState; 2632 document_state = new DocumentState;
2612 datasource->setExtraData(document_state); 2633 datasource->setExtraData(document_state);
2613 if (!content_initiated) 2634 if (!content_initiated)
2614 PopulateDocumentStateFromPending(document_state); 2635 PopulateDocumentStateFromPending(document_state);
2615 } 2636 }
2616 2637
2617 // Carry over the user agent override flag, if it exists. 2638 // The rest of RenderView assumes that a WebDataSource will always have a
2639 // non-null NavigationState.
2640 UpdateNavigationState(document_state);
2641
2642 // Carry over the user agent override flag and data URL if necessary.
2618 blink::WebView* webview = render_view_->webview(); 2643 blink::WebView* webview = render_view_->webview();
2619 if (content_initiated && webview && webview->mainFrame() && 2644 if (content_initiated && webview && webview->mainFrame() &&
2620 webview->mainFrame()->isWebLocalFrame() && 2645 webview->mainFrame()->isWebLocalFrame() &&
2621 webview->mainFrame()->dataSource()) { 2646 webview->mainFrame()->dataSource()) {
2622 DocumentState* old_document_state = 2647 DocumentState* old_document_state =
2623 DocumentState::FromDataSource(webview->mainFrame()->dataSource()); 2648 DocumentState::FromDataSource(webview->mainFrame()->dataSource());
2624 if (old_document_state) { 2649 if (old_document_state) {
2625 InternalDocumentStateData* internal_data = 2650 InternalDocumentStateData* internal_data =
2626 InternalDocumentStateData::FromDocumentState(document_state); 2651 InternalDocumentStateData::FromDocumentState(document_state);
2627 InternalDocumentStateData* old_internal_data = 2652 InternalDocumentStateData* old_internal_data =
2628 InternalDocumentStateData::FromDocumentState(old_document_state); 2653 InternalDocumentStateData::FromDocumentState(old_document_state);
2629 internal_data->set_is_overriding_user_agent( 2654 internal_data->set_is_overriding_user_agent(
2630 old_internal_data->is_overriding_user_agent()); 2655 old_internal_data->is_overriding_user_agent());
2656
2657 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.
2658 old_document_state->was_load_data_with_base_url_request());
2659 document_state->set_data_url(old_document_state->data_url());
2631 } 2660 }
2632 } 2661 }
2633 2662
2634 // The rest of RenderView assumes that a WebDataSource will always have a
2635 // non-null NavigationState.
2636 UpdateNavigationState(document_state);
2637
2638 // DocumentState::referred_by_prefetcher_ is true if we are 2663 // DocumentState::referred_by_prefetcher_ is true if we are
2639 // navigating from a page that used prefetching using a link on that 2664 // navigating from a page that used prefetching using a link on that
2640 // page. We are early enough in the request process here that we 2665 // page. We are early enough in the request process here that we
2641 // can still see the DocumentState of the previous page and set 2666 // can still see the DocumentState of the previous page and set
2642 // this value appropriately. 2667 // this value appropriately.
2643 // TODO(gavinp): catch the important case of navigation in a new 2668 // TODO(gavinp): catch the important case of navigation in a new
2644 // renderer process. 2669 // renderer process.
2645 if (webview) { 2670 if (webview) {
2646 if (WebFrame* old_frame = webview->mainFrame()) { 2671 if (WebFrame* old_frame = webview->mainFrame()) {
2647 const WebURLRequest& original_request = datasource->originalRequest(); 2672 const WebURLRequest& original_request = datasource->originalRequest();
(...skipping 2185 matching lines...) Expand 10 before | Expand all | Expand 10 after
4833 4858
4834 if (should_load_request) { 4859 if (should_load_request) {
4835 // Sanitize navigation start now that we know the load_type. 4860 // Sanitize navigation start now that we know the load_type.
4836 pending_navigation_params_->common_params.navigation_start = 4861 pending_navigation_params_->common_params.navigation_start =
4837 SanitizeNavigationTiming(load_type, common_params.navigation_start, 4862 SanitizeNavigationTiming(load_type, common_params.navigation_start,
4838 renderer_navigation_start); 4863 renderer_navigation_start);
4839 // Perform a navigation to a data url if needed. 4864 // Perform a navigation to a data url if needed.
4840 if (!common_params.base_url_for_data_url.is_empty() || 4865 if (!common_params.base_url_for_data_url.is_empty() ||
4841 (browser_side_navigation && 4866 (browser_side_navigation &&
4842 common_params.url.SchemeIs(url::kDataScheme))) { 4867 common_params.url.SchemeIs(url::kDataScheme))) {
4843 LoadDataURL(common_params, frame_); 4868 LoadDataURL(common_params, frame_, load_type);
4844 } else { 4869 } else {
4845 // Load the request. 4870 // Load the request.
4846 frame_->toWebLocalFrame()->load(request, load_type, 4871 frame_->toWebLocalFrame()->load(request, load_type,
4847 item_for_history_navigation); 4872 item_for_history_navigation);
4848 } 4873 }
4849 } 4874 }
4850 4875
4851 // In case LoadRequest failed before didCreateDataSource was called. 4876 // In case LoadRequest failed before didCreateDataSource was called.
4852 pending_navigation_params_.reset(); 4877 pending_navigation_params_.reset();
4853 } 4878 }
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
5073 MakeCommonNavigationParams(request, should_replace_current_entry), 5098 MakeCommonNavigationParams(request, should_replace_current_entry),
5074 BeginNavigationParams( 5099 BeginNavigationParams(
5075 request->httpMethod().latin1(), GetWebURLRequestHeaders(*request), 5100 request->httpMethod().latin1(), GetWebURLRequestHeaders(*request),
5076 GetLoadFlagsForWebURLRequest(*request), request->hasUserGesture(), 5101 GetLoadFlagsForWebURLRequest(*request), request->hasUserGesture(),
5077 request->skipServiceWorker(), 5102 request->skipServiceWorker(),
5078 GetRequestContextTypeForWebURLRequest(*request)), 5103 GetRequestContextTypeForWebURLRequest(*request)),
5079 GetRequestBodyForWebURLRequest(*request))); 5104 GetRequestBodyForWebURLRequest(*request)));
5080 } 5105 }
5081 5106
5082 void RenderFrameImpl::LoadDataURL(const CommonNavigationParams& params, 5107 void RenderFrameImpl::LoadDataURL(const CommonNavigationParams& params,
5083 WebFrame* frame) { 5108 WebFrame* frame,
5109 blink::WebFrameLoadType load_type) {
5084 // A loadData request with a specified base URL. 5110 // A loadData request with a specified base URL.
5085 std::string mime_type, charset, data; 5111 std::string mime_type, charset, data;
5086 if (net::DataURL::Parse(params.url, &mime_type, &charset, &data)) { 5112 if (net::DataURL::Parse(params.url, &mime_type, &charset, &data)) {
5087 const GURL base_url = params.base_url_for_data_url.is_empty() ? 5113 const GURL base_url = params.base_url_for_data_url.is_empty() ?
5088 params.url : params.base_url_for_data_url; 5114 params.url : params.base_url_for_data_url;
5115 bool replace = load_type == blink::WebFrameLoadType::ReloadFromOrigin ||
5116 load_type == blink::WebFrameLoadType::Reload;
5089 frame->loadData( 5117 frame->loadData(
5090 WebData(data.c_str(), data.length()), 5118 WebData(data.c_str(), data.length()),
5091 WebString::fromUTF8(mime_type), 5119 WebString::fromUTF8(mime_type),
5092 WebString::fromUTF8(charset), 5120 WebString::fromUTF8(charset),
5093 base_url, 5121 base_url,
5122 // Needed so that history-url-only changes don't become reloads.
5094 params.history_url_for_data_url, 5123 params.history_url_for_data_url,
5095 false); 5124 replace);
5096 } else { 5125 } else {
5097 CHECK(false) << "Invalid URL passed: " 5126 CHECK(false) << "Invalid URL passed: "
5098 << params.url.possibly_invalid_spec(); 5127 << params.url.possibly_invalid_spec();
5099 } 5128 }
5100 } 5129 }
5101 5130
5102 void RenderFrameImpl::SendUpdateState() { 5131 void RenderFrameImpl::SendUpdateState() {
5103 DCHECK(SiteIsolationPolicy::UseSubframeNavigationEntries()); 5132 DCHECK(SiteIsolationPolicy::UseSubframeNavigationEntries());
5104 if (current_history_item_.isNull()) 5133 if (current_history_item_.isNull())
5105 return; 5134 return;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
5149 if (RenderThreadImpl::current() && 5178 if (RenderThreadImpl::current() &&
5150 RenderThreadImpl::current()->layout_test_mode()) { 5179 RenderThreadImpl::current()->layout_test_mode()) {
5151 return false; 5180 return false;
5152 } 5181 }
5153 5182
5154 return true; 5183 return true;
5155 } 5184 }
5156 5185
5157 GURL RenderFrameImpl::GetLoadingUrl() const { 5186 GURL RenderFrameImpl::GetLoadingUrl() const {
5158 WebDataSource* ds = frame_->dataSource(); 5187 WebDataSource* ds = frame_->dataSource();
5159 if (ds->hasUnreachableURL()) 5188
5160 return ds->unreachableURL(); 5189 GURL overriden_url;
5190 if (MaybeGetURLOverride(ds, &overriden_url))
5191 return overriden_url;
5161 5192
5162 const WebURLRequest& request = ds->request(); 5193 const WebURLRequest& request = ds->request();
5163 return request.url(); 5194 return request.url();
5164 } 5195 }
5165 5196
5166 void RenderFrameImpl::PopulateDocumentStateFromPending( 5197 void RenderFrameImpl::PopulateDocumentStateFromPending(
5167 DocumentState* document_state) { 5198 DocumentState* document_state) {
5168 document_state->set_request_time( 5199 document_state->set_request_time(
5169 pending_navigation_params_->request_params.request_time); 5200 pending_navigation_params_->request_params.request_time);
5170 5201
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
5217 5248
5218 void RenderFrameImpl::UpdateNavigationState(DocumentState* document_state) { 5249 void RenderFrameImpl::UpdateNavigationState(DocumentState* document_state) {
5219 if (pending_navigation_params_) { 5250 if (pending_navigation_params_) {
5220 // If this is a browser-initiated load that doesn't override 5251 // If this is a browser-initiated load that doesn't override
5221 // navigation_start, set it here. 5252 // navigation_start, set it here.
5222 if (pending_navigation_params_->common_params.navigation_start.is_null()) { 5253 if (pending_navigation_params_->common_params.navigation_start.is_null()) {
5223 pending_navigation_params_->common_params.navigation_start = 5254 pending_navigation_params_->common_params.navigation_start =
5224 base::TimeTicks::Now(); 5255 base::TimeTicks::Now();
5225 } 5256 }
5226 document_state->set_navigation_state(CreateNavigationStateFromPending()); 5257 document_state->set_navigation_state(CreateNavigationStateFromPending());
5258
5259 const CommonNavigationParams& common_params =
5260 pending_navigation_params_->common_params;
5261 bool load_data = !common_params.base_url_for_data_url.is_empty() &&
5262 !common_params.history_url_for_data_url.is_empty() &&
5263 common_params.url.SchemeIs(url::kDataScheme);
5264 document_state->set_was_load_data_with_base_url_request(load_data);
5265 if (load_data)
5266 document_state->set_data_url(common_params.url);
5267
5227 pending_navigation_params_.reset(); 5268 pending_navigation_params_.reset();
5228 } else { 5269 } else {
5229 document_state->set_navigation_state( 5270 document_state->set_navigation_state(
5230 NavigationStateImpl::CreateContentInitiated()); 5271 NavigationStateImpl::CreateContentInitiated());
5231 } 5272 }
5232 } 5273 }
5233 5274
5234 #if defined(OS_ANDROID) 5275 #if defined(OS_ANDROID)
5235 WebMediaPlayer* RenderFrameImpl::CreateAndroidWebMediaPlayer( 5276 WebMediaPlayer* RenderFrameImpl::CreateAndroidWebMediaPlayer(
5236 WebMediaPlayerClient* client, 5277 WebMediaPlayerClient* client,
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
5370 media::ConvertToSwitchOutputDeviceCB(web_callbacks); 5411 media::ConvertToSwitchOutputDeviceCB(web_callbacks);
5371 scoped_refptr<media::AudioOutputDevice> device = 5412 scoped_refptr<media::AudioOutputDevice> device =
5372 AudioDeviceFactory::NewOutputDevice(routing_id_, 0, sink_id.utf8(), 5413 AudioDeviceFactory::NewOutputDevice(routing_id_, 0, sink_id.utf8(),
5373 security_origin); 5414 security_origin);
5374 media::OutputDeviceStatus status = device->GetDeviceStatus(); 5415 media::OutputDeviceStatus status = device->GetDeviceStatus();
5375 device->Stop(); 5416 device->Stop();
5376 callback.Run(status); 5417 callback.Run(status);
5377 } 5418 }
5378 5419
5379 } // namespace content 5420 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698