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

Side by Side Diff: content/renderer/render_view_browsertest.cc

Issue 1635873003: Replicating WebFrame::uniqueName across renderers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@dump-render-tree3
Patch Set: Rebasing... Created 4 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
« no previous file with comments | « content/renderer/render_frame_proxy.cc ('k') | content/test/test_render_frame_host.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
11 #include "base/location.h" 11 #include "base/location.h"
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "base/single_thread_task_runner.h" 13 #include "base/single_thread_task_runner.h"
14 #include "base/strings/string_util.h" 14 #include "base/strings/string_util.h"
15 #include "base/strings/utf_string_conversions.h" 15 #include "base/strings/utf_string_conversions.h"
16 #include "base/thread_task_runner_handle.h" 16 #include "base/thread_task_runner_handle.h"
17 #include "base/time/time.h" 17 #include "base/time/time.h"
18 #include "base/win/windows_version.h" 18 #include "base/win/windows_version.h"
19 #include "build/build_config.h" 19 #include "build/build_config.h"
20 #include "content/child/request_extra_data.h" 20 #include "content/child/request_extra_data.h"
21 #include "content/child/service_worker/service_worker_network_provider.h" 21 #include "content/child/service_worker/service_worker_network_provider.h"
22 #include "content/common/frame_messages.h" 22 #include "content/common/frame_messages.h"
23 #include "content/common/frame_replication_state.h"
23 #include "content/common/site_isolation_policy.h" 24 #include "content/common/site_isolation_policy.h"
24 #include "content/common/ssl_status_serialization.h" 25 #include "content/common/ssl_status_serialization.h"
25 #include "content/common/view_messages.h" 26 #include "content/common/view_messages.h"
26 #include "content/public/browser/browser_context.h" 27 #include "content/public/browser/browser_context.h"
27 #include "content/public/browser/native_web_keyboard_event.h" 28 #include "content/public/browser/native_web_keyboard_event.h"
28 #include "content/public/browser/web_ui_controller_factory.h" 29 #include "content/public/browser/web_ui_controller_factory.h"
29 #include "content/public/common/bindings_policy.h" 30 #include "content/public/common/bindings_policy.h"
30 #include "content/public/common/browser_side_navigation_policy.h" 31 #include "content/public/common/browser_side_navigation_policy.h"
31 #include "content/public/common/content_switches.h" 32 #include "content/public/common/content_switches.h"
32 #include "content/public/common/page_zoom.h" 33 #include "content/public/common/page_zoom.h"
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 } 148 }
148 }; 149 };
149 150
150 // Timestamps logged close to each other under low resolution timers 151 // Timestamps logged close to each other under low resolution timers
151 // are more likely to record the same value. Allow for this by relaxing 152 // are more likely to record the same value. Allow for this by relaxing
152 // constraints on systems with these timers. 153 // constraints on systems with these timers.
153 bool TimeTicksGT(const base::TimeTicks& x, const base::TimeTicks& y) { 154 bool TimeTicksGT(const base::TimeTicks& x, const base::TimeTicks& y) {
154 return base::TimeTicks::IsHighResolution() ? x > y : x >= y; 155 return base::TimeTicks::IsHighResolution() ? x > y : x >= y;
155 } 156 }
156 157
158 // FrameReplicationState is normally maintained in the browser process,
159 // but the function below provides a way for tests to construct a partial
160 // FrameReplicationState within the renderer process. We say "partial",
161 // because some fields of FrameReplicationState cannot be filled out
162 // by content-layer, renderer code (still the constructed, partial
163 // FrameReplicationState is sufficiently complete to avoid trigerring
164 // asserts that a default/empty FrameReplicationState would).
165 FrameReplicationState ReconstructReplicationStateForTesting(
166 TestRenderFrame* test_render_frame) {
167 blink::WebLocalFrame* frame = test_render_frame->GetWebFrame();
168
169 FrameReplicationState result;
170 // can't recover result.scope - no way to get WebTreeScopeType via public
171 // blink API...
172 result.name = base::UTF16ToUTF8(base::StringPiece16(frame->assignedName()));
173 result.unique_name =
174 base::UTF16ToUTF8(base::StringPiece16(frame->uniqueName()));
175 result.sandbox_flags = frame->effectiveSandboxFlags();
176 // result.should_enforce_strict_mixed_content_checking is calculated in the
177 // browser...
178 result.origin = frame->securityOrigin();
179
180 return result;
181 }
182
157 } // namespace 183 } // namespace
158 184
159 class RenderViewImplTest : public RenderViewTest { 185 class RenderViewImplTest : public RenderViewTest {
160 public: 186 public:
161 RenderViewImplTest() { 187 RenderViewImplTest() {
162 // Attach a pseudo keyboard device to this object. 188 // Attach a pseudo keyboard device to this object.
163 mock_keyboard_.reset(new MockKeyboard()); 189 mock_keyboard_.reset(new MockKeyboard());
164 } 190 }
165 191
166 ~RenderViewImplTest() override {} 192 ~RenderViewImplTest() override {}
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after
715 if (SiteIsolationPolicy::IsSwappedOutStateForbidden()) { 741 if (SiteIsolationPolicy::IsSwappedOutStateForbidden()) {
716 return; 742 return;
717 } 743 }
718 LoadHTML("<div>Page A</div>"); 744 LoadHTML("<div>Page A</div>");
719 int initial_page_id = view_page_id(); 745 int initial_page_id = view_page_id();
720 746
721 // Increment the ref count so that we don't exit when swapping out. 747 // Increment the ref count so that we don't exit when swapping out.
722 RenderProcess::current()->AddRefProcess(); 748 RenderProcess::current()->AddRefProcess();
723 749
724 // Respond to a swap out request. 750 // Respond to a swap out request.
725 frame()->SwapOut(kProxyRoutingId, true, content::FrameReplicationState()); 751 frame()->SwapOut(kProxyRoutingId, true,
752 ReconstructReplicationStateForTesting(frame()));
726 753
727 // Ensure the swap out commits synchronously. 754 // Ensure the swap out commits synchronously.
728 EXPECT_NE(initial_page_id, view_page_id()); 755 EXPECT_NE(initial_page_id, view_page_id());
729 756
730 // Check for a valid OnSwapOutACK. 757 // Check for a valid OnSwapOutACK.
731 const IPC::Message* msg = render_thread_->sink().GetUniqueMessageMatching( 758 const IPC::Message* msg = render_thread_->sink().GetUniqueMessageMatching(
732 FrameHostMsg_SwapOut_ACK::ID); 759 FrameHostMsg_SwapOut_ACK::ID);
733 ASSERT_TRUE(msg); 760 ASSERT_TRUE(msg);
734 761
735 // It is possible to get another swap out request. Ensure that we send 762 // It is possible to get another swap out request. Ensure that we send
736 // an ACK, even if we don't have to do anything else. 763 // an ACK, even if we don't have to do anything else.
737 render_thread_->sink().ClearMessages(); 764 render_thread_->sink().ClearMessages();
738 frame()->SwapOut(kProxyRoutingId, false, content::FrameReplicationState()); 765 frame()->SwapOut(kProxyRoutingId, false,
766 ReconstructReplicationStateForTesting(frame()));
739 const IPC::Message* msg2 = render_thread_->sink().GetUniqueMessageMatching( 767 const IPC::Message* msg2 = render_thread_->sink().GetUniqueMessageMatching(
740 FrameHostMsg_SwapOut_ACK::ID); 768 FrameHostMsg_SwapOut_ACK::ID);
741 ASSERT_TRUE(msg2); 769 ASSERT_TRUE(msg2);
742 770
743 // If we navigate back to this RenderView, ensure we don't send a state 771 // If we navigate back to this RenderView, ensure we don't send a state
744 // update for the swapped out URL. (http://crbug.com/72235) 772 // update for the swapped out URL. (http://crbug.com/72235)
745 CommonNavigationParams common_params; 773 CommonNavigationParams common_params;
746 RequestNavigationParams request_params; 774 RequestNavigationParams request_params;
747 common_params.url = GURL("data:text/html,<div>Page B</div>"); 775 common_params.url = GURL("data:text/html,<div>Page B</div>");
748 common_params.navigation_type = FrameMsg_Navigate_Type::NORMAL; 776 common_params.navigation_type = FrameMsg_Navigate_Type::NORMAL;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 request_params_A.page_id = 1; 824 request_params_A.page_id = 1;
797 request_params_A.nav_entry_id = 1; 825 request_params_A.nav_entry_id = 1;
798 request_params_A.page_state = state_A; 826 request_params_A.page_state = state_A;
799 frame()->Navigate(common_params_A, StartNavigationParams(), request_params_A); 827 frame()->Navigate(common_params_A, StartNavigationParams(), request_params_A);
800 EXPECT_EQ(1, view()->historyBackListCount()); 828 EXPECT_EQ(1, view()->historyBackListCount());
801 EXPECT_EQ(2, view()->historyBackListCount() + 829 EXPECT_EQ(2, view()->historyBackListCount() +
802 view()->historyForwardListCount() + 1); 830 view()->historyForwardListCount() + 1);
803 ProcessPendingMessages(); 831 ProcessPendingMessages();
804 832
805 // Respond to a swap out request. 833 // Respond to a swap out request.
806 frame()->SwapOut(kProxyRoutingId, true, content::FrameReplicationState()); 834 frame()->SwapOut(kProxyRoutingId, true,
835 ReconstructReplicationStateForTesting(frame()));
807 836
808 // Check for a OnSwapOutACK. 837 // Check for a OnSwapOutACK.
809 const IPC::Message* msg = render_thread_->sink().GetUniqueMessageMatching( 838 const IPC::Message* msg = render_thread_->sink().GetUniqueMessageMatching(
810 FrameHostMsg_SwapOut_ACK::ID); 839 FrameHostMsg_SwapOut_ACK::ID);
811 ASSERT_TRUE(msg); 840 ASSERT_TRUE(msg);
812 render_thread_->sink().ClearMessages(); 841 render_thread_->sink().ClearMessages();
813 842
814 // It is possible to get a reload request at this point, containing the 843 // It is possible to get a reload request at this point, containing the
815 // params.page_state of the initial page (e.g., if the new page fails the 844 // params.page_state of the initial page (e.g., if the new page fails the
816 // provisional load in the renderer process, after we unload the old page). 845 // provisional load in the renderer process, after we unload the old page).
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 881
853 LoadHTML( 882 LoadHTML(
854 "Hello <iframe src='data:text/html,frame 1'></iframe>" 883 "Hello <iframe src='data:text/html,frame 1'></iframe>"
855 "<iframe src='data:text/html,frame 2'></iframe>"); 884 "<iframe src='data:text/html,frame 2'></iframe>");
856 WebFrame* web_frame = frame()->GetWebFrame(); 885 WebFrame* web_frame = frame()->GetWebFrame();
857 TestRenderFrame* child_frame = static_cast<TestRenderFrame*>( 886 TestRenderFrame* child_frame = static_cast<TestRenderFrame*>(
858 RenderFrame::FromWebFrame(web_frame->firstChild())); 887 RenderFrame::FromWebFrame(web_frame->firstChild()));
859 888
860 // Swap the child frame out and pass a replicated origin to be set for 889 // Swap the child frame out and pass a replicated origin to be set for
861 // WebRemoteFrame. 890 // WebRemoteFrame.
862 content::FrameReplicationState replication_state; 891 content::FrameReplicationState replication_state =
892 ReconstructReplicationStateForTesting(child_frame);
863 replication_state.origin = url::Origin(GURL("http://foo.com")); 893 replication_state.origin = url::Origin(GURL("http://foo.com"));
864 child_frame->SwapOut(kProxyRoutingId, true, replication_state); 894 child_frame->SwapOut(kProxyRoutingId, true, replication_state);
865 895
866 // The child frame should now be a WebRemoteFrame. 896 // The child frame should now be a WebRemoteFrame.
867 EXPECT_TRUE(web_frame->firstChild()->isWebRemoteFrame()); 897 EXPECT_TRUE(web_frame->firstChild()->isWebRemoteFrame());
868 898
869 // Expect the origin to be updated properly. 899 // Expect the origin to be updated properly.
870 blink::WebSecurityOrigin origin = web_frame->firstChild()->securityOrigin(); 900 blink::WebSecurityOrigin origin = web_frame->firstChild()->securityOrigin();
871 EXPECT_EQ(origin.toString(), 901 EXPECT_EQ(origin.toString(),
872 WebString::fromUTF8(replication_state.origin.Serialize())); 902 WebString::fromUTF8(replication_state.origin.Serialize()));
(...skipping 17 matching lines...) Expand all
890 // This test should only run with --site-per-process. 920 // This test should only run with --site-per-process.
891 if (!AreAllSitesIsolatedForTesting()) 921 if (!AreAllSitesIsolatedForTesting())
892 return; 922 return;
893 923
894 LoadHTML("Hello <iframe src='data:text/html,frame 1'></iframe>"); 924 LoadHTML("Hello <iframe src='data:text/html,frame 1'></iframe>");
895 WebFrame* web_frame = frame()->GetWebFrame(); 925 WebFrame* web_frame = frame()->GetWebFrame();
896 TestRenderFrame* child_frame = static_cast<TestRenderFrame*>( 926 TestRenderFrame* child_frame = static_cast<TestRenderFrame*>(
897 RenderFrame::FromWebFrame(web_frame->firstChild())); 927 RenderFrame::FromWebFrame(web_frame->firstChild()));
898 928
899 // Swap the child frame out. 929 // Swap the child frame out.
900 child_frame->SwapOut(kProxyRoutingId, true, content::FrameReplicationState()); 930 FrameReplicationState replication_state =
931 ReconstructReplicationStateForTesting(child_frame);
932 child_frame->SwapOut(kProxyRoutingId, true, replication_state);
901 EXPECT_TRUE(web_frame->firstChild()->isWebRemoteFrame()); 933 EXPECT_TRUE(web_frame->firstChild()->isWebRemoteFrame());
902 934
903 // Do the first step of a remote-to-local transition for the child proxy, 935 // Do the first step of a remote-to-local transition for the child proxy,
904 // which is to create a provisional local frame. 936 // which is to create a provisional local frame.
905 int routing_id = kProxyRoutingId + 1; 937 int routing_id = kProxyRoutingId + 1;
906 FrameMsg_NewFrame_WidgetParams widget_params; 938 FrameMsg_NewFrame_WidgetParams widget_params;
907 widget_params.routing_id = MSG_ROUTING_NONE; 939 widget_params.routing_id = MSG_ROUTING_NONE;
908 widget_params.hidden = false; 940 widget_params.hidden = false;
909 RenderFrameImpl::CreateFrame(routing_id, kProxyRoutingId, MSG_ROUTING_NONE, 941 RenderFrameImpl::CreateFrame(routing_id, kProxyRoutingId, MSG_ROUTING_NONE,
910 frame()->GetRoutingID(), MSG_ROUTING_NONE, 942 frame()->GetRoutingID(), MSG_ROUTING_NONE,
911 content::FrameReplicationState(), nullptr, 943 replication_state, nullptr, widget_params,
912 widget_params, blink::WebFrameOwnerProperties()); 944 blink::WebFrameOwnerProperties());
913 TestRenderFrame* provisional_frame = 945 TestRenderFrame* provisional_frame =
914 static_cast<TestRenderFrame*>(RenderFrameImpl::FromRoutingID(routing_id)); 946 static_cast<TestRenderFrame*>(RenderFrameImpl::FromRoutingID(routing_id));
915 EXPECT_TRUE(provisional_frame); 947 EXPECT_TRUE(provisional_frame);
916 948
917 // Detach the child frame (currently remote) in the main frame. 949 // Detach the child frame (currently remote) in the main frame.
918 ExecuteJavaScriptForTests( 950 ExecuteJavaScriptForTests(
919 "document.body.removeChild(document.querySelector('iframe'));"); 951 "document.body.removeChild(document.querySelector('iframe'));");
920 RenderFrameProxy* child_proxy = 952 RenderFrameProxy* child_proxy =
921 RenderFrameProxy::FromRoutingID(kProxyRoutingId); 953 RenderFrameProxy::FromRoutingID(kProxyRoutingId);
922 EXPECT_FALSE(child_proxy); 954 EXPECT_FALSE(child_proxy);
(...skipping 26 matching lines...) Expand all
949 // shutdown of frame() in RenderViewTest.TearDown. 981 // shutdown of frame() in RenderViewTest.TearDown.
950 blink::WebURLRequest popup_request(GURL("http://foo.com")); 982 blink::WebURLRequest popup_request(GURL("http://foo.com"));
951 blink::WebView* new_web_view = view()->createView( 983 blink::WebView* new_web_view = view()->createView(
952 GetMainFrame(), popup_request, blink::WebWindowFeatures(), "foo", 984 GetMainFrame(), popup_request, blink::WebWindowFeatures(), "foo",
953 blink::WebNavigationPolicyNewForegroundTab, false); 985 blink::WebNavigationPolicyNewForegroundTab, false);
954 RenderViewImpl* new_view = RenderViewImpl::FromWebView(new_web_view); 986 RenderViewImpl* new_view = RenderViewImpl::FromWebView(new_web_view);
955 987
956 // Respond to a swap out request. 988 // Respond to a swap out request.
957 TestRenderFrame* new_main_frame = 989 TestRenderFrame* new_main_frame =
958 static_cast<TestRenderFrame*>(new_view->GetMainRenderFrame()); 990 static_cast<TestRenderFrame*>(new_view->GetMainRenderFrame());
959 new_main_frame->SwapOut(kProxyRoutingId, true, 991 new_main_frame->SwapOut(
960 content::FrameReplicationState()); 992 kProxyRoutingId, true,
993 ReconstructReplicationStateForTesting(new_main_frame));
961 994
962 // Simulate getting painted after swapping out. 995 // Simulate getting painted after swapping out.
963 new_view->DidFlushPaint(); 996 new_view->DidFlushPaint();
964 997
965 new_view->Close(); 998 new_view->Close();
966 new_view->Release(); 999 new_view->Release();
967 } 1000 }
968 1001
969 // Verify that the renderer process doesn't crash when device scale factor 1002 // Verify that the renderer process doesn't crash when device scale factor
970 // changes after a cross-process navigation has commited. 1003 // changes after a cross-process navigation has commited.
971 // See https://crbug.com/571603. 1004 // See https://crbug.com/571603.
972 TEST_F(RenderViewImplTest, SetZoomLevelAfterCrossProcessNavigation) { 1005 TEST_F(RenderViewImplTest, SetZoomLevelAfterCrossProcessNavigation) {
973 // This test should only run with out-of-process iframes enabled. 1006 // This test should only run with out-of-process iframes enabled.
974 if (!SiteIsolationPolicy::AreCrossProcessFramesPossible()) 1007 if (!SiteIsolationPolicy::AreCrossProcessFramesPossible())
975 return; 1008 return;
976 1009
977 // The bug reproduces if zoom is used for devices scale factor. 1010 // The bug reproduces if zoom is used for devices scale factor.
978 base::CommandLine::ForCurrentProcess()->AppendSwitch( 1011 base::CommandLine::ForCurrentProcess()->AppendSwitch(
979 switches::kEnableUseZoomForDSF); 1012 switches::kEnableUseZoomForDSF);
980 1013
981 LoadHTML("Hello world!"); 1014 LoadHTML("Hello world!");
982 1015
983 // Swap the main frame out after which it should become a WebRemoteFrame. 1016 // Swap the main frame out after which it should become a WebRemoteFrame.
984 TestRenderFrame* main_frame = 1017 TestRenderFrame* main_frame =
985 static_cast<TestRenderFrame*>(view()->GetMainRenderFrame()); 1018 static_cast<TestRenderFrame*>(view()->GetMainRenderFrame());
986 main_frame->SwapOut(kProxyRoutingId, true, content::FrameReplicationState()); 1019 main_frame->SwapOut(kProxyRoutingId, true,
1020 ReconstructReplicationStateForTesting(main_frame));
987 EXPECT_TRUE(view()->webview()->mainFrame()->isWebRemoteFrame()); 1021 EXPECT_TRUE(view()->webview()->mainFrame()->isWebRemoteFrame());
988 1022
989 // This should not cause a crash. 1023 // This should not cause a crash.
990 view()->OnDeviceScaleFactorChanged(); 1024 view()->OnDeviceScaleFactorChanged();
991 } 1025 }
992 1026
993 // Test that we get the correct UpdateState message when we go back twice 1027 // Test that we get the correct UpdateState message when we go back twice
994 // quickly without committing. Regression test for http://crbug.com/58082. 1028 // quickly without committing. Regression test for http://crbug.com/58082.
995 // Disabled: http://crbug.com/157357 . 1029 // Disabled: http://crbug.com/157357 .
996 TEST_F(RenderViewImplTest, DISABLED_LastCommittedUpdateState) { 1030 TEST_F(RenderViewImplTest, DISABLED_LastCommittedUpdateState) {
(...skipping 1757 matching lines...) Expand 10 before | Expand all | Expand 10 after
2754 FROM_HERE, 2788 FROM_HERE,
2755 base::Bind(&DevToolsAgentTest::CloseWhilePaused, base::Unretained(this))); 2789 base::Bind(&DevToolsAgentTest::CloseWhilePaused, base::Unretained(this)));
2756 ExecuteJavaScriptForTests("debugger;"); 2790 ExecuteJavaScriptForTests("debugger;");
2757 2791
2758 // CloseWhilePaused should resume execution and continue here. 2792 // CloseWhilePaused should resume execution and continue here.
2759 EXPECT_FALSE(IsPaused()); 2793 EXPECT_FALSE(IsPaused());
2760 Detach(); 2794 Detach();
2761 } 2795 }
2762 2796
2763 } // namespace content 2797 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/render_frame_proxy.cc ('k') | content/test/test_render_frame_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698