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

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

Issue 7388: Remove throttling code from the Browser process and... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 years, 2 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 | « chrome/renderer/render_view.h ('k') | chrome/test/data/constrained_files/infinite_popups.html » ('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) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 "chrome/renderer/render_view.h" 5 #include "chrome/renderer/render_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 static const int kDelayForForcedCaptureMs = 6000; 86 static const int kDelayForForcedCaptureMs = 6000;
87 87
88 // How often we will sync the navigation state when the user is changing form 88 // How often we will sync the navigation state when the user is changing form
89 // elements or scroll position. 89 // elements or scroll position.
90 const TimeDelta kDelayForNavigationSync = TimeDelta::FromSeconds(5); 90 const TimeDelta kDelayForNavigationSync = TimeDelta::FromSeconds(5);
91 91
92 // The next available page ID to use. This ensures that the page IDs are 92 // The next available page ID to use. This ensures that the page IDs are
93 // globally unique in the renderer. 93 // globally unique in the renderer.
94 static int32 next_page_id_ = 1; 94 static int32 next_page_id_ = 1;
95 95
96 // The maximum number of popups that can be spawned from one page.
97 static const int kMaximumNumberOfUnacknowledgedPopups = 25;
98
96 static const char* const kUnreachableWebDataURL = 99 static const char* const kUnreachableWebDataURL =
97 "chrome-resource://chromewebdata/"; 100 "chrome-resource://chromewebdata/";
98 101
99 namespace { 102 namespace {
100 103
101 // Associated with browser-initiated navigations to hold tracking data. 104 // Associated with browser-initiated navigations to hold tracking data.
102 class RenderViewExtraRequestData : public WebRequest::ExtraData { 105 class RenderViewExtraRequestData : public WebRequest::ExtraData {
103 public: 106 public:
104 RenderViewExtraRequestData(int32 pending_page_id, 107 RenderViewExtraRequestData(int32 pending_page_id,
105 PageTransition::Type transition, 108 PageTransition::Type transition,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 opened_by_user_gesture_(true), 146 opened_by_user_gesture_(true),
144 enable_dom_automation_(false), 147 enable_dom_automation_(false),
145 enable_dom_ui_bindings_(false), 148 enable_dom_ui_bindings_(false),
146 target_url_status_(TARGET_NONE), 149 target_url_status_(TARGET_NONE),
147 printed_document_width_(0), 150 printed_document_width_(0),
148 first_default_plugin_(NULL), 151 first_default_plugin_(NULL),
149 navigation_gesture_(NavigationGestureUnknown), 152 navigation_gesture_(NavigationGestureUnknown),
150 history_back_list_count_(0), 153 history_back_list_count_(0),
151 history_forward_list_count_(0), 154 history_forward_list_count_(0),
152 disable_popup_blocking_(false), 155 disable_popup_blocking_(false),
153 has_unload_listener_(false) { 156 has_unload_listener_(false),
157 decrement_shared_popup_at_destruction_(false) {
154 resource_dispatcher_ = new ResourceDispatcher(this); 158 resource_dispatcher_ = new ResourceDispatcher(this);
155 #ifdef CHROME_PERSONALIZATION 159 #ifdef CHROME_PERSONALIZATION
156 personalization_ = Personalization::CreateRendererPersonalization(); 160 personalization_ = Personalization::CreateRendererPersonalization();
157 #endif 161 #endif
158 } 162 }
159 163
160 RenderView::~RenderView() { 164 RenderView::~RenderView() {
165 if (decrement_shared_popup_at_destruction_)
166 shared_popup_counter_->data--;
167
161 resource_dispatcher_->ClearMessageSender(); 168 resource_dispatcher_->ClearMessageSender();
162 // Clear any back-pointers that might still be held by plugins. 169 // Clear any back-pointers that might still be held by plugins.
163 PluginDelegateList::iterator it = plugin_delegates_.begin(); 170 PluginDelegateList::iterator it = plugin_delegates_.begin();
164 while (it != plugin_delegates_.end()) { 171 while (it != plugin_delegates_.end()) {
165 (*it)->DropRenderView(); 172 (*it)->DropRenderView();
166 it = plugin_delegates_.erase(it); 173 it = plugin_delegates_.erase(it);
167 } 174 }
168 175
169 RenderThread::current()->RemoveFilter(debug_message_handler_); 176 RenderThread::current()->RemoveFilter(debug_message_handler_);
170 177
171 #ifdef CHROME_PERSONALIZATION 178 #ifdef CHROME_PERSONALIZATION
172 Personalization::CleanupRendererPersonalization(personalization_); 179 Personalization::CleanupRendererPersonalization(personalization_);
173 personalization_ = NULL; 180 personalization_ = NULL;
174 #endif 181 #endif
175 } 182 }
176 183
177 /*static*/ 184 /*static*/
178 RenderView* RenderView::Create(HWND parent_hwnd, 185 RenderView* RenderView::Create(
179 HANDLE modal_dialog_event, 186 HWND parent_hwnd,
180 int32 opener_id, 187 HANDLE modal_dialog_event,
181 const WebPreferences& webkit_prefs, 188 int32 opener_id,
182 int32 routing_id) { 189 const WebPreferences& webkit_prefs,
190 SharedRenderViewCounter* counter,
191 int32 routing_id) {
183 DCHECK(routing_id != MSG_ROUTING_NONE); 192 DCHECK(routing_id != MSG_ROUTING_NONE);
184 scoped_refptr<RenderView> view = new RenderView(); 193 scoped_refptr<RenderView> view = new RenderView();
185 view->Init(parent_hwnd, 194 view->Init(parent_hwnd,
186 modal_dialog_event, 195 modal_dialog_event,
187 opener_id, 196 opener_id,
188 webkit_prefs, 197 webkit_prefs,
198 counter,
189 routing_id); // adds reference 199 routing_id); // adds reference
190 return view; 200 return view;
191 } 201 }
192 202
193 /*static*/ 203 /*static*/
194 void RenderView::SetNextPageID(int32 next_page_id) { 204 void RenderView::SetNextPageID(int32 next_page_id) {
195 // This method should only be called during process startup, and the given 205 // This method should only be called during process startup, and the given
196 // page id had better not exceed our current next page id! 206 // page id had better not exceed our current next page id!
197 DCHECK(next_page_id_ == 1); 207 DCHECK(next_page_id_ == 1);
198 DCHECK(next_page_id >= next_page_id_); 208 DCHECK(next_page_id >= next_page_id_);
(...skipping 19 matching lines...) Expand all
218 228
219 229
220 void RenderView::JSOutOfMemory() { 230 void RenderView::JSOutOfMemory() {
221 Send(new ViewHostMsg_JSOutOfMemory(routing_id_)); 231 Send(new ViewHostMsg_JSOutOfMemory(routing_id_));
222 } 232 }
223 233
224 void RenderView::Init(HWND parent_hwnd, 234 void RenderView::Init(HWND parent_hwnd,
225 HANDLE modal_dialog_event, 235 HANDLE modal_dialog_event,
226 int32 opener_id, 236 int32 opener_id,
227 const WebPreferences& webkit_prefs, 237 const WebPreferences& webkit_prefs,
238 SharedRenderViewCounter* counter,
228 int32 routing_id) { 239 int32 routing_id) {
229 DCHECK(!webview()); 240 DCHECK(!webview());
230 241
231 if (opener_id != MSG_ROUTING_NONE) 242 if (opener_id != MSG_ROUTING_NONE)
232 opener_id_ = opener_id; 243 opener_id_ = opener_id;
233 244
245 if (counter) {
246 shared_popup_counter_ = counter;
247 shared_popup_counter_->data++;
248 decrement_shared_popup_at_destruction_ = true;
249 } else {
250 shared_popup_counter_ = new SharedRenderViewCounter(0);
251 decrement_shared_popup_at_destruction_ = false;
252 }
253
234 // Avoid a leak here by not assigning, since WebView::Create addrefs for us. 254 // Avoid a leak here by not assigning, since WebView::Create addrefs for us.
235 WebWidget* view = WebView::Create(this, webkit_prefs); 255 WebWidget* view = WebView::Create(this, webkit_prefs);
236 webwidget_.swap(&view); 256 webwidget_.swap(&view);
237 257
238 // Don't let WebCore keep a B/F list - we have our own. 258 // Don't let WebCore keep a B/F list - we have our own.
239 // We let it keep 1 entry because FrameLoader::goToItem expects an item in the 259 // We let it keep 1 entry because FrameLoader::goToItem expects an item in the
240 // backForwardList, which is used only in ASSERTs. 260 // backForwardList, which is used only in ASSERTs.
241 webview()->SetBackForwardListSize(1); 261 webview()->SetBackForwardListSize(1);
242 262
243 routing_id_ = routing_id; 263 routing_id_ = routing_id;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 IPC_MESSAGE_HANDLER(ViewMsg_ClearAccessibilityInfo, 353 IPC_MESSAGE_HANDLER(ViewMsg_ClearAccessibilityInfo,
334 OnClearAccessibilityInfo) 354 OnClearAccessibilityInfo)
335 IPC_MESSAGE_HANDLER(ViewMsg_ShouldClose, OnMsgShouldClose) 355 IPC_MESSAGE_HANDLER(ViewMsg_ShouldClose, OnMsgShouldClose)
336 IPC_MESSAGE_HANDLER(ViewMsg_ClosePage, OnClosePage) 356 IPC_MESSAGE_HANDLER(ViewMsg_ClosePage, OnClosePage)
337 IPC_MESSAGE_HANDLER(ViewMsg_ThemeChanged, OnThemeChanged) 357 IPC_MESSAGE_HANDLER(ViewMsg_ThemeChanged, OnThemeChanged)
338 #ifdef CHROME_PERSONALIZATION 358 #ifdef CHROME_PERSONALIZATION
339 IPC_MESSAGE_HANDLER(ViewMsg_PersonalizationEvent, OnPersonalizationEvent) 359 IPC_MESSAGE_HANDLER(ViewMsg_PersonalizationEvent, OnPersonalizationEvent)
340 #endif 360 #endif
341 IPC_MESSAGE_HANDLER(ViewMsg_HandleMessageFromExternalHost, 361 IPC_MESSAGE_HANDLER(ViewMsg_HandleMessageFromExternalHost,
342 OnMessageFromExternalHost) 362 OnMessageFromExternalHost)
363 IPC_MESSAGE_HANDLER(ViewMsg_DisassociateFromPopupCount,
364 OnDisassociateFromPopupCount)
343 // Have the super handle all other messages. 365 // Have the super handle all other messages.
344 IPC_MESSAGE_UNHANDLED(RenderWidget::OnMessageReceived(message)) 366 IPC_MESSAGE_UNHANDLED(RenderWidget::OnMessageReceived(message))
345 IPC_END_MESSAGE_MAP() 367 IPC_END_MESSAGE_MAP()
346 } 368 }
347 369
348 // Got a response from the browser after the renderer decided to create a new 370 // Got a response from the browser after the renderer decided to create a new
349 // view. 371 // view.
350 void RenderView::OnCreatingNewAck(HWND parent) { 372 void RenderView::OnCreatingNewAck(HWND parent) {
351 CompleteInit(parent); 373 CompleteInit(parent);
352 } 374 }
(...skipping 1286 matching lines...) Expand 10 before | Expand all | Expand 10 after
1639 void RenderView::AddSearchProvider(const std::string& url) { 1661 void RenderView::AddSearchProvider(const std::string& url) {
1640 AddGURLSearchProvider(GURL(url), 1662 AddGURLSearchProvider(GURL(url),
1641 false); // not autodetected 1663 false); // not autodetected
1642 } 1664 }
1643 1665
1644 void RenderView::DebuggerOutput(const std::wstring& out) { 1666 void RenderView::DebuggerOutput(const std::wstring& out) {
1645 Send(new ViewHostMsg_DebuggerOutput(routing_id_, out)); 1667 Send(new ViewHostMsg_DebuggerOutput(routing_id_, out));
1646 } 1668 }
1647 1669
1648 WebView* RenderView::CreateWebView(WebView* webview, bool user_gesture) { 1670 WebView* RenderView::CreateWebView(WebView* webview, bool user_gesture) {
1671 // Check to make sure we aren't overloading on popups.
1672 if (shared_popup_counter_->data > kMaximumNumberOfUnacknowledgedPopups)
1673 return NULL;
1674
1649 int32 routing_id = MSG_ROUTING_NONE; 1675 int32 routing_id = MSG_ROUTING_NONE;
1650 HANDLE modal_dialog_event = NULL; 1676 HANDLE modal_dialog_event = NULL;
1651 bool result = RenderThread::current()->Send( 1677 bool result = RenderThread::current()->Send(
1652 new ViewHostMsg_CreateView(routing_id_, user_gesture, &routing_id, 1678 new ViewHostMsg_CreateView(routing_id_, user_gesture, &routing_id,
1653 &modal_dialog_event)); 1679 &modal_dialog_event));
1654 if (routing_id == MSG_ROUTING_NONE) { 1680 if (routing_id == MSG_ROUTING_NONE) {
1655 DCHECK(modal_dialog_event == NULL); 1681 DCHECK(modal_dialog_event == NULL);
1656 return NULL; 1682 return NULL;
1657 } 1683 }
1658 1684
1659 // The WebView holds a reference to this new RenderView 1685 // The WebView holds a reference to this new RenderView
1660 const WebPreferences& prefs = webview->GetPreferences(); 1686 const WebPreferences& prefs = webview->GetPreferences();
1661 RenderView* view = RenderView::Create(NULL, modal_dialog_event, routing_id_, 1687 RenderView* view = RenderView::Create(NULL, modal_dialog_event, routing_id_,
1662 prefs, routing_id); 1688 prefs, shared_popup_counter_,
1689 routing_id);
1663 view->set_opened_by_user_gesture(user_gesture); 1690 view->set_opened_by_user_gesture(user_gesture);
1664 1691
1665 // Copy over the alternate error page URL so we can have alt error pages in 1692 // Copy over the alternate error page URL so we can have alt error pages in
1666 // the new render view (we don't need the browser to send the URL back down). 1693 // the new render view (we don't need the browser to send the URL back down).
1667 view->alternate_error_page_url_ = alternate_error_page_url_; 1694 view->alternate_error_page_url_ = alternate_error_page_url_;
1668 1695
1669 return view->webview(); 1696 return view->webview();
1670 } 1697 }
1671 1698
1672 WebWidget* RenderView::CreatePopupWidget(WebView* webview) { 1699 WebWidget* RenderView::CreatePopupWidget(WebView* webview) {
(...skipping 876 matching lines...) Expand 10 before | Expand all | Expand 10 after
2549 script += "'"; 2576 script += "'";
2550 script += ");void(0);"; 2577 script += ");void(0);";
2551 2578
2552 GURL script_url(script); 2579 GURL script_url(script);
2553 scoped_ptr<WebRequest> request(WebRequest::Create(script_url)); 2580 scoped_ptr<WebRequest> request(WebRequest::Create(script_url));
2554 // TODO(iyengar) 2581 // TODO(iyengar)
2555 // Need a mechanism to send results back. 2582 // Need a mechanism to send results back.
2556 main_frame->LoadRequest(request.get()); 2583 main_frame->LoadRequest(request.get());
2557 } 2584 }
2558 2585
2586 void RenderView::OnDisassociateFromPopupCount() {
2587 if (decrement_shared_popup_at_destruction_)
2588 shared_popup_counter_->data--;
2589 shared_popup_counter_ = new SharedRenderViewCounter(0);
2590 decrement_shared_popup_at_destruction_ = false;
2591 }
2592
2559 std::string RenderView::GetAltHTMLForTemplate( 2593 std::string RenderView::GetAltHTMLForTemplate(
2560 const DictionaryValue& error_strings, int template_resource_id) const { 2594 const DictionaryValue& error_strings, int template_resource_id) const {
2561 const StringPiece template_html( 2595 const StringPiece template_html(
2562 ResourceBundle::GetSharedInstance().GetRawDataResource( 2596 ResourceBundle::GetSharedInstance().GetRawDataResource(
2563 template_resource_id)); 2597 template_resource_id));
2564 2598
2565 if (template_html.empty()) { 2599 if (template_html.empty()) {
2566 NOTREACHED() << "unable to load template. ID: " << template_resource_id; 2600 NOTREACHED() << "unable to load template. ID: " << template_resource_id;
2567 return ""; 2601 return "";
2568 } 2602 }
2569 // "t" is the id of the templates root node. 2603 // "t" is the id of the templates root node.
2570 return jstemplate_builder::GetTemplateHtml( 2604 return jstemplate_builder::GetTemplateHtml(
2571 template_html, &error_strings, "t"); 2605 template_html, &error_strings, "t");
2572 } 2606 }
2573
OLDNEW
« no previous file with comments | « chrome/renderer/render_view.h ('k') | chrome/test/data/constrained_files/infinite_popups.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698