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

Side by Side Diff: content/browser/renderer_host/render_view_host.cc

Issue 9360014: Create a content public browser API around the ChildProcessSecurityPolicy class. The implementati... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 8 years, 10 months 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/browser/renderer_host/render_view_host.h" 5 #include "content/browser/renderer_host/render_view_host.h"
6 6
7 #include <set> 7 #include <set>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/command_line.h" 12 #include "base/command_line.h"
13 #include "base/i18n/rtl.h" 13 #include "base/i18n/rtl.h"
14 #include "base/json/json_reader.h" 14 #include "base/json/json_reader.h"
15 #include "base/message_loop.h" 15 #include "base/message_loop.h"
16 #include "base/stl_util.h" 16 #include "base/stl_util.h"
17 #include "base/string_util.h" 17 #include "base/string_util.h"
18 #include "base/time.h" 18 #include "base/time.h"
19 #include "base/utf_string_conversions.h" 19 #include "base/utf_string_conversions.h"
20 #include "base/values.h" 20 #include "base/values.h"
21 #include "content/browser/child_process_security_policy.h" 21 #include "content/browser/child_process_security_policy_impl.h"
22 #include "content/browser/cross_site_request_manager.h" 22 #include "content/browser/cross_site_request_manager.h"
23 #include "content/browser/gpu/gpu_surface_tracker.h" 23 #include "content/browser/gpu/gpu_surface_tracker.h"
24 #include "content/browser/host_zoom_map_impl.h" 24 #include "content/browser/host_zoom_map_impl.h"
25 #include "content/browser/in_process_webkit/session_storage_namespace.h" 25 #include "content/browser/in_process_webkit/session_storage_namespace.h"
26 #include "content/browser/power_save_blocker.h" 26 #include "content/browser/power_save_blocker.h"
27 #include "content/browser/renderer_host/render_process_host_impl.h" 27 #include "content/browser/renderer_host/render_process_host_impl.h"
28 #include "content/browser/renderer_host/render_widget_host.h" 28 #include "content/browser/renderer_host/render_widget_host.h"
29 #include "content/browser/renderer_host/render_widget_host_view.h" 29 #include "content/browser/renderer_host/render_widget_host_view.h"
30 #include "content/common/desktop_notification_messages.h" 30 #include "content/common/desktop_notification_messages.h"
31 #include "content/common/drag_messages.h" 31 #include "content/common/drag_messages.h"
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 return process()->HasConnection() && renderer_initialized_; 219 return process()->HasConnection() && renderer_initialized_;
220 } 220 }
221 221
222 void RenderViewHost::SyncRendererPrefs() { 222 void RenderViewHost::SyncRendererPrefs() {
223 Send(new ViewMsg_SetRendererPrefs(routing_id(), 223 Send(new ViewMsg_SetRendererPrefs(routing_id(),
224 delegate_->GetRendererPrefs( 224 delegate_->GetRendererPrefs(
225 process()->GetBrowserContext()))); 225 process()->GetBrowserContext())));
226 } 226 }
227 227
228 void RenderViewHost::Navigate(const ViewMsg_Navigate_Params& params) { 228 void RenderViewHost::Navigate(const ViewMsg_Navigate_Params& params) {
229 ChildProcessSecurityPolicy::GetInstance()->GrantRequestURL( 229 ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL(
230 process()->GetID(), params.url); 230 process()->GetID(), params.url);
231 231
232 ViewMsg_Navigate* nav_message = new ViewMsg_Navigate(routing_id(), params); 232 ViewMsg_Navigate* nav_message = new ViewMsg_Navigate(routing_id(), params);
233 233
234 // Only send the message if we aren't suspended at the start of a cross-site 234 // Only send the message if we aren't suspended at the start of a cross-site
235 // request. 235 // request.
236 if (navigations_suspended_) { 236 if (navigations_suspended_) {
237 // Shouldn't be possible to have a second navigation while suspended, since 237 // Shouldn't be possible to have a second navigation while suspended, since
238 // navigations will only be suspended during a cross-site request. If a 238 // navigations will only be suspended during a cross-site request. If a
239 // second navigation occurs, TabContents will cancel this pending RVH 239 // second navigation occurs, TabContents will cancel this pending RVH
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 int RenderViewHost::GetPendingRequestId() { 421 int RenderViewHost::GetPendingRequestId() {
422 return pending_request_id_; 422 return pending_request_id_;
423 } 423 }
424 424
425 void RenderViewHost::DragTargetDragEnter( 425 void RenderViewHost::DragTargetDragEnter(
426 const WebDropData& drop_data, 426 const WebDropData& drop_data,
427 const gfx::Point& client_pt, 427 const gfx::Point& client_pt,
428 const gfx::Point& screen_pt, 428 const gfx::Point& screen_pt,
429 WebDragOperationsMask operations_allowed) { 429 WebDragOperationsMask operations_allowed) {
430 const int renderer_id = process()->GetID(); 430 const int renderer_id = process()->GetID();
431 ChildProcessSecurityPolicy* policy = 431 ChildProcessSecurityPolicyImpl* policy =
432 ChildProcessSecurityPolicy::GetInstance(); 432 ChildProcessSecurityPolicyImpl::GetInstance();
433 433
434 // The URL could have been cobbled together from any highlighted text string, 434 // The URL could have been cobbled together from any highlighted text string,
435 // and can't be interpreted as a capability. 435 // and can't be interpreted as a capability.
436 WebDropData filtered_data(drop_data); 436 WebDropData filtered_data(drop_data);
437 FilterURL(policy, renderer_id, &filtered_data.url); 437 FilterURL(policy, renderer_id, &filtered_data.url);
438 438
439 // The filenames vector, on the other hand, does represent a capability to 439 // The filenames vector, on the other hand, does represent a capability to
440 // access the given files. 440 // access the given files.
441 std::set<FilePath> filesets; 441 std::set<FilePath> filesets;
442 for (std::vector<string16>::iterator iter(filtered_data.filenames.begin()); 442 for (std::vector<string16>::iterator iter(filtered_data.filenames.begin());
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 gfx::Point(screen_x, screen_y), 599 gfx::Point(screen_x, screen_y),
600 false, WebDragOperationNone)); 600 false, WebDragOperationNone));
601 } 601 }
602 602
603 void RenderViewHost::DragSourceSystemDragEnded() { 603 void RenderViewHost::DragSourceSystemDragEnded() {
604 Send(new DragMsg_SourceSystemDragEnded(routing_id())); 604 Send(new DragMsg_SourceSystemDragEnded(routing_id()));
605 } 605 }
606 606
607 void RenderViewHost::AllowBindings(int bindings_flags) { 607 void RenderViewHost::AllowBindings(int bindings_flags) {
608 if (bindings_flags & content::BINDINGS_POLICY_WEB_UI) { 608 if (bindings_flags & content::BINDINGS_POLICY_WEB_UI) {
609 ChildProcessSecurityPolicy::GetInstance()->GrantWebUIBindings( 609 ChildProcessSecurityPolicyImpl::GetInstance()->GrantWebUIBindings(
610 process()->GetID()); 610 process()->GetID());
611 } 611 }
612 612
613 enabled_bindings_ |= bindings_flags; 613 enabled_bindings_ |= bindings_flags;
614 if (renderer_initialized_) 614 if (renderer_initialized_)
615 Send(new ViewMsg_AllowBindings(routing_id(), enabled_bindings_)); 615 Send(new ViewMsg_AllowBindings(routing_id(), enabled_bindings_));
616 } 616 }
617 617
618 void RenderViewHost::SetWebUIProperty(const std::string& name, 618 void RenderViewHost::SetWebUIProperty(const std::string& name,
619 const std::string& value) { 619 const std::string& value) {
(...skipping 22 matching lines...) Expand all
642 void RenderViewHost::SetInitialFocus(bool reverse) { 642 void RenderViewHost::SetInitialFocus(bool reverse) {
643 Send(new ViewMsg_SetInitialFocus(routing_id(), reverse)); 643 Send(new ViewMsg_SetInitialFocus(routing_id(), reverse));
644 } 644 }
645 645
646 void RenderViewHost::FilesSelectedInChooser( 646 void RenderViewHost::FilesSelectedInChooser(
647 const std::vector<FilePath>& files, 647 const std::vector<FilePath>& files,
648 int permissions) { 648 int permissions) {
649 // Grant the security access requested to the given files. 649 // Grant the security access requested to the given files.
650 for (std::vector<FilePath>::const_iterator file = files.begin(); 650 for (std::vector<FilePath>::const_iterator file = files.begin();
651 file != files.end(); ++file) { 651 file != files.end(); ++file) {
652 ChildProcessSecurityPolicy::GetInstance()->GrantPermissionsForFile( 652 ChildProcessSecurityPolicyImpl::GetInstance()->GrantPermissionsForFile(
653 process()->GetID(), *file, permissions); 653 process()->GetID(), *file, permissions);
654 } 654 }
655 Send(new ViewMsg_RunFileChooserResponse(routing_id(), files)); 655 Send(new ViewMsg_RunFileChooserResponse(routing_id(), files));
656 } 656 }
657 657
658 void RenderViewHost::DirectoryEnumerationFinished( 658 void RenderViewHost::DirectoryEnumerationFinished(
659 int request_id, 659 int request_id,
660 const std::vector<FilePath>& files) { 660 const std::vector<FilePath>& files) {
661 // Grant the security access requested to the given files. 661 // Grant the security access requested to the given files.
662 for (std::vector<FilePath>::const_iterator file = files.begin(); 662 for (std::vector<FilePath>::const_iterator file = files.begin();
663 file != files.end(); ++file) { 663 file != files.end(); ++file) {
664 ChildProcessSecurityPolicy::GetInstance()->GrantReadFile( 664 ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadFile(
665 process()->GetID(), *file); 665 process()->GetID(), *file);
666 } 666 }
667 Send(new ViewMsg_EnumerateDirectoryResponse(routing_id(), 667 Send(new ViewMsg_EnumerateDirectoryResponse(routing_id(),
668 request_id, 668 request_id,
669 files)); 669 files));
670 } 670 }
671 671
672 void RenderViewHost::LoadStateChanged(const GURL& url, 672 void RenderViewHost::LoadStateChanged(const GURL& url,
673 const net::LoadStateWithParam& load_state, 673 const net::LoadStateWithParam& load_state,
674 uint64 upload_position, 674 uint64 upload_position,
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
931 931
932 // If we're waiting for an unload ack from this renderer and we receive a 932 // If we're waiting for an unload ack from this renderer and we receive a
933 // Navigate message, then the renderer was navigating before it received the 933 // Navigate message, then the renderer was navigating before it received the
934 // unload request. It will either respond to the unload request soon or our 934 // unload request. It will either respond to the unload request soon or our
935 // timer will expire. Either way, we should ignore this message, because we 935 // timer will expire. Either way, we should ignore this message, because we
936 // have already committed to closing this renderer. 936 // have already committed to closing this renderer.
937 if (is_waiting_for_unload_ack_) 937 if (is_waiting_for_unload_ack_)
938 return; 938 return;
939 939
940 const int renderer_id = process()->GetID(); 940 const int renderer_id = process()->GetID();
941 ChildProcessSecurityPolicy* policy = 941 ChildProcessSecurityPolicyImpl* policy =
942 ChildProcessSecurityPolicy::GetInstance(); 942 ChildProcessSecurityPolicyImpl::GetInstance();
943 // Without this check, an evil renderer can trick the browser into creating 943 // Without this check, an evil renderer can trick the browser into creating
944 // a navigation entry for a banned URL. If the user clicks the back button 944 // a navigation entry for a banned URL. If the user clicks the back button
945 // followed by the forward button (or clicks reload, or round-trips through 945 // followed by the forward button (or clicks reload, or round-trips through
946 // session restore, etc), we'll think that the browser commanded the 946 // session restore, etc), we'll think that the browser commanded the
947 // renderer to load the URL and grant the renderer the privileges to request 947 // renderer to load the URL and grant the renderer the privileges to request
948 // the URL. To prevent this attack, we block the renderer from inserting 948 // the URL. To prevent this attack, we block the renderer from inserting
949 // banned URLs into the navigation controller in the first place. 949 // banned URLs into the navigation controller in the first place.
950 FilterURL(policy, renderer_id, &validated_params.url); 950 FilterURL(policy, renderer_id, &validated_params.url);
951 FilterURL(policy, renderer_id, &validated_params.referrer.url); 951 FilterURL(policy, renderer_id, &validated_params.referrer.url);
952 for (std::vector<GURL>::iterator it(validated_params.redirects.begin()); 952 for (std::vector<GURL>::iterator it(validated_params.redirects.begin());
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1033 1033
1034 void RenderViewHost::OnMsgContextMenu(const ContextMenuParams& params) { 1034 void RenderViewHost::OnMsgContextMenu(const ContextMenuParams& params) {
1035 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); 1035 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate();
1036 if (!view) 1036 if (!view)
1037 return; 1037 return;
1038 1038
1039 // Validate the URLs in |params|. If the renderer can't request the URLs 1039 // Validate the URLs in |params|. If the renderer can't request the URLs
1040 // directly, don't show them in the context menu. 1040 // directly, don't show them in the context menu.
1041 ContextMenuParams validated_params(params); 1041 ContextMenuParams validated_params(params);
1042 int renderer_id = process()->GetID(); 1042 int renderer_id = process()->GetID();
1043 ChildProcessSecurityPolicy* policy = 1043 ChildProcessSecurityPolicyImpl* policy =
1044 ChildProcessSecurityPolicy::GetInstance(); 1044 ChildProcessSecurityPolicyImpl::GetInstance();
1045 1045
1046 // We don't validate |unfiltered_link_url| so that this field can be used 1046 // We don't validate |unfiltered_link_url| so that this field can be used
1047 // when users want to copy the original link URL. 1047 // when users want to copy the original link URL.
1048 FilterURL(policy, renderer_id, &validated_params.link_url); 1048 FilterURL(policy, renderer_id, &validated_params.link_url);
1049 FilterURL(policy, renderer_id, &validated_params.src_url); 1049 FilterURL(policy, renderer_id, &validated_params.src_url);
1050 FilterURL(policy, renderer_id, &validated_params.page_url); 1050 FilterURL(policy, renderer_id, &validated_params.page_url);
1051 FilterURL(policy, renderer_id, &validated_params.frame_url); 1051 FilterURL(policy, renderer_id, &validated_params.frame_url);
1052 1052
1053 view->ShowContextMenu(validated_params); 1053 view->ShowContextMenu(validated_params);
1054 } 1054 }
1055 1055
1056 void RenderViewHost::OnMsgToggleFullscreen(bool enter_fullscreen) { 1056 void RenderViewHost::OnMsgToggleFullscreen(bool enter_fullscreen) {
1057 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1057 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1058 delegate_->ToggleFullscreenMode(enter_fullscreen); 1058 delegate_->ToggleFullscreenMode(enter_fullscreen);
1059 } 1059 }
1060 1060
1061 void RenderViewHost::OnMsgOpenURL(const GURL& url, 1061 void RenderViewHost::OnMsgOpenURL(const GURL& url,
1062 const content::Referrer& referrer, 1062 const content::Referrer& referrer,
1063 WindowOpenDisposition disposition, 1063 WindowOpenDisposition disposition,
1064 int64 source_frame_id) { 1064 int64 source_frame_id) {
1065 GURL validated_url(url); 1065 GURL validated_url(url);
1066 FilterURL(ChildProcessSecurityPolicy::GetInstance(), 1066 FilterURL(ChildProcessSecurityPolicyImpl::GetInstance(),
1067 process()->GetID(), &validated_url); 1067 process()->GetID(), &validated_url);
1068 1068
1069 delegate_->RequestOpenURL( 1069 delegate_->RequestOpenURL(
1070 validated_url, referrer, disposition, source_frame_id); 1070 validated_url, referrer, disposition, source_frame_id);
1071 } 1071 }
1072 1072
1073 void RenderViewHost::OnMsgDidContentsPreferredSizeChange( 1073 void RenderViewHost::OnMsgDidContentsPreferredSizeChange(
1074 const gfx::Size& new_size) { 1074 const gfx::Size& new_size) {
1075 delegate_->UpdatePreferredSize(new_size); 1075 delegate_->UpdatePreferredSize(new_size);
1076 } 1076 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1136 void RenderViewHost::OnMsgStartDragging( 1136 void RenderViewHost::OnMsgStartDragging(
1137 const WebDropData& drop_data, 1137 const WebDropData& drop_data,
1138 WebDragOperationsMask drag_operations_mask, 1138 WebDragOperationsMask drag_operations_mask,
1139 const SkBitmap& image, 1139 const SkBitmap& image,
1140 const gfx::Point& image_offset) { 1140 const gfx::Point& image_offset) {
1141 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); 1141 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate();
1142 if (!view) 1142 if (!view)
1143 return; 1143 return;
1144 1144
1145 WebDropData filtered_data(drop_data); 1145 WebDropData filtered_data(drop_data);
1146 ChildProcessSecurityPolicy* policy = 1146 ChildProcessSecurityPolicyImpl* policy =
1147 ChildProcessSecurityPolicy::GetInstance(); 1147 ChildProcessSecurityPolicyImpl::GetInstance();
1148 1148
1149 // Allow drag of Javascript URLs to enable bookmarklet drag to bookmark bar. 1149 // Allow drag of Javascript URLs to enable bookmarklet drag to bookmark bar.
1150 if (!filtered_data.url.SchemeIs(chrome::kJavaScriptScheme)) 1150 if (!filtered_data.url.SchemeIs(chrome::kJavaScriptScheme))
1151 FilterURL(policy, process()->GetID(), &filtered_data.url); 1151 FilterURL(policy, process()->GetID(), &filtered_data.url);
1152 FilterURL(policy, process()->GetID(), &filtered_data.html_base_url); 1152 FilterURL(policy, process()->GetID(), &filtered_data.html_base_url);
1153 view->StartDragging(filtered_data, drag_operations_mask, image, image_offset); 1153 view->StartDragging(filtered_data, drag_operations_mask, image, image_offset);
1154 } 1154 }
1155 1155
1156 void RenderViewHost::OnUpdateDragCursor(WebDragOperation current_op) { 1156 void RenderViewHost::OnUpdateDragCursor(WebDragOperation current_op) {
1157 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); 1157 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate();
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
1319 1319
1320 void RenderViewHost::DidCancelPopupMenu() { 1320 void RenderViewHost::DidCancelPopupMenu() {
1321 Send(new ViewMsg_SelectPopupMenuItem(routing_id(), -1)); 1321 Send(new ViewMsg_SelectPopupMenuItem(routing_id(), -1));
1322 } 1322 }
1323 #endif 1323 #endif
1324 1324
1325 void RenderViewHost::ToggleSpeechInput() { 1325 void RenderViewHost::ToggleSpeechInput() {
1326 Send(new SpeechInputMsg_ToggleSpeechInput(routing_id())); 1326 Send(new SpeechInputMsg_ToggleSpeechInput(routing_id()));
1327 } 1327 }
1328 1328
1329 void RenderViewHost::FilterURL(ChildProcessSecurityPolicy* policy, 1329 void RenderViewHost::FilterURL(ChildProcessSecurityPolicyImpl* policy,
1330 int renderer_id, 1330 int renderer_id,
1331 GURL* url) { 1331 GURL* url) {
1332 if (!url->is_valid()) 1332 if (!url->is_valid())
1333 return; // We don't need to block invalid URLs. 1333 return; // We don't need to block invalid URLs.
1334 1334
1335 if (url->SchemeIs(chrome::kAboutScheme)) { 1335 if (url->SchemeIs(chrome::kAboutScheme)) {
1336 // The renderer treats all URLs in the about: scheme as being about:blank. 1336 // The renderer treats all URLs in the about: scheme as being about:blank.
1337 // Canonicalize about: URLs to about:blank. 1337 // Canonicalize about: URLs to about:blank.
1338 *url = GURL(chrome::kAboutBlankURL); 1338 *url = GURL(chrome::kAboutBlankURL);
1339 } 1339 }
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
1568 DomOperationNotificationDetails details(json_string, automation_id); 1568 DomOperationNotificationDetails details(json_string, automation_id);
1569 content::NotificationService::current()->Notify( 1569 content::NotificationService::current()->Notify(
1570 content::NOTIFICATION_DOM_OPERATION_RESPONSE, 1570 content::NOTIFICATION_DOM_OPERATION_RESPONSE,
1571 content::Source<RenderViewHost>(this), 1571 content::Source<RenderViewHost>(this),
1572 content::Details<DomOperationNotificationDetails>(&details)); 1572 content::Details<DomOperationNotificationDetails>(&details));
1573 } 1573 }
1574 1574
1575 void RenderViewHost::ClearPowerSaveBlockers() { 1575 void RenderViewHost::ClearPowerSaveBlockers() {
1576 STLDeleteValues(&power_save_blockers_); 1576 STLDeleteValues(&power_save_blockers_);
1577 } 1577 }
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_view_host.h ('k') | content/browser/renderer_host/render_view_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698