Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 470 params.referrer = Referrer( | 470 params.referrer = Referrer( |
| 471 GURL(request->httpHeaderField(WebString::fromUTF8("Referer")).latin1()), | 471 GURL(request->httpHeaderField(WebString::fromUTF8("Referer")).latin1()), |
| 472 request->referrerPolicy()); | 472 request->referrerPolicy()); |
| 473 params.transition = extra_data->transition_type(); | 473 params.transition = extra_data->transition_type(); |
| 474 return params; | 474 return params; |
| 475 } | 475 } |
| 476 | 476 |
| 477 RenderFrameImpl::CreateRenderFrameImplFunction g_create_render_frame_impl = | 477 RenderFrameImpl::CreateRenderFrameImplFunction g_create_render_frame_impl = |
| 478 nullptr; | 478 nullptr; |
| 479 | 479 |
| 480 // Check that blink::WebSandboxFlags is kept in sync with | |
|
Charlie Reis
2015/01/08 22:17:26
I haven't dealt with these much before, but it loo
alexmos
2015/01/09 20:43:25
Done. I put them as static functions in RenderFra
| |
| 481 // content::SandboxFlags. | |
| 482 COMPILE_ASSERT(blink::WebSandboxNone == | |
| 483 static_cast<blink::WebSandboxFlags>( | |
| 484 content::SandboxFlags::NONE), | |
| 485 enum_values_must_match_for_sandbox_flags); | |
| 486 COMPILE_ASSERT(blink::WebSandboxNavigation == | |
| 487 static_cast<blink::WebSandboxFlags>( | |
| 488 content::SandboxFlags::NAVIGATION), | |
| 489 enum_values_must_match_for_sandbox_flags); | |
| 490 COMPILE_ASSERT(blink::WebSandboxPlugins == | |
| 491 static_cast<blink::WebSandboxFlags>( | |
| 492 content::SandboxFlags::PLUGINS), | |
| 493 enum_values_must_match_for_sandbox_flags); | |
| 494 COMPILE_ASSERT(blink::WebSandboxOrigin == | |
| 495 static_cast<blink::WebSandboxFlags>( | |
| 496 content::SandboxFlags::ORIGIN), | |
| 497 enum_values_must_match_for_sandbox_flags); | |
| 498 COMPILE_ASSERT(blink::WebSandboxForms == | |
| 499 static_cast<blink::WebSandboxFlags>( | |
| 500 content::SandboxFlags::FORMS), | |
| 501 enum_values_must_match_for_sandbox_flags); | |
| 502 COMPILE_ASSERT(blink::WebSandboxScripts == | |
| 503 static_cast<blink::WebSandboxFlags>( | |
| 504 content::SandboxFlags::SCRIPTS), | |
| 505 enum_values_must_match_for_sandbox_flags); | |
| 506 COMPILE_ASSERT(blink::WebSandboxTopNavigation == | |
| 507 static_cast<blink::WebSandboxFlags>( | |
| 508 content::SandboxFlags::TOP_NAVIGATION), | |
| 509 enum_values_must_match_for_sandbox_flags); | |
| 510 COMPILE_ASSERT(blink::WebSandboxPopups == | |
| 511 static_cast<blink::WebSandboxFlags>( | |
| 512 content::SandboxFlags::POPUPS), | |
| 513 enum_values_must_match_for_sandbox_flags); | |
| 514 COMPILE_ASSERT( | |
| 515 blink::WebSandboxAutomaticFeatures == | |
| 516 static_cast<blink::WebSandboxFlags>( | |
| 517 content::SandboxFlags::AUTOMATIC_FEATURES), | |
| 518 enum_values_must_match_for_sandbox_flags); | |
| 519 COMPILE_ASSERT(blink::WebSandboxPointerLock == | |
| 520 static_cast<blink::WebSandboxFlags>( | |
| 521 content::SandboxFlags::POINTER_LOCK), | |
| 522 enum_values_must_match_for_sandbox_flags); | |
| 523 COMPILE_ASSERT(blink::WebSandboxDocumentDomain == | |
| 524 static_cast<blink::WebSandboxFlags>( | |
| 525 content::SandboxFlags::DOCUMENT_DOMAIN), | |
| 526 enum_values_must_match_for_sandbox_flags); | |
| 527 COMPILE_ASSERT(blink::WebSandboxOrientationLock == | |
| 528 static_cast<blink::WebSandboxFlags>( | |
| 529 content::SandboxFlags::ORIENTATION_LOCK), | |
| 530 enum_values_must_match_for_sandbox_flags); | |
| 531 COMPILE_ASSERT(blink::WebSandboxAll == | |
| 532 static_cast<blink::WebSandboxFlags>( | |
| 533 content::SandboxFlags::ALL), | |
| 534 enum_values_must_match_for_sandbox_flags); | |
| 480 } // namespace | 535 } // namespace |
| 481 | 536 |
| 482 | 537 |
| 483 // static | 538 // static |
| 484 RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view, | 539 RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view, |
| 485 int32 routing_id) { | 540 int32 routing_id) { |
| 486 DCHECK(routing_id != MSG_ROUTING_NONE); | 541 DCHECK(routing_id != MSG_ROUTING_NONE); |
| 487 | 542 |
| 488 if (g_create_render_frame_impl) | 543 if (g_create_render_frame_impl) |
| 489 return g_create_render_frame_impl(render_view, routing_id); | 544 return g_create_render_frame_impl(render_view, routing_id); |
| 490 else | 545 else |
| 491 return new RenderFrameImpl(render_view, routing_id); | 546 return new RenderFrameImpl(render_view, routing_id); |
| 492 } | 547 } |
| 493 | 548 |
| 494 // static | 549 // static |
| 495 RenderFrameImpl* RenderFrameImpl::FromRoutingID(int32 routing_id) { | 550 RenderFrameImpl* RenderFrameImpl::FromRoutingID(int32 routing_id) { |
| 496 RoutingIDFrameMap::iterator iter = | 551 RoutingIDFrameMap::iterator iter = |
| 497 g_routing_id_frame_map.Get().find(routing_id); | 552 g_routing_id_frame_map.Get().find(routing_id); |
| 498 if (iter != g_routing_id_frame_map.Get().end()) | 553 if (iter != g_routing_id_frame_map.Get().end()) |
| 499 return iter->second; | 554 return iter->second; |
| 500 return NULL; | 555 return NULL; |
| 501 } | 556 } |
| 502 | 557 |
| 503 // static | 558 // static |
| 504 void RenderFrameImpl::CreateFrame(int routing_id, | 559 void RenderFrameImpl::CreateFrame( |
| 505 int parent_routing_id, | 560 int routing_id, |
| 506 int proxy_routing_id) { | 561 int parent_routing_id, |
| 562 int proxy_routing_id, | |
| 563 const FrameReplicationState& replicated_state) { | |
| 507 // TODO(nasko): For now, this message is only sent for subframes, as the | 564 // TODO(nasko): For now, this message is only sent for subframes, as the |
| 508 // top level frame is created when the RenderView is created through the | 565 // top level frame is created when the RenderView is created through the |
| 509 // ViewMsg_New IPC. | 566 // ViewMsg_New IPC. |
| 510 CHECK_NE(MSG_ROUTING_NONE, parent_routing_id); | 567 CHECK_NE(MSG_ROUTING_NONE, parent_routing_id); |
| 511 | 568 |
| 512 blink::WebLocalFrame* web_frame; | 569 blink::WebLocalFrame* web_frame; |
| 513 RenderFrameImpl* render_frame; | 570 RenderFrameImpl* render_frame; |
| 514 if (proxy_routing_id == MSG_ROUTING_NONE) { | 571 if (proxy_routing_id == MSG_ROUTING_NONE) { |
| 515 RenderFrameProxy* parent_proxy = | 572 RenderFrameProxy* parent_proxy = |
| 516 RenderFrameProxy::FromRoutingID(parent_routing_id); | 573 RenderFrameProxy::FromRoutingID(parent_routing_id); |
| 517 // If the browser is sending a valid parent routing id, it should already | 574 // If the browser is sending a valid parent routing id, it should already |
| 518 // be created and registered. | 575 // be created and registered. |
| 519 CHECK(parent_proxy); | 576 CHECK(parent_proxy); |
| 520 blink::WebRemoteFrame* parent_web_frame = parent_proxy->web_frame(); | 577 blink::WebRemoteFrame* parent_web_frame = parent_proxy->web_frame(); |
| 521 | 578 |
| 522 // Create the RenderFrame and WebLocalFrame, linking the two. | 579 // Create the RenderFrame and WebLocalFrame, linking the two. |
| 523 render_frame = | 580 render_frame = |
| 524 RenderFrameImpl::Create(parent_proxy->render_view(), routing_id); | 581 RenderFrameImpl::Create(parent_proxy->render_view(), routing_id); |
| 525 web_frame = parent_web_frame->createLocalChild("", render_frame); | 582 web_frame = parent_web_frame->createLocalChild("", |
| 583 static_cast<blink::WebSandboxFlags>(replicated_state.sandbox_flags), | |
| 584 render_frame); | |
| 526 } else { | 585 } else { |
| 527 RenderFrameProxy* proxy = | 586 RenderFrameProxy* proxy = |
| 528 RenderFrameProxy::FromRoutingID(proxy_routing_id); | 587 RenderFrameProxy::FromRoutingID(proxy_routing_id); |
| 529 CHECK(proxy); | 588 CHECK(proxy); |
| 530 render_frame = RenderFrameImpl::Create(proxy->render_view(), routing_id); | 589 render_frame = RenderFrameImpl::Create(proxy->render_view(), routing_id); |
| 531 web_frame = blink::WebLocalFrame::create(render_frame); | 590 web_frame = blink::WebLocalFrame::create(render_frame); |
| 532 render_frame->proxy_routing_id_ = proxy_routing_id; | 591 render_frame->proxy_routing_id_ = proxy_routing_id; |
| 533 web_frame->initializeToReplaceRemoteFrame(proxy->web_frame()); | 592 web_frame->initializeToReplaceRemoteFrame(proxy->web_frame()); |
| 534 } | 593 } |
| 535 render_frame->SetWebFrame(web_frame); | 594 render_frame->SetWebFrame(web_frame); |
| (...skipping 1381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1917 } | 1976 } |
| 1918 | 1977 |
| 1919 void RenderFrameImpl::didAccessInitialDocument(blink::WebLocalFrame* frame) { | 1978 void RenderFrameImpl::didAccessInitialDocument(blink::WebLocalFrame* frame) { |
| 1920 DCHECK(!frame_ || frame_ == frame); | 1979 DCHECK(!frame_ || frame_ == frame); |
| 1921 // Notify the browser process that it is no longer safe to show the pending | 1980 // Notify the browser process that it is no longer safe to show the pending |
| 1922 // URL of the main frame, since a URL spoof is now possible. | 1981 // URL of the main frame, since a URL spoof is now possible. |
| 1923 if (!frame->parent() && render_view_->page_id_ == -1) | 1982 if (!frame->parent() && render_view_->page_id_ == -1) |
| 1924 Send(new FrameHostMsg_DidAccessInitialDocument(routing_id_)); | 1983 Send(new FrameHostMsg_DidAccessInitialDocument(routing_id_)); |
| 1925 } | 1984 } |
| 1926 | 1985 |
| 1986 // TODO(alexmos): Remove once Blink is updated to use the version that takes | |
| 1987 // sandboxFlags. | |
| 1988 blink::WebFrame* RenderFrameImpl::createChildFrame( | |
| 1989 blink::WebLocalFrame* parent, | |
| 1990 const blink::WebString& name) { | |
| 1991 return createChildFrame(parent, name, blink::WebSandboxNone); | |
| 1992 } | |
| 1993 | |
| 1927 blink::WebFrame* RenderFrameImpl::createChildFrame( | 1994 blink::WebFrame* RenderFrameImpl::createChildFrame( |
| 1928 blink::WebLocalFrame* parent, | 1995 blink::WebLocalFrame* parent, |
| 1929 const blink::WebString& name) { | 1996 const blink::WebString& name, |
| 1997 blink::WebSandboxFlags sandbox_flags) { | |
| 1930 // Synchronously notify the browser of a child frame creation to get the | 1998 // Synchronously notify the browser of a child frame creation to get the |
| 1931 // routing_id for the RenderFrame. | 1999 // routing_id for the RenderFrame. |
| 1932 int child_routing_id = MSG_ROUTING_NONE; | 2000 int child_routing_id = MSG_ROUTING_NONE; |
| 1933 Send(new FrameHostMsg_CreateChildFrame(routing_id_, | 2001 Send(new FrameHostMsg_CreateChildFrame( |
| 1934 base::UTF16ToUTF8(name), | 2002 routing_id_, |
| 1935 &child_routing_id)); | 2003 base::UTF16ToUTF8(name), |
| 2004 static_cast<content::SandboxFlags>(sandbox_flags), | |
| 2005 &child_routing_id)); | |
| 1936 // Allocation of routing id failed, so we can't create a child frame. This can | 2006 // Allocation of routing id failed, so we can't create a child frame. This can |
| 1937 // happen if this RenderFrameImpl's IPCs are being filtered when in swapped | 2007 // happen if this RenderFrameImpl's IPCs are being filtered when in swapped |
| 1938 // out state. | 2008 // out state. |
| 1939 if (child_routing_id == MSG_ROUTING_NONE) { | 2009 if (child_routing_id == MSG_ROUTING_NONE) { |
| 1940 #if !defined(OS_LINUX) | 2010 #if !defined(OS_LINUX) |
| 1941 // DumpWithoutCrashing() crashes on Linux in renderer processes when | 2011 // DumpWithoutCrashing() crashes on Linux in renderer processes when |
| 1942 // breakpad and sandboxing are enabled: crbug.com/349600 | 2012 // breakpad and sandboxing are enabled: crbug.com/349600 |
| 1943 base::debug::Alias(parent); | 2013 base::debug::Alias(parent); |
| 1944 base::debug::Alias(&routing_id_); | 2014 base::debug::Alias(&routing_id_); |
| 1945 bool render_view_is_swapped_out = GetRenderWidget()->is_swapped_out(); | 2015 bool render_view_is_swapped_out = GetRenderWidget()->is_swapped_out(); |
| (...skipping 2369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4315 | 4385 |
| 4316 #if defined(ENABLE_BROWSER_CDMS) | 4386 #if defined(ENABLE_BROWSER_CDMS) |
| 4317 RendererCdmManager* RenderFrameImpl::GetCdmManager() { | 4387 RendererCdmManager* RenderFrameImpl::GetCdmManager() { |
| 4318 if (!cdm_manager_) | 4388 if (!cdm_manager_) |
| 4319 cdm_manager_ = new RendererCdmManager(this); | 4389 cdm_manager_ = new RendererCdmManager(this); |
| 4320 return cdm_manager_; | 4390 return cdm_manager_; |
| 4321 } | 4391 } |
| 4322 #endif // defined(ENABLE_BROWSER_CDMS) | 4392 #endif // defined(ENABLE_BROWSER_CDMS) |
| 4323 | 4393 |
| 4324 } // namespace content | 4394 } // namespace content |
| OLD | NEW |