| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "chrome/renderer/render_view.h" | 5 #include "chrome/renderer/render_view.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 #include "base/gfx/native_theme.h" | 93 #include "base/gfx/native_theme.h" |
| 94 #endif | 94 #endif |
| 95 | 95 |
| 96 using base::Time; | 96 using base::Time; |
| 97 using base::TimeDelta; | 97 using base::TimeDelta; |
| 98 using webkit_glue::AutofillForm; | 98 using webkit_glue::AutofillForm; |
| 99 using webkit_glue::PasswordForm; | 99 using webkit_glue::PasswordForm; |
| 100 using webkit_glue::PasswordFormDomManager; | 100 using webkit_glue::PasswordFormDomManager; |
| 101 using webkit_glue::SearchableFormData; | 101 using webkit_glue::SearchableFormData; |
| 102 using WebKit::WebConsoleMessage; | 102 using WebKit::WebConsoleMessage; |
| 103 using WebKit::WebData; |
| 103 using WebKit::WebDataSource; | 104 using WebKit::WebDataSource; |
| 104 using WebKit::WebDragData; | 105 using WebKit::WebDragData; |
| 105 using WebKit::WebForm; | 106 using WebKit::WebForm; |
| 106 using WebKit::WebHistoryItem; | 107 using WebKit::WebHistoryItem; |
| 107 using WebKit::WebNavigationType; | 108 using WebKit::WebNavigationType; |
| 108 using WebKit::WebRect; | 109 using WebKit::WebRect; |
| 109 using WebKit::WebScriptSource; | 110 using WebKit::WebScriptSource; |
| 110 using WebKit::WebSize; | 111 using WebKit::WebSize; |
| 111 using WebKit::WebString; | 112 using WebKit::WebString; |
| 112 using WebKit::WebURL; | 113 using WebKit::WebURL; |
| (...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 645 // initiated any load resulting from JS execution. | 646 // initiated any load resulting from JS execution. |
| 646 if (!params.url.SchemeIs(chrome::kJavaScriptScheme)) { | 647 if (!params.url.SchemeIs(chrome::kJavaScriptScheme)) { |
| 647 pending_navigation_state_.reset(NavigationState::CreateBrowserInitiated( | 648 pending_navigation_state_.reset(NavigationState::CreateBrowserInitiated( |
| 648 params.page_id, params.transition, params.request_time)); | 649 params.page_id, params.transition, params.request_time)); |
| 649 } | 650 } |
| 650 | 651 |
| 651 // If we are reloading, then WebKit will use the history state of the current | 652 // If we are reloading, then WebKit will use the history state of the current |
| 652 // page, so we should just ignore any given history state. Otherwise, if we | 653 // page, so we should just ignore any given history state. Otherwise, if we |
| 653 // have history state, then we need to navigate to it, which corresponds to a | 654 // have history state, then we need to navigate to it, which corresponds to a |
| 654 // back/forward navigation event. | 655 // back/forward navigation event. |
| 655 if (!is_reload && !params.state.empty()) { | 656 if (is_reload) { |
| 657 main_frame->Reload(); |
| 658 } else if (!params.state.empty()) { |
| 656 // We must know the page ID of the page we are navigating back to. | 659 // We must know the page ID of the page we are navigating back to. |
| 657 DCHECK_NE(params.page_id, -1); | 660 DCHECK_NE(params.page_id, -1); |
| 658 main_frame->LoadHistoryItem( | 661 main_frame->LoadHistoryItem( |
| 659 webkit_glue::HistoryItemFromString(params.state)); | 662 webkit_glue::HistoryItemFromString(params.state)); |
| 660 } else { | 663 } else { |
| 661 // Navigate to the given URL. | 664 // Navigate to the given URL. |
| 662 WebURLRequest request(params.url); | 665 WebURLRequest request(params.url); |
| 663 | 666 |
| 664 // TODO(darin): WebFrame should just have a Reload method. | 667 // A session history navigation should have been accompanied by state. |
| 668 DCHECK_EQ(params.page_id, -1); |
| 665 | 669 |
| 666 WebURLRequest::CachePolicy cache_policy; | 670 if (main_frame->GetInViewSourceMode()) |
| 667 if (is_reload) { | 671 request.setCachePolicy(WebURLRequest::ReturnCacheDataElseLoad); |
| 668 cache_policy = WebURLRequest::ReloadIgnoringCacheData; | |
| 669 } else { | |
| 670 // A session history navigation should have been accompanied by state. | |
| 671 DCHECK_EQ(params.page_id, -1); | |
| 672 if (main_frame->GetInViewSourceMode()) { | |
| 673 cache_policy = WebURLRequest::ReturnCacheDataElseLoad; | |
| 674 } else { | |
| 675 cache_policy = WebURLRequest::UseProtocolCachePolicy; | |
| 676 } | |
| 677 } | |
| 678 request.setCachePolicy(cache_policy); | |
| 679 | 672 |
| 680 if (params.referrer.is_valid()) { | 673 if (params.referrer.is_valid()) { |
| 681 request.setHTTPHeaderField(WebString::fromUTF8("Referer"), | 674 request.setHTTPHeaderField(WebString::fromUTF8("Referer"), |
| 682 WebString::fromUTF8(params.referrer.spec())); | 675 WebString::fromUTF8(params.referrer.spec())); |
| 683 } | 676 } |
| 684 | 677 |
| 685 main_frame->LoadRequest(request); | 678 main_frame->LoadRequest(request); |
| 686 } | 679 } |
| 687 | 680 |
| 688 // In case LoadRequest failed before DidCreateDataSource was called. | 681 // In case LoadRequest failed before DidCreateDataSource was called. |
| 689 pending_navigation_state_.reset(); | 682 pending_navigation_state_.reset(); |
| 690 } | 683 } |
| 691 | 684 |
| 692 // Stop loading the current page | 685 // Stop loading the current page |
| 693 void RenderView::OnStop() { | 686 void RenderView::OnStop() { |
| 694 if (webview()) | 687 if (webview()) |
| 695 webview()->StopLoading(); | 688 webview()->StopLoading(); |
| 696 } | 689 } |
| 697 | 690 |
| 698 void RenderView::OnLoadAlternateHTMLText(const std::string& html_contents, | 691 void RenderView::OnLoadAlternateHTMLText(const std::string& html, |
| 699 bool new_navigation, | 692 bool new_navigation, |
| 700 const GURL& display_url, | 693 const GURL& display_url, |
| 701 const std::string& security_info) { | 694 const std::string& security_info) { |
| 702 if (!webview()) | 695 if (!webview()) |
| 703 return; | 696 return; |
| 704 | 697 |
| 705 WebURLRequest request; | 698 pending_navigation_state_.reset(NavigationState::CreateBrowserInitiated( |
| 706 request.initialize(); | 699 new_navigation ? -1 : page_id_, PageTransition::LINK, Time::Now())); |
| 707 request.setURL(GURL(kUnreachableWebDataURL)); | 700 pending_navigation_state_->set_security_info(security_info); |
| 708 request.setSecurityInfo(security_info); | |
| 709 | 701 |
| 710 webview()->GetMainFrame()->LoadAlternateHTMLString(request, | 702 webview()->GetMainFrame()->LoadHTMLString(html, |
| 711 html_contents, | 703 GURL(kUnreachableWebDataURL), |
| 712 display_url, | 704 display_url, |
| 713 !new_navigation); | 705 !new_navigation); |
| 706 |
| 707 pending_navigation_state_.reset(); |
| 714 } | 708 } |
| 715 | 709 |
| 716 void RenderView::OnCopyImageAt(int x, int y) { | 710 void RenderView::OnCopyImageAt(int x, int y) { |
| 717 webview()->CopyImageAt(x, y); | 711 webview()->CopyImageAt(x, y); |
| 718 } | 712 } |
| 719 | 713 |
| 720 void RenderView::OnExecuteEditCommand(const std::string& name, | 714 void RenderView::OnExecuteEditCommand(const std::string& name, |
| 721 const std::string& value) { | 715 const std::string& value) { |
| 722 if (!webview() || !webview()->GetFocusedFrame()) | 716 if (!webview() || !webview()->GetFocusedFrame()) |
| 723 return; | 717 return; |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 845 const WebURLResponse& response = ds->response(); | 839 const WebURLResponse& response = ds->response(); |
| 846 | 840 |
| 847 NavigationState* navigation_state = NavigationState::FromDataSource(ds); | 841 NavigationState* navigation_state = NavigationState::FromDataSource(ds); |
| 848 DCHECK(navigation_state); | 842 DCHECK(navigation_state); |
| 849 | 843 |
| 850 ViewHostMsg_FrameNavigate_Params params; | 844 ViewHostMsg_FrameNavigate_Params params; |
| 851 params.http_status_code = response.httpStatusCode(); | 845 params.http_status_code = response.httpStatusCode(); |
| 852 params.is_post = false; | 846 params.is_post = false; |
| 853 params.page_id = page_id_; | 847 params.page_id = page_id_; |
| 854 params.is_content_filtered = response.isContentFiltered(); | 848 params.is_content_filtered = response.isContentFiltered(); |
| 855 if (!request.securityInfo().isEmpty()) { | 849 if (!navigation_state->security_info().empty()) { |
| 856 // SSL state specified in the request takes precedence over the one in the | 850 // SSL state specified in the request takes precedence over the one in the |
| 857 // response. | 851 // response. |
| 858 // So far this is only intended for error pages that are not expected to be | 852 // So far this is only intended for error pages that are not expected to be |
| 859 // over ssl, so we should not get any clash. | 853 // over ssl, so we should not get any clash. |
| 860 DCHECK(response.securityInfo().isEmpty()); | 854 DCHECK(response.securityInfo().isEmpty()); |
| 861 params.security_info = request.securityInfo(); | 855 params.security_info = navigation_state->security_info(); |
| 862 } else { | 856 } else { |
| 863 params.security_info = response.securityInfo(); | 857 params.security_info = response.securityInfo(); |
| 864 } | 858 } |
| 865 | 859 |
| 866 // Set the URL to be displayed in the browser UI to the user. | 860 // Set the URL to be displayed in the browser UI to the user. |
| 867 if (ds->hasUnreachableURL()) { | 861 if (ds->hasUnreachableURL()) { |
| 868 params.url = ds->unreachableURL(); | 862 params.url = ds->unreachableURL(); |
| 869 } else { | 863 } else { |
| 870 params.url = request.url(); | 864 params.url = request.url(); |
| 871 } | 865 } |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1244 } | 1238 } |
| 1245 error_strings.SetString(L"textdirection", | 1239 error_strings.SetString(L"textdirection", |
| 1246 (l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT) ? | 1240 (l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT) ? |
| 1247 L"rtl" : L"ltr"); | 1241 L"rtl" : L"ltr"); |
| 1248 | 1242 |
| 1249 alt_html = GetAltHTMLForTemplate(error_strings, resource_id); | 1243 alt_html = GetAltHTMLForTemplate(error_strings, resource_id); |
| 1250 } else { | 1244 } else { |
| 1251 alt_html = html; | 1245 alt_html = html; |
| 1252 } | 1246 } |
| 1253 | 1247 |
| 1254 // Use a data: URL as the site URL to prevent against XSS attacks. | 1248 frame->LoadHTMLString(alt_html, |
| 1255 WebURLRequest request(failed_request); | 1249 GURL(kUnreachableWebDataURL), |
| 1256 request.setURL(GURL(kUnreachableWebDataURL)); | 1250 failed_url, |
| 1257 | 1251 replace); |
| 1258 frame->LoadAlternateHTMLString(request, alt_html, failed_url, replace); | |
| 1259 } | 1252 } |
| 1260 | 1253 |
| 1261 void RenderView::DidCommitLoadForFrame(WebView *webview, WebFrame* frame, | 1254 void RenderView::DidCommitLoadForFrame(WebView *webview, WebFrame* frame, |
| 1262 bool is_new_navigation) { | 1255 bool is_new_navigation) { |
| 1263 NavigationState* navigation_state = | 1256 NavigationState* navigation_state = |
| 1264 NavigationState::FromDataSource(frame->GetDataSource()); | 1257 NavigationState::FromDataSource(frame->GetDataSource()); |
| 1265 | 1258 |
| 1266 navigation_state->set_commit_load_time(Time::Now()); | 1259 navigation_state->set_commit_load_time(Time::Now()); |
| 1267 if (is_new_navigation) { | 1260 if (is_new_navigation) { |
| 1268 // When we perform a new navigation, we need to update the previous session | 1261 // When we perform a new navigation, we need to update the previous session |
| (...skipping 1708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2977 Send(new ViewHostMsg_PasswordFormsSeen(routing_id_, password_forms)); | 2970 Send(new ViewHostMsg_PasswordFormsSeen(routing_id_, password_forms)); |
| 2978 } | 2971 } |
| 2979 | 2972 |
| 2980 void RenderView::Print(WebFrame* frame, bool script_initiated) { | 2973 void RenderView::Print(WebFrame* frame, bool script_initiated) { |
| 2981 DCHECK(frame); | 2974 DCHECK(frame); |
| 2982 if (print_helper_.get() == NULL) { | 2975 if (print_helper_.get() == NULL) { |
| 2983 print_helper_.reset(new PrintWebViewHelper(this)); | 2976 print_helper_.reset(new PrintWebViewHelper(this)); |
| 2984 } | 2977 } |
| 2985 print_helper_->Print(frame, script_initiated); | 2978 print_helper_->Print(frame, script_initiated); |
| 2986 } | 2979 } |
| OLD | NEW |