OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |