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

Side by Side Diff: content/public/test/web_contents_observer_sanity_checker.cc

Issue 921443003: Fix RenderFrameCreated and RenderFrameDeleted WebContentsObserver methods (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix FrameDeleted consistency checker. Created 5 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/public/test/web_contents_observer_sanity_checker.h" 5 #include "content/public/test/web_contents_observer_sanity_checker.h"
6 6
7 #include "base/debug/stack_trace.h"
7 #include "base/strings/stringprintf.h" 8 #include "base/strings/stringprintf.h"
9 #include "content/common/frame_messages.h"
8 #include "content/public/browser/render_frame_host.h" 10 #include "content/public/browser/render_frame_host.h"
9 #include "content/public/browser/render_process_host.h" 11 #include "content/public/browser/render_process_host.h"
10 #include "content/public/browser/site_instance.h" 12 #include "content/public/browser/site_instance.h"
11 #include "content/public/browser/web_contents.h" 13 #include "content/public/browser/web_contents.h"
12 #include "content/public/browser/web_contents_observer.h" 14 #include "content/public/browser/web_contents_observer.h"
13 15
14 namespace content { 16 namespace content {
15 17
16 namespace { 18 namespace {
17 19
(...skipping 10 matching lines...) Expand all
28 new WebContentsObserverSanityChecker(web_contents)); 30 new WebContentsObserverSanityChecker(web_contents));
29 } 31 }
30 32
31 void WebContentsObserverSanityChecker::RenderFrameCreated( 33 void WebContentsObserverSanityChecker::RenderFrameCreated(
32 RenderFrameHost* render_frame_host) { 34 RenderFrameHost* render_frame_host) {
33 CHECK(!web_contents_destroyed_); 35 CHECK(!web_contents_destroyed_);
34 std::pair<int, int> routing_pair = 36 std::pair<int, int> routing_pair =
35 std::make_pair(render_frame_host->GetProcess()->GetID(), 37 std::make_pair(render_frame_host->GetProcess()->GetID(),
36 render_frame_host->GetRoutingID()); 38 render_frame_host->GetRoutingID());
37 bool frame_exists = !live_routes_.insert(routing_pair).second; 39 bool frame_exists = !live_routes_.insert(routing_pair).second;
38 bool dead_already = deleted_routes_.count(routing_pair) != 0; 40 deleted_routes_.erase(routing_pair);
39 41
40 if (frame_exists) { 42 if (frame_exists) {
41 // TODO(nick): Disabled because of http://crbug.com/425397
42 #if 0
43 CHECK(false) << "RenderFrameCreated called more than once for routing pair:" 43 CHECK(false) << "RenderFrameCreated called more than once for routing pair:"
44 << Format(render_frame_host); 44 << Format(render_frame_host);
45 #endif
46 } else if (dead_already) {
47 CHECK(false) << "RenderFrameCreated called for routing pair that was "
48 << "previously deleted: " << Format(render_frame_host);
49 } 45 }
50 } 46 }
51 47
52 void WebContentsObserverSanityChecker::RenderFrameDeleted( 48 void WebContentsObserverSanityChecker::RenderFrameDeleted(
53 RenderFrameHost* render_frame_host) { 49 RenderFrameHost* render_frame_host) {
54 CHECK(!web_contents_destroyed_); 50 CHECK(!web_contents_destroyed_);
55 std::pair<int, int> routing_pair = 51 std::pair<int, int> routing_pair =
56 std::make_pair(render_frame_host->GetProcess()->GetID(), 52 std::make_pair(render_frame_host->GetProcess()->GetID(),
57 render_frame_host->GetRoutingID()); 53 render_frame_host->GetRoutingID());
58 bool was_live = !!live_routes_.erase(routing_pair); 54 bool was_live = !!live_routes_.erase(routing_pair);
(...skipping 16 matching lines...) Expand all
75 71
76 void WebContentsObserverSanityChecker::RenderFrameForInterstitialPageCreated( 72 void WebContentsObserverSanityChecker::RenderFrameForInterstitialPageCreated(
77 RenderFrameHost* render_frame_host) { 73 RenderFrameHost* render_frame_host) {
78 // TODO(nick): Record this. 74 // TODO(nick): Record this.
79 } 75 }
80 76
81 void WebContentsObserverSanityChecker::RenderFrameHostChanged( 77 void WebContentsObserverSanityChecker::RenderFrameHostChanged(
82 RenderFrameHost* old_host, 78 RenderFrameHost* old_host,
83 RenderFrameHost* new_host) { 79 RenderFrameHost* new_host) {
84 CHECK(new_host); 80 CHECK(new_host);
85 if (old_host) 81 CHECK_NE(new_host, old_host);
86 AssertFrameExists(old_host); 82
87 AssertFrameExists(new_host); 83 // TODO(nasko): Implement consistency checking for RenderFrameHostChanged
84 // in follow up CL.
88 } 85 }
89 86
90 void WebContentsObserverSanityChecker::FrameDeleted( 87 void WebContentsObserverSanityChecker::FrameDeleted(
91 RenderFrameHost* render_frame_host) { 88 RenderFrameHost* render_frame_host) {
92 AssertFrameExists(render_frame_host); 89 CHECK(!web_contents_destroyed_);
90 std::pair<int, int> routing_pair =
91 std::make_pair(render_frame_host->GetProcess()->GetID(),
92 render_frame_host->GetRoutingID());
93 bool render_frame_deleted_happened = deleted_routes_.count(routing_pair) != 0;
94
95 // A RenderFrame should either exist or have been deleted.
Charlie Reis 2015/02/13 17:15:19 I think there's room for improvement here, but we
96 if (!render_frame_deleted_happened)
97 AssertRenderFrameExists(render_frame_host);
93 } 98 }
94 99
95 void WebContentsObserverSanityChecker::DidStartProvisionalLoadForFrame( 100 void WebContentsObserverSanityChecker::DidStartProvisionalLoadForFrame(
96 RenderFrameHost* render_frame_host, 101 RenderFrameHost* render_frame_host,
97 const GURL& validated_url, 102 const GURL& validated_url,
98 bool is_error_page, 103 bool is_error_page,
99 bool is_iframe_srcdoc) { 104 bool is_iframe_srcdoc) {
100 AssertFrameExists(render_frame_host); 105 AssertRenderFrameExists(render_frame_host);
101 } 106 }
102 107
103 void WebContentsObserverSanityChecker::DidCommitProvisionalLoadForFrame( 108 void WebContentsObserverSanityChecker::DidCommitProvisionalLoadForFrame(
104 RenderFrameHost* render_frame_host, 109 RenderFrameHost* render_frame_host,
105 const GURL& url, 110 const GURL& url,
106 ui::PageTransition transition_type) { 111 ui::PageTransition transition_type) {
107 AssertFrameExists(render_frame_host); 112 AssertRenderFrameExists(render_frame_host);
108 } 113 }
109 114
110 void WebContentsObserverSanityChecker::DidFailProvisionalLoad( 115 void WebContentsObserverSanityChecker::DidFailProvisionalLoad(
111 RenderFrameHost* render_frame_host, 116 RenderFrameHost* render_frame_host,
112 const GURL& validated_url, 117 const GURL& validated_url,
113 int error_code, 118 int error_code,
114 const base::string16& error_description) { 119 const base::string16& error_description) {
115 AssertFrameExists(render_frame_host); 120 AssertRenderFrameExists(render_frame_host);
116 } 121 }
117 122
118 void WebContentsObserverSanityChecker::DidNavigateMainFrame( 123 void WebContentsObserverSanityChecker::DidNavigateMainFrame(
119 const LoadCommittedDetails& details, 124 const LoadCommittedDetails& details,
120 const FrameNavigateParams& params) { 125 const FrameNavigateParams& params) {
121 AssertMainFrameExists(); 126 AssertMainFrameExists();
122 } 127 }
123 128
124 void WebContentsObserverSanityChecker::DidNavigateAnyFrame( 129 void WebContentsObserverSanityChecker::DidNavigateAnyFrame(
125 RenderFrameHost* render_frame_host, 130 RenderFrameHost* render_frame_host,
126 const LoadCommittedDetails& details, 131 const LoadCommittedDetails& details,
127 const FrameNavigateParams& params) { 132 const FrameNavigateParams& params) {
128 AssertFrameExists(render_frame_host); 133 AssertRenderFrameExists(render_frame_host);
129 } 134 }
130 135
131 void WebContentsObserverSanityChecker::DocumentAvailableInMainFrame() { 136 void WebContentsObserverSanityChecker::DocumentAvailableInMainFrame() {
132 AssertMainFrameExists(); 137 AssertMainFrameExists();
133 } 138 }
134 139
135 void WebContentsObserverSanityChecker::DocumentOnLoadCompletedInMainFrame() { 140 void WebContentsObserverSanityChecker::DocumentOnLoadCompletedInMainFrame() {
136 AssertMainFrameExists(); 141 AssertMainFrameExists();
137 } 142 }
138 143
139 void WebContentsObserverSanityChecker::DocumentLoadedInFrame( 144 void WebContentsObserverSanityChecker::DocumentLoadedInFrame(
140 RenderFrameHost* render_frame_host) { 145 RenderFrameHost* render_frame_host) {
141 AssertFrameExists(render_frame_host); 146 AssertRenderFrameExists(render_frame_host);
142 } 147 }
143 148
144 void WebContentsObserverSanityChecker::DidFinishLoad( 149 void WebContentsObserverSanityChecker::DidFinishLoad(
145 RenderFrameHost* render_frame_host, 150 RenderFrameHost* render_frame_host,
146 const GURL& validated_url) { 151 const GURL& validated_url) {
147 AssertFrameExists(render_frame_host); 152 AssertRenderFrameExists(render_frame_host);
148 } 153 }
149 154
150 void WebContentsObserverSanityChecker::DidFailLoad( 155 void WebContentsObserverSanityChecker::DidFailLoad(
151 RenderFrameHost* render_frame_host, 156 RenderFrameHost* render_frame_host,
152 const GURL& validated_url, 157 const GURL& validated_url,
153 int error_code, 158 int error_code,
154 const base::string16& error_description) { 159 const base::string16& error_description) {
155 AssertFrameExists(render_frame_host); 160 AssertRenderFrameExists(render_frame_host);
156 } 161 }
157 162
158 void WebContentsObserverSanityChecker::DidGetRedirectForResourceRequest( 163 void WebContentsObserverSanityChecker::DidGetRedirectForResourceRequest(
159 RenderFrameHost* render_frame_host, 164 RenderFrameHost* render_frame_host,
160 const ResourceRedirectDetails& details) { 165 const ResourceRedirectDetails& details) {
161 AssertFrameExists(render_frame_host); 166 AssertRenderFrameExists(render_frame_host);
162 } 167 }
163 168
164 void WebContentsObserverSanityChecker::DidOpenRequestedURL( 169 void WebContentsObserverSanityChecker::DidOpenRequestedURL(
165 WebContents* new_contents, 170 WebContents* new_contents,
166 RenderFrameHost* source_render_frame_host, 171 RenderFrameHost* source_render_frame_host,
167 const GURL& url, 172 const GURL& url,
168 const Referrer& referrer, 173 const Referrer& referrer,
169 WindowOpenDisposition disposition, 174 WindowOpenDisposition disposition,
170 ui::PageTransition transition) { 175 ui::PageTransition transition) {
171 AssertFrameExists(source_render_frame_host); 176 AssertRenderFrameExists(source_render_frame_host);
172 } 177 }
173 178
174 bool WebContentsObserverSanityChecker::OnMessageReceived( 179 bool WebContentsObserverSanityChecker::OnMessageReceived(
175 const IPC::Message& message, 180 const IPC::Message& message,
176 RenderFrameHost* render_frame_host) { 181 RenderFrameHost* render_frame_host) {
182 // TODO(nasko): FrameHostMsg_RenderProcessGone is delivered to
183 // WebContentsObserver since RenderFrameHost allows the delegate to handle
184 // the message first. This shouldn't happen, but for now handle it here.
185 // https://crbug.com/450799
186 if (message.type() == FrameHostMsg_RenderProcessGone::ID)
187 return false;
188
177 #if !defined(OS_MACOSX) 189 #if !defined(OS_MACOSX)
178 // TODO(avi): Disabled because of http://crbug.com/445054 190 // TODO(avi): Disabled because of http://crbug.com/445054
179 AssertFrameExists(render_frame_host); 191 AssertRenderFrameExists(render_frame_host);
180 #endif 192 #endif
181 return false; 193 return false;
182 } 194 }
183 195
184 void WebContentsObserverSanityChecker::WebContentsDestroyed() { 196 void WebContentsObserverSanityChecker::WebContentsDestroyed() {
185 CHECK(!web_contents_destroyed_); 197 CHECK(!web_contents_destroyed_);
186 web_contents_destroyed_ = true; 198 web_contents_destroyed_ = true;
187 } 199 }
188 200
189 WebContentsObserverSanityChecker::WebContentsObserverSanityChecker( 201 WebContentsObserverSanityChecker::WebContentsObserverSanityChecker(
190 WebContents* web_contents) 202 WebContents* web_contents)
191 : WebContentsObserver(web_contents), web_contents_destroyed_(false) { 203 : WebContentsObserver(web_contents), web_contents_destroyed_(false) {
192 // Prime the pump with the initial objects. 204 // Prime the pump with the initial objects.
205 // TODO(nasko): Investigate why this is needed.
193 RenderViewCreated(web_contents->GetRenderViewHost()); 206 RenderViewCreated(web_contents->GetRenderViewHost());
194 RenderFrameCreated(web_contents->GetMainFrame());
195 } 207 }
196 208
197 WebContentsObserverSanityChecker::~WebContentsObserverSanityChecker() { 209 WebContentsObserverSanityChecker::~WebContentsObserverSanityChecker() {
198 CHECK(web_contents_destroyed_); 210 CHECK(web_contents_destroyed_);
199 } 211 }
200 212
201 void WebContentsObserverSanityChecker::AssertFrameExists( 213 void WebContentsObserverSanityChecker::AssertRenderFrameExists(
202 RenderFrameHost* render_frame_host) { 214 RenderFrameHost* render_frame_host) {
203 CHECK(!web_contents_destroyed_); 215 CHECK(!web_contents_destroyed_);
204 std::pair<int, int> routing_pair = 216 std::pair<int, int> routing_pair =
205 std::make_pair(render_frame_host->GetProcess()->GetID(), 217 std::make_pair(render_frame_host->GetProcess()->GetID(),
206 render_frame_host->GetRoutingID()); 218 render_frame_host->GetRoutingID());
219
207 bool render_frame_created_happened = live_routes_.count(routing_pair) != 0; 220 bool render_frame_created_happened = live_routes_.count(routing_pair) != 0;
208 bool render_frame_deleted_happened = deleted_routes_.count(routing_pair) != 0; 221 bool render_frame_deleted_happened = deleted_routes_.count(routing_pair) != 0;
209 222
210 CHECK(render_frame_created_happened) 223 CHECK(render_frame_created_happened)
211 << "A RenderFrameHost pointer was passed to a WebContentsObserver " 224 << "A RenderFrameHost pointer was passed to a WebContentsObserver "
212 << "method, but WebContentsObserver::RenderFrameCreated was never called " 225 << "method, but WebContentsObserver::RenderFrameCreated was never called "
213 << "for that RenderFrameHost: " << Format(render_frame_host); 226 << "for that RenderFrameHost: " << Format(render_frame_host);
214 CHECK(!render_frame_deleted_happened) 227 CHECK(!render_frame_deleted_happened)
215 << "A RenderFrameHost pointer was passed to a WebContentsObserver " 228 << "A RenderFrameHost pointer was passed to a WebContentsObserver "
216 << "method, but WebContentsObserver::RenderFrameDeleted had already been " 229 << "method, but WebContentsObserver::RenderFrameDeleted had already been "
217 << "called on that frame:" << Format(render_frame_host); 230 << "called on that frame:" << Format(render_frame_host);
218 } 231 }
219 232
220 void WebContentsObserverSanityChecker::AssertMainFrameExists() { 233 void WebContentsObserverSanityChecker::AssertMainFrameExists() {
221 AssertFrameExists(web_contents()->GetMainFrame()); 234 AssertRenderFrameExists(web_contents()->GetMainFrame());
222 } 235 }
223 236
224 std::string WebContentsObserverSanityChecker::Format( 237 std::string WebContentsObserverSanityChecker::Format(
225 RenderFrameHost* render_frame_host) { 238 RenderFrameHost* render_frame_host) {
226 return base::StringPrintf( 239 return base::StringPrintf(
227 "(%d, %d -> %s )", render_frame_host->GetProcess()->GetID(), 240 "(%d, %d -> %s)", render_frame_host->GetProcess()->GetID(),
228 render_frame_host->GetRoutingID(), 241 render_frame_host->GetRoutingID(),
229 render_frame_host->GetSiteInstance()->GetSiteURL().spec().c_str()); 242 render_frame_host->GetSiteInstance()->GetSiteURL().spec().c_str());
230 } 243 }
231 244
232 } // namespace content 245 } // namespace content
OLDNEW
« no previous file with comments | « content/public/test/web_contents_observer_sanity_checker.h ('k') | content/test/test_render_frame_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698