Chromium Code Reviews| Index: chrome/renderer/render_view.cc |
| =================================================================== |
| --- chrome/renderer/render_view.cc (revision 28382) |
| +++ chrome/renderer/render_view.cc (working copy) |
| @@ -179,10 +179,6 @@ |
| // that variable for more. |
| const int kDefaultDelaySecondsForFormStateSync = 5; |
| -// The next available page ID to use. This ensures that the page IDs are |
| -// globally unique in the renderer. |
| -static int32 next_page_id_ = 1; |
| - |
| // The maximum number of popups that can be spawned from one page. |
| static const int kMaximumNumberOfUnacknowledgedPopups = 25; |
| @@ -201,6 +197,8 @@ |
| /////////////////////////////////////////////////////////////////////////////// |
| +int32 RenderView::next_page_id_ = 1; |
| + |
| RenderView::RenderView(RenderThreadBase* render_thread, |
| const WebPreferences& webkit_preferences) |
| : RenderWidget(render_thread, true), |
| @@ -235,11 +233,9 @@ |
| #endif |
| document_tag_(0), |
| webkit_preferences_(webkit_preferences) { |
| - Singleton<RenderViewSet>()->render_view_set_.insert(this); |
| } |
| RenderView::~RenderView() { |
| - Singleton<RenderViewSet>()->render_view_set_.erase(this); |
| if (decrement_shared_popup_at_destruction_) |
| shared_popup_counter_->data--; |
| @@ -261,9 +257,30 @@ |
| render_thread_->RemoveFilter(audio_message_filter_); |
| render_thread_->RemoveFilter(notification_provider_.get()); |
| + |
| +#ifndef NDEBUG |
| + // Make sure we are no longer referenced by the ViewMap. |
| + ViewMap* views = Singleton<ViewMap>::get(); |
| + for (ViewMap::iterator it = views->begin(); it != views->end(); ++it) |
| + DCHECK_NE(this, it->second) << "Failed to call Close?"; |
| +#endif |
| } |
| /*static*/ |
| +void RenderView::ForEach(RenderViewVisitor* visitor) { |
| + ViewMap* views = Singleton<ViewMap>::get(); |
| + for (ViewMap::iterator it = views->begin(); it != views->end(); ++it) |
| + visitor->Visit(it->second); |
|
Matt Perry
2009/10/09 00:25:14
I think you want to break if this returns false?
darin (slow to review)
2009/10/09 03:52:30
Yes, thanks for catching that!
|
| +} |
| + |
| +/*static*/ |
| +RenderView* RenderView::FromWebView(WebView* webview) { |
| + ViewMap* views = Singleton<ViewMap>::get(); |
| + ViewMap::iterator it = views->find(webview); |
| + return it == views->end() ? NULL : it->second; |
| +} |
| + |
| +/*static*/ |
| RenderView* RenderView::Create( |
| RenderThreadBase* render_thread, |
| gfx::NativeViewId parent_hwnd, |
| @@ -324,6 +341,7 @@ |
| notification_provider_ = new NotificationProvider(this); |
| webwidget_ = WebView::Create(this); |
| + Singleton<ViewMap>::get()->insert(std::make_pair(webview(), this)); |
| webkit_preferences_.Apply(webview()); |
| webview()->initializeMainFrame(this); |
| @@ -3616,6 +3634,13 @@ |
| Send(new ViewMsg_ExecuteCodeFinished(routing_id_, request_id, true)); |
| } |
| +void RenderView::Close() { |
| + // We need to grab a pointer to the doomed WebView before we destroy it. |
| + WebView* doomed = webview(); |
| + RenderWidget::Close(); |
| + Singleton<ViewMap>::get()->erase(doomed); |
| +} |
| + |
| void RenderView::DidHandleKeyEvent() { |
| edit_commands_.clear(); |
| } |