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

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: Fixes. 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 AssertRenderFrameExists(render_frame_host);
93 } 90 }
94 91
95 void WebContentsObserverSanityChecker::DidStartProvisionalLoadForFrame( 92 void WebContentsObserverSanityChecker::DidStartProvisionalLoadForFrame(
96 RenderFrameHost* render_frame_host, 93 RenderFrameHost* render_frame_host,
97 const GURL& validated_url, 94 const GURL& validated_url,
98 bool is_error_page, 95 bool is_error_page,
99 bool is_iframe_srcdoc) { 96 bool is_iframe_srcdoc) {
100 AssertFrameExists(render_frame_host); 97 AssertRenderFrameExists(render_frame_host);
101 } 98 }
102 99
103 void WebContentsObserverSanityChecker::DidCommitProvisionalLoadForFrame( 100 void WebContentsObserverSanityChecker::DidCommitProvisionalLoadForFrame(
104 RenderFrameHost* render_frame_host, 101 RenderFrameHost* render_frame_host,
105 const GURL& url, 102 const GURL& url,
106 ui::PageTransition transition_type) { 103 ui::PageTransition transition_type) {
107 AssertFrameExists(render_frame_host); 104 AssertRenderFrameExists(render_frame_host);
108 } 105 }
109 106
110 void WebContentsObserverSanityChecker::DidFailProvisionalLoad( 107 void WebContentsObserverSanityChecker::DidFailProvisionalLoad(
111 RenderFrameHost* render_frame_host, 108 RenderFrameHost* render_frame_host,
112 const GURL& validated_url, 109 const GURL& validated_url,
113 int error_code, 110 int error_code,
114 const base::string16& error_description) { 111 const base::string16& error_description) {
115 AssertFrameExists(render_frame_host); 112 AssertRenderFrameExists(render_frame_host);
116 } 113 }
117 114
118 void WebContentsObserverSanityChecker::DidNavigateMainFrame( 115 void WebContentsObserverSanityChecker::DidNavigateMainFrame(
119 const LoadCommittedDetails& details, 116 const LoadCommittedDetails& details,
120 const FrameNavigateParams& params) { 117 const FrameNavigateParams& params) {
121 AssertMainFrameExists(); 118 AssertMainFrameExists();
122 } 119 }
123 120
124 void WebContentsObserverSanityChecker::DidNavigateAnyFrame( 121 void WebContentsObserverSanityChecker::DidNavigateAnyFrame(
125 RenderFrameHost* render_frame_host, 122 RenderFrameHost* render_frame_host,
126 const LoadCommittedDetails& details, 123 const LoadCommittedDetails& details,
127 const FrameNavigateParams& params) { 124 const FrameNavigateParams& params) {
128 AssertFrameExists(render_frame_host); 125 AssertRenderFrameExists(render_frame_host);
129 } 126 }
130 127
131 void WebContentsObserverSanityChecker::DocumentAvailableInMainFrame() { 128 void WebContentsObserverSanityChecker::DocumentAvailableInMainFrame() {
132 AssertMainFrameExists(); 129 AssertMainFrameExists();
133 } 130 }
134 131
135 void WebContentsObserverSanityChecker::DocumentOnLoadCompletedInMainFrame() { 132 void WebContentsObserverSanityChecker::DocumentOnLoadCompletedInMainFrame() {
136 AssertMainFrameExists(); 133 AssertMainFrameExists();
137 } 134 }
138 135
139 void WebContentsObserverSanityChecker::DocumentLoadedInFrame( 136 void WebContentsObserverSanityChecker::DocumentLoadedInFrame(
140 RenderFrameHost* render_frame_host) { 137 RenderFrameHost* render_frame_host) {
141 AssertFrameExists(render_frame_host); 138 AssertRenderFrameExists(render_frame_host);
142 } 139 }
143 140
144 void WebContentsObserverSanityChecker::DidFinishLoad( 141 void WebContentsObserverSanityChecker::DidFinishLoad(
145 RenderFrameHost* render_frame_host, 142 RenderFrameHost* render_frame_host,
146 const GURL& validated_url) { 143 const GURL& validated_url) {
147 AssertFrameExists(render_frame_host); 144 AssertRenderFrameExists(render_frame_host);
148 } 145 }
149 146
150 void WebContentsObserverSanityChecker::DidFailLoad( 147 void WebContentsObserverSanityChecker::DidFailLoad(
151 RenderFrameHost* render_frame_host, 148 RenderFrameHost* render_frame_host,
152 const GURL& validated_url, 149 const GURL& validated_url,
153 int error_code, 150 int error_code,
154 const base::string16& error_description) { 151 const base::string16& error_description) {
155 AssertFrameExists(render_frame_host); 152 AssertRenderFrameExists(render_frame_host);
156 } 153 }
157 154
158 void WebContentsObserverSanityChecker::DidGetRedirectForResourceRequest( 155 void WebContentsObserverSanityChecker::DidGetRedirectForResourceRequest(
159 RenderFrameHost* render_frame_host, 156 RenderFrameHost* render_frame_host,
160 const ResourceRedirectDetails& details) { 157 const ResourceRedirectDetails& details) {
161 AssertFrameExists(render_frame_host); 158 AssertRenderFrameExists(render_frame_host);
162 } 159 }
163 160
164 void WebContentsObserverSanityChecker::DidOpenRequestedURL( 161 void WebContentsObserverSanityChecker::DidOpenRequestedURL(
165 WebContents* new_contents, 162 WebContents* new_contents,
166 RenderFrameHost* source_render_frame_host, 163 RenderFrameHost* source_render_frame_host,
167 const GURL& url, 164 const GURL& url,
168 const Referrer& referrer, 165 const Referrer& referrer,
169 WindowOpenDisposition disposition, 166 WindowOpenDisposition disposition,
170 ui::PageTransition transition) { 167 ui::PageTransition transition) {
171 AssertFrameExists(source_render_frame_host); 168 AssertRenderFrameExists(source_render_frame_host);
172 } 169 }
173 170
174 bool WebContentsObserverSanityChecker::OnMessageReceived( 171 bool WebContentsObserverSanityChecker::OnMessageReceived(
175 const IPC::Message& message, 172 const IPC::Message& message,
176 RenderFrameHost* render_frame_host) { 173 RenderFrameHost* render_frame_host) {
174 // TODO(nasko): FrameHostMsg_RenderProcessGone is delivered to
175 // WebContentsObserver since RenderFrameHost allows the delegate to handle
176 // the message first. This shouldn't happen, but for now handle it here.
177 // https://crbug.com/450799
178 if (message.type() == FrameHostMsg_RenderProcessGone::ID)
179 return false;
180
177 #if !defined(OS_MACOSX) 181 #if !defined(OS_MACOSX)
178 // TODO(avi): Disabled because of http://crbug.com/445054 182 // TODO(avi): Disabled because of http://crbug.com/445054
179 AssertFrameExists(render_frame_host); 183 AssertRenderFrameExists(render_frame_host);
180 #endif 184 #endif
181 return false; 185 return false;
182 } 186 }
183 187
184 void WebContentsObserverSanityChecker::WebContentsDestroyed() { 188 void WebContentsObserverSanityChecker::WebContentsDestroyed() {
185 CHECK(!web_contents_destroyed_); 189 CHECK(!web_contents_destroyed_);
186 web_contents_destroyed_ = true; 190 web_contents_destroyed_ = true;
187 } 191 }
188 192
189 WebContentsObserverSanityChecker::WebContentsObserverSanityChecker( 193 WebContentsObserverSanityChecker::WebContentsObserverSanityChecker(
190 WebContents* web_contents) 194 WebContents* web_contents)
191 : WebContentsObserver(web_contents), web_contents_destroyed_(false) { 195 : WebContentsObserver(web_contents), web_contents_destroyed_(false) {
192 // Prime the pump with the initial objects. 196 // Prime the pump with the initial objects.
197 // TODO(nasko): Investigate why this is needed.
193 RenderViewCreated(web_contents->GetRenderViewHost()); 198 RenderViewCreated(web_contents->GetRenderViewHost());
194 RenderFrameCreated(web_contents->GetMainFrame());
195 } 199 }
196 200
197 WebContentsObserverSanityChecker::~WebContentsObserverSanityChecker() { 201 WebContentsObserverSanityChecker::~WebContentsObserverSanityChecker() {
198 CHECK(web_contents_destroyed_); 202 CHECK(web_contents_destroyed_);
199 } 203 }
200 204
201 void WebContentsObserverSanityChecker::AssertFrameExists( 205 void WebContentsObserverSanityChecker::AssertRenderFrameExists(
202 RenderFrameHost* render_frame_host) { 206 RenderFrameHost* render_frame_host) {
203 CHECK(!web_contents_destroyed_); 207 CHECK(!web_contents_destroyed_);
204 std::pair<int, int> routing_pair = 208 std::pair<int, int> routing_pair =
205 std::make_pair(render_frame_host->GetProcess()->GetID(), 209 std::make_pair(render_frame_host->GetProcess()->GetID(),
206 render_frame_host->GetRoutingID()); 210 render_frame_host->GetRoutingID());
211
207 bool render_frame_created_happened = live_routes_.count(routing_pair) != 0; 212 bool render_frame_created_happened = live_routes_.count(routing_pair) != 0;
208 bool render_frame_deleted_happened = deleted_routes_.count(routing_pair) != 0; 213 bool render_frame_deleted_happened = deleted_routes_.count(routing_pair) != 0;
209 214
210 CHECK(render_frame_created_happened) 215 CHECK(render_frame_created_happened)
211 << "A RenderFrameHost pointer was passed to a WebContentsObserver " 216 << "A RenderFrameHost pointer was passed to a WebContentsObserver "
212 << "method, but WebContentsObserver::RenderFrameCreated was never called " 217 << "method, but WebContentsObserver::RenderFrameCreated was never called "
213 << "for that RenderFrameHost: " << Format(render_frame_host); 218 << "for that RenderFrameHost: " << Format(render_frame_host);
214 CHECK(!render_frame_deleted_happened) 219 CHECK(!render_frame_deleted_happened)
215 << "A RenderFrameHost pointer was passed to a WebContentsObserver " 220 << "A RenderFrameHost pointer was passed to a WebContentsObserver "
216 << "method, but WebContentsObserver::RenderFrameDeleted had already been " 221 << "method, but WebContentsObserver::RenderFrameDeleted had already been "
217 << "called on that frame:" << Format(render_frame_host); 222 << "called on that frame:" << Format(render_frame_host);
218 } 223 }
219 224
220 void WebContentsObserverSanityChecker::AssertMainFrameExists() { 225 void WebContentsObserverSanityChecker::AssertMainFrameExists() {
221 AssertFrameExists(web_contents()->GetMainFrame()); 226 AssertRenderFrameExists(web_contents()->GetMainFrame());
222 } 227 }
223 228
224 std::string WebContentsObserverSanityChecker::Format( 229 std::string WebContentsObserverSanityChecker::Format(
225 RenderFrameHost* render_frame_host) { 230 RenderFrameHost* render_frame_host) {
226 return base::StringPrintf( 231 return base::StringPrintf(
227 "(%d, %d -> %s )", render_frame_host->GetProcess()->GetID(), 232 "(%d, %d -> %s)", render_frame_host->GetProcess()->GetID(),
228 render_frame_host->GetRoutingID(), 233 render_frame_host->GetRoutingID(),
229 render_frame_host->GetSiteInstance()->GetSiteURL().spec().c_str()); 234 render_frame_host->GetSiteInstance()->GetSiteURL().spec().c_str());
230 } 235 }
231 236
232 } // namespace content 237 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698