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

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

Issue 6319001: Support window.opener after a process swap. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Update comments. Created 9 years, 8 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
« no previous file with comments | « content/renderer/render_view.h ('k') | no next file » | 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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_view.h" 5 #include "content/renderer/render_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 webkit_preferences_(webkit_prefs), 474 webkit_preferences_(webkit_prefs),
475 send_content_state_immediately_(false), 475 send_content_state_immediately_(false),
476 enabled_bindings_(0), 476 enabled_bindings_(0),
477 send_preferred_size_changes_(false), 477 send_preferred_size_changes_(false),
478 script_can_close_(true), 478 script_can_close_(true),
479 is_loading_(false), 479 is_loading_(false),
480 navigation_gesture_(NavigationGestureUnknown), 480 navigation_gesture_(NavigationGestureUnknown),
481 opened_by_user_gesture_(true), 481 opened_by_user_gesture_(true),
482 opener_suppressed_(false), 482 opener_suppressed_(false),
483 is_prerendering_(false), 483 is_prerendering_(false),
484 is_swapped_out_(false),
484 page_id_(-1), 485 page_id_(-1),
485 last_page_id_sent_to_browser_(-1), 486 last_page_id_sent_to_browser_(-1),
486 last_indexed_page_id_(-1), 487 last_indexed_page_id_(-1),
487 history_list_offset_(-1), 488 history_list_offset_(-1),
488 history_list_length_(0), 489 history_list_length_(0),
489 has_unload_listener_(false), 490 has_unload_listener_(false),
490 target_url_status_(TARGET_NONE), 491 target_url_status_(TARGET_NONE),
491 view_type_(ViewType::INVALID), 492 view_type_(ViewType::INVALID),
492 browser_window_id_(-1), 493 browser_window_id_(-1),
493 ALLOW_THIS_IN_INITIALIZER_LIST(pepper_delegate_(this)), 494 ALLOW_THIS_IN_INITIALIZER_LIST(pepper_delegate_(this)),
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
656 657
657 void RenderView::AddObserver(RenderViewObserver* observer) { 658 void RenderView::AddObserver(RenderViewObserver* observer) {
658 observers_.AddObserver(observer); 659 observers_.AddObserver(observer);
659 } 660 }
660 661
661 void RenderView::RemoveObserver(RenderViewObserver* observer) { 662 void RenderView::RemoveObserver(RenderViewObserver* observer) {
662 observer->set_render_view(NULL); 663 observer->set_render_view(NULL);
663 observers_.RemoveObserver(observer); 664 observers_.RemoveObserver(observer);
664 } 665 }
665 666
667 void RenderView::SwapIn() {
668 DCHECK(is_swapped_out_);
669 is_swapped_out_ = false;
670
671 // Increment the ChildProcess's ref count now that this RenderView is active
672 // again. This prevents the process from exiting.
673 RenderProcess::current()->AddRefProcess();
674 }
675
666 bool RenderView::RendererAccessibilityNotification::ShouldIncludeChildren() { 676 bool RenderView::RendererAccessibilityNotification::ShouldIncludeChildren() {
667 typedef ViewHostMsg_AccessibilityNotification_Params params; 677 typedef ViewHostMsg_AccessibilityNotification_Params params;
668 if (type == WebKit::WebAccessibilityNotificationChildrenChanged || 678 if (type == WebKit::WebAccessibilityNotificationChildrenChanged ||
669 type == WebKit::WebAccessibilityNotificationLoadComplete) { 679 type == WebKit::WebAccessibilityNotificationLoadComplete) {
670 return true; 680 return true;
671 } 681 }
672 return false; 682 return false;
673 } 683 }
674 684
675 WebKit::WebView* RenderView::webview() const { 685 WebKit::WebView* RenderView::webview() const {
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
938 OnDisplayPrerenderedPage) 948 OnDisplayPrerenderedPage)
939 IPC_MESSAGE_HANDLER(ViewMsg_RunFileChooserResponse, OnFileChooserResponse) 949 IPC_MESSAGE_HANDLER(ViewMsg_RunFileChooserResponse, OnFileChooserResponse)
940 IPC_MESSAGE_HANDLER(ViewMsg_EnableViewSourceMode, OnEnableViewSourceMode) 950 IPC_MESSAGE_HANDLER(ViewMsg_EnableViewSourceMode, OnEnableViewSourceMode)
941 IPC_MESSAGE_HANDLER(ViewMsg_GetAllSavableResourceLinksForCurrentPage, 951 IPC_MESSAGE_HANDLER(ViewMsg_GetAllSavableResourceLinksForCurrentPage,
942 OnGetAllSavableResourceLinksForCurrentPage) 952 OnGetAllSavableResourceLinksForCurrentPage)
943 IPC_MESSAGE_HANDLER( 953 IPC_MESSAGE_HANDLER(
944 ViewMsg_GetSerializedHtmlDataForCurrentPageWithLocalLinks, 954 ViewMsg_GetSerializedHtmlDataForCurrentPageWithLocalLinks,
945 OnGetSerializedHtmlDataForCurrentPageWithLocalLinks) 955 OnGetSerializedHtmlDataForCurrentPageWithLocalLinks)
946 IPC_MESSAGE_HANDLER(ExtensionMsg_GetApplicationInfo, OnGetApplicationInfo) 956 IPC_MESSAGE_HANDLER(ExtensionMsg_GetApplicationInfo, OnGetApplicationInfo)
947 IPC_MESSAGE_HANDLER(ViewMsg_ShouldClose, OnShouldClose) 957 IPC_MESSAGE_HANDLER(ViewMsg_ShouldClose, OnShouldClose)
958 IPC_MESSAGE_HANDLER(ViewMsg_SwapOut, OnSwapOut)
948 IPC_MESSAGE_HANDLER(ViewMsg_ClosePage, OnClosePage) 959 IPC_MESSAGE_HANDLER(ViewMsg_ClosePage, OnClosePage)
949 IPC_MESSAGE_HANDLER(ViewMsg_ThemeChanged, OnThemeChanged) 960 IPC_MESSAGE_HANDLER(ViewMsg_ThemeChanged, OnThemeChanged)
950 IPC_MESSAGE_HANDLER(ViewMsg_HandleMessageFromExternalHost, 961 IPC_MESSAGE_HANDLER(ViewMsg_HandleMessageFromExternalHost,
951 OnHandleMessageFromExternalHost) 962 OnHandleMessageFromExternalHost)
952 IPC_MESSAGE_HANDLER(ViewMsg_DisassociateFromPopupCount, 963 IPC_MESSAGE_HANDLER(ViewMsg_DisassociateFromPopupCount,
953 OnDisassociateFromPopupCount) 964 OnDisassociateFromPopupCount)
954 IPC_MESSAGE_HANDLER(ViewMsg_AllowScriptToClose, 965 IPC_MESSAGE_HANDLER(ViewMsg_AllowScriptToClose,
955 OnAllowScriptToClose) 966 OnAllowScriptToClose)
956 IPC_MESSAGE_HANDLER(ViewMsg_MoveOrResizeStarted, OnMoveOrResizeStarted) 967 IPC_MESSAGE_HANDLER(ViewMsg_MoveOrResizeStarted, OnMoveOrResizeStarted)
957 IPC_MESSAGE_HANDLER(ViewMsg_ClearFocusedNode, OnClearFocusedNode) 968 IPC_MESSAGE_HANDLER(ViewMsg_ClearFocusedNode, OnClearFocusedNode)
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
1226 1237
1227 HISTOGRAM_TIMES("Renderer4.Snapshot", 1238 HISTOGRAM_TIMES("Renderer4.Snapshot",
1228 base::TimeTicks::Now() - beginning_time); 1239 base::TimeTicks::Now() - beginning_time);
1229 return true; 1240 return true;
1230 } 1241 }
1231 1242
1232 void RenderView::OnNavigate(const ViewMsg_Navigate_Params& params) { 1243 void RenderView::OnNavigate(const ViewMsg_Navigate_Params& params) {
1233 if (!webview()) 1244 if (!webview())
1234 return; 1245 return;
1235 1246
1247 // Swap this renderer back in if necessary.
1248 if (is_swapped_out_) {
1249 SwapIn();
1250 }
1251
1236 history_list_offset_ = params.current_history_list_offset; 1252 history_list_offset_ = params.current_history_list_offset;
1237 history_list_length_ = params.current_history_list_length; 1253 history_list_length_ = params.current_history_list_length;
1238 1254
1239 child_process_logging::SetActiveURL(params.url); 1255 child_process_logging::SetActiveURL(params.url);
1240 1256
1241 AboutHandler::MaybeHandle(params.url); 1257 AboutHandler::MaybeHandle(params.url);
1242 1258
1243 bool is_reload = 1259 bool is_reload =
1244 params.navigation_type == ViewMsg_Navigate_Type::RELOAD || 1260 params.navigation_type == ViewMsg_Navigate_Type::RELOAD ||
1245 params.navigation_type == ViewMsg_Navigate_Type::RELOAD_IGNORING_CACHE; 1261 params.navigation_type == ViewMsg_Navigate_Type::RELOAD_IGNORING_CACHE;
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
1480 1496
1481 // Tell the embedding application that the URL of the active page has changed 1497 // Tell the embedding application that the URL of the active page has changed
1482 void RenderView::UpdateURL(WebFrame* frame) { 1498 void RenderView::UpdateURL(WebFrame* frame) {
1483 WebDataSource* ds = frame->dataSource(); 1499 WebDataSource* ds = frame->dataSource();
1484 DCHECK(ds); 1500 DCHECK(ds);
1485 1501
1486 const WebURLRequest& request = ds->request(); 1502 const WebURLRequest& request = ds->request();
1487 const WebURLRequest& original_request = ds->originalRequest(); 1503 const WebURLRequest& original_request = ds->originalRequest();
1488 const WebURLResponse& response = ds->response(); 1504 const WebURLResponse& response = ds->response();
1489 1505
1506 // Don't send an update if this renderer is swapped out.
1507 // TODO(creis): This won't be necessary once OnSwapOut is fixed to clear
1508 // the frame without a full navigation.
1509 if (is_swapped_out_) {
1510 DCHECK(request.url() == GURL(chrome::kAboutBlankURL));
1511 return;
1512 }
1513
1490 NavigationState* navigation_state = NavigationState::FromDataSource(ds); 1514 NavigationState* navigation_state = NavigationState::FromDataSource(ds);
1491 DCHECK(navigation_state); 1515 DCHECK(navigation_state);
1492 1516
1493 ViewHostMsg_FrameNavigate_Params params; 1517 ViewHostMsg_FrameNavigate_Params params;
1494 params.http_status_code = response.httpStatusCode(); 1518 params.http_status_code = response.httpStatusCode();
1495 params.is_post = false; 1519 params.is_post = false;
1496 params.page_id = page_id_; 1520 params.page_id = page_id_;
1497 params.frame_id = frame->identifier(); 1521 params.frame_id = frame->identifier();
1498 params.socket_address.set_host(response.remoteIPAddress().utf8()); 1522 params.socket_address.set_host(response.remoteIPAddress().utf8());
1499 params.socket_address.set_port(response.remotePort()); 1523 params.socket_address.set_port(response.remotePort());
(...skipping 669 matching lines...) Expand 10 before | Expand all | Expand 10 after
2169 UTF16ToWideHack(default_value), 2193 UTF16ToWideHack(default_value),
2170 frame->url(), 2194 frame->url(),
2171 &result); 2195 &result);
2172 if (ok) 2196 if (ok)
2173 actual_value->assign(WideToUTF16Hack(result)); 2197 actual_value->assign(WideToUTF16Hack(result));
2174 return ok; 2198 return ok;
2175 } 2199 }
2176 2200
2177 bool RenderView::runModalBeforeUnloadDialog( 2201 bool RenderView::runModalBeforeUnloadDialog(
2178 WebFrame* frame, const WebString& message) { 2202 WebFrame* frame, const WebString& message) {
2203 // If we are swapping out, we have already run the beforeunload handler.
2204 // TODO(creis): Fix OnSwapOut to clear the frame without running beforeunload
2205 // at all, to avoid running it twice.
2206 if (is_swapped_out_)
2207 return true;
2208
2179 bool success = false; 2209 bool success = false;
2180 // This is an ignored return value, but is included so we can accept the same 2210 // This is an ignored return value, but is included so we can accept the same
2181 // response as RunJavaScriptMessage. 2211 // response as RunJavaScriptMessage.
2182 std::wstring ignored_result; 2212 std::wstring ignored_result;
2183 SendAndRunNestedMessageLoop(new ViewHostMsg_RunBeforeUnloadConfirm( 2213 SendAndRunNestedMessageLoop(new ViewHostMsg_RunBeforeUnloadConfirm(
2184 routing_id_, frame->url(), UTF16ToWideHack(message), &success, 2214 routing_id_, frame->url(), UTF16ToWideHack(message), &success,
2185 &ignored_result)); 2215 &ignored_result));
2186 return success; 2216 return success;
2187 } 2217 }
2188 2218
(...skipping 2231 matching lines...) Expand 10 before | Expand all | Expand 10 after
4420 frame_url, 4450 frame_url,
4421 data.data(), 4451 data.data(),
4422 static_cast<int32>(status))); 4452 static_cast<int32>(status)));
4423 } 4453 }
4424 4454
4425 void RenderView::OnShouldClose() { 4455 void RenderView::OnShouldClose() {
4426 bool should_close = webview()->dispatchBeforeUnloadEvent(); 4456 bool should_close = webview()->dispatchBeforeUnloadEvent();
4427 Send(new ViewHostMsg_ShouldClose_ACK(routing_id_, should_close)); 4457 Send(new ViewHostMsg_ShouldClose_ACK(routing_id_, should_close));
4428 } 4458 }
4429 4459
4430 void RenderView::OnClosePage(const ViewMsg_ClosePage_Params& params) { 4460 void RenderView::OnSwapOut(const ViewMsg_SwapOut_Params& params) {
4461 // Swap this RenderView out so the tab can navigate to a page rendered by a
4462 // different process. This involves running the unload handler, clearing
4463 // the page, and allowing the process to exit if there are no other active
4464 // RenderViews in it.
4465 DCHECK(!is_swapped_out_);
4466 is_swapped_out_ = true;
4467
4468 // TODO(davemoore) This code should be removed once willClose() gets
4469 // called when a page is destroyed. page_load_histograms_.Dump() is safe
4470 // to call multiple times for the same frame, but it will simplify things.
4471 page_load_histograms_.Dump(webview()->mainFrame());
4472 page_load_histograms_.ResetCrossFramePropertyAccess();
4473
4474 // Send an UpdateState message before we get swapped out.
4475 SyncNavigationState();
4476
4477 // Replace the page with a blank dummy URL, triggering the unload handler.
4478 // TODO(creis): Need to add a better way to do this that avoids running the
4479 // beforeunload handler and that can't match an existing URL.
4480 WebURLRequest request(GURL(chrome::kAboutBlankURL));
4481 webview()->mainFrame()->loadRequest(request);
Charlie Reis 2011/04/13 22:57:21 This is the main sticking point right now. We nee
4482
4483 // Just echo back the params in the ACK.
4484 Send(new ViewHostMsg_SwapOut_ACK(routing_id_, params));
4485
4486 // Remove this RenderView from the ChildProcess's ref count, allowing the
4487 // process to exit if all of the RenderViews are swapped out. We will
4488 // increment the count if this RenderView is swapped back in.
4489 RenderProcess::current()->ReleaseProcess();
4490 }
4491
4492 void RenderView::OnClosePage() {
4431 // TODO(creis): We'd rather use webview()->Close() here, but that currently 4493 // TODO(creis): We'd rather use webview()->Close() here, but that currently
4432 // sets the WebView's delegate_ to NULL, preventing any JavaScript dialogs 4494 // sets the WebView's delegate_ to NULL, preventing any JavaScript dialogs
4433 // in the onunload handler from appearing. For now, we're bypassing that and 4495 // in the onunload handler from appearing. For now, we're bypassing that and
4434 // calling the FrameLoader's CloseURL method directly. This should be 4496 // calling the FrameLoader's CloseURL method directly. This should be
4435 // revisited to avoid having two ways to close a page. Having a single way 4497 // revisited to avoid having two ways to close a page. Having a single way
4436 // to close that can run onunload is also useful for fixing 4498 // to close that can run onunload is also useful for fixing
4437 // http://b/issue?id=753080. 4499 // http://b/issue?id=753080.
4438 // TODO(davemoore) This code should be removed once willClose() gets 4500 // TODO(davemoore) This code should be removed once willClose() gets
4439 // called when a page is destroyed. page_load_histograms_.Dump() is safe 4501 // called when a page is destroyed. page_load_histograms_.Dump() is safe
4440 // to call multiple times for the same frame, but it will simplify things. 4502 // to call multiple times for the same frame, but it will simplify things.
4441 page_load_histograms_.Dump(webview()->mainFrame()); 4503 page_load_histograms_.Dump(webview()->mainFrame());
4442 page_load_histograms_.ResetCrossFramePropertyAccess(); 4504 page_load_histograms_.ResetCrossFramePropertyAccess();
4443 webview()->dispatchUnloadEvent(); 4505 webview()->dispatchUnloadEvent();
4444 4506
4445 // Just echo back the params in the ACK. 4507 Send(new ViewHostMsg_ClosePage_ACK(routing_id_));
4446 Send(new ViewHostMsg_ClosePage_ACK(routing_id_, params));
4447 } 4508 }
4448 4509
4449 void RenderView::OnThemeChanged() { 4510 void RenderView::OnThemeChanged() {
4450 #if defined(OS_WIN) 4511 #if defined(OS_WIN)
4451 gfx::NativeThemeWin::instance()->CloseHandles(); 4512 gfx::NativeThemeWin::instance()->CloseHandles();
4452 if (webview()) 4513 if (webview())
4453 webview()->themeChanged(); 4514 webview()->themeChanged();
4454 #else // defined(OS_WIN) 4515 #else // defined(OS_WIN)
4455 // TODO(port): we don't support theming on non-Windows platforms yet 4516 // TODO(port): we don't support theming on non-Windows platforms yet
4456 NOTIMPLEMENTED(); 4517 NOTIMPLEMENTED();
(...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after
5060 const webkit_glue::CustomContextMenuContext& custom_context) { 5121 const webkit_glue::CustomContextMenuContext& custom_context) {
5061 if (custom_context.is_pepper_menu) 5122 if (custom_context.is_pepper_menu)
5062 pepper_delegate_.OnContextMenuClosed(custom_context); 5123 pepper_delegate_.OnContextMenuClosed(custom_context);
5063 else 5124 else
5064 context_menu_node_.reset(); 5125 context_menu_node_.reset();
5065 } 5126 }
5066 5127
5067 void RenderView::OnNetworkStateChanged(bool online) { 5128 void RenderView::OnNetworkStateChanged(bool online) {
5068 WebNetworkStateNotifier::setOnLine(online); 5129 WebNetworkStateNotifier::setOnLine(online);
5069 } 5130 }
OLDNEW
« no previous file with comments | « content/renderer/render_view.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698