Index: chrome/renderer/render_view.h |
=================================================================== |
--- chrome/renderer/render_view.h (revision 3394) |
+++ chrome/renderer/render_view.h (working copy) |
@@ -51,7 +51,21 @@ |
struct FileUploadData; |
} |
+// We need to prevent a page from trying to create infinite popups. It is not |
+// as simple as keeping a count of the number of immediate children |
+// popups. Having an html file that window.open()s itself would create |
+// an unlimited chain of RenderViews who only have one RenderView child. |
// |
+// Therefore, each new top level RenderView creates a new counter and shares it |
+// with all its children and grandchildren popup RenderViews created with |
+// CreateWebView() to have a sort of global limit for the page so no more than |
+// kMaximumNumberOfPopups popups are created. |
+// |
+// This is a RefCounted holder of an int because I can't say |
+// scoped_refptr<int>. |
+typedef base::RefCountedData<int> SharedRenderViewCounter; |
+ |
+// |
// RenderView is an object that manages a WebView object, and provides a |
// communication interface with an embedding application process |
// |
@@ -64,12 +78,15 @@ |
// the renderer and plugin processes know to pump window messages. If this |
// is a constrained popup or as a new tab, opener_id is the routing ID of the |
// RenderView responsible for creating this RenderView (corresponding to the |
- // parent_hwnd). |
- static RenderView* Create(HWND parent_hwnd, |
- HANDLE modal_dialog_event, |
- int32 opener_id, |
- const WebPreferences& webkit_prefs, |
- int32 routing_id); |
+ // parent_hwnd). |counter| is either a currently initialized counter, or NULL |
+ // (in which case we treat this RenderView as a top level window). |
+ static RenderView* Create( |
+ HWND parent_hwnd, |
+ HANDLE modal_dialog_event, |
+ int32 opener_id, |
+ const WebPreferences& webkit_prefs, |
+ SharedRenderViewCounter* counter, |
+ int32 routing_id); |
// Sets the "next page id" counter. |
static void SetNextPageID(int32 next_page_id); |
@@ -293,6 +310,7 @@ |
HANDLE modal_dialog_event, |
int32 opener_id, |
const WebPreferences& webkit_prefs, |
+ SharedRenderViewCounter* counter, |
int32 routing_id); |
void UpdateURL(WebFrame* frame); |
@@ -443,6 +461,10 @@ |
void OnMessageFromExternalHost(const std::string& target, |
const std::string& message); |
+ // Message that we should no longer be part of the current popup window |
+ // grouping, and should form our own grouping. |
+ void OnDisassociateFromPopupCount(); |
+ |
// Switches the frame's CSS media type to "print" and calculate the number of |
// printed pages that are to be expected. |frame| will be used to calculate |
// the number of expected pages for this frame only. |
@@ -617,6 +639,16 @@ |
// True if the page has any frame-level unload or beforeunload listeners. |
bool has_unload_listener_; |
+ // The total number of unrequested popups that exist and can be followed back |
+ // to a common opener. This count is shared among all RenderViews created |
+ // with CreateWebView(). All popups are treated as unrequested until |
+ // specifically instructed otherwise by the Browser process. |
+ scoped_refptr<SharedRenderViewCounter> shared_popup_counter_; |
+ |
+ // Whether this is a top level window (instead of a popup). Top level windows |
+ // shouldn't count against their own |shared_popup_counter_|. |
+ bool decrement_shared_popup_at_destruction_; |
+ |
// Handles accessibility requests into the renderer side, as well as |
// maintains the cache and other features of the accessibility tree. |
scoped_ptr<GlueAccessibility> glue_accessibility_; |