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

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

Issue 803873004: ContentBrowserSanityChecker (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Jiggle the comments. Created 6 years 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "content/public/test/web_contents_observer_sanity_checker.h"
6
7 #include "base/strings/stringprintf.h"
8 #include "content/public/browser/render_frame_host.h"
9 #include "content/public/browser/render_process_host.h"
10 #include "content/public/browser/site_instance.h"
11 #include "content/public/browser/web_contents.h"
12 #include "content/public/browser/web_contents_observer.h"
13
14 namespace content {
15
16 namespace {
17
18 const char kWebContentsObserverSanityCheckerKey[] =
19 "WebContentsObserverSanityChecker";
20
21 } // namespace
22
23 // static
24 void WebContentsObserverSanityChecker::Enable(WebContents* web_contents) {
25 if (web_contents->GetUserData(&kWebContentsObserverSanityCheckerKey))
26 return;
27 web_contents->SetUserData(&kWebContentsObserverSanityCheckerKey,
28 new WebContentsObserverSanityChecker(web_contents));
29 }
30
31 void WebContentsObserverSanityChecker::RenderFrameCreated(
32 RenderFrameHost* render_frame_host) {
33 CHECK(!web_contents_destroyed_);
34 std::pair<int, int> routing_pair =
35 std::make_pair(render_frame_host->GetProcess()->GetID(),
36 render_frame_host->GetRoutingID());
37 bool frame_exists = !live_routes_.insert(routing_pair).second;
38 bool dead_already = deleted_routes_.count(routing_pair) != 0;
39
40 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:"
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 }
50 }
51
52 void WebContentsObserverSanityChecker::RenderFrameDeleted(
53 RenderFrameHost* render_frame_host) {
54 CHECK(!web_contents_destroyed_);
55 std::pair<int, int> routing_pair =
56 std::make_pair(render_frame_host->GetProcess()->GetID(),
57 render_frame_host->GetRoutingID());
58 bool was_live = !!live_routes_.erase(routing_pair);
59 bool was_dead_already = !deleted_routes_.insert(routing_pair).second;
60
61 if (was_dead_already) {
62 CHECK(false) << "RenderFrameDeleted called more than once for routing pair "
63 << Format(render_frame_host);
64 } else if (!was_live) {
65 // TODO(nick): Clients can easily ignore an unrecognized object, but it
66 // would be useful from a finding-bugs perspective if we could enable this
67 // check.
68 #if 0
69 CHECK(false) << "RenderFrameDeleted called for routing pair "
70 << Format(render_frame_host)
71 << " for which RenderFrameCreated was never called";
72 #endif
73 }
74 }
75
76 void WebContentsObserverSanityChecker::RenderFrameForInterstitialPageCreated(
77 RenderFrameHost* render_frame_host) {
78 // TODO(nick): Record this.
79 }
80
81 void WebContentsObserverSanityChecker::RenderFrameHostChanged(
82 RenderFrameHost* old_host,
83 RenderFrameHost* new_host) {
84 CHECK(new_host);
85 if (old_host)
86 AssertFrameExists(old_host);
87 AssertFrameExists(new_host);
88 }
89
90 void WebContentsObserverSanityChecker::DidStartProvisionalLoadForFrame(
91 RenderFrameHost* render_frame_host,
92 const GURL& validated_url,
93 bool is_error_page,
94 bool is_iframe_srcdoc) {
95 AssertFrameExists(render_frame_host);
96 }
97
98 void WebContentsObserverSanityChecker::DidCommitProvisionalLoadForFrame(
99 RenderFrameHost* render_frame_host,
100 const GURL& url,
101 ui::PageTransition transition_type) {
102 AssertFrameExists(render_frame_host);
103 }
104
105 void WebContentsObserverSanityChecker::DidFailProvisionalLoad(
106 RenderFrameHost* render_frame_host,
107 const GURL& validated_url,
108 int error_code,
109 const base::string16& error_description) {
110 AssertFrameExists(render_frame_host);
111 }
112
113 void WebContentsObserverSanityChecker::DidNavigateMainFrame(
114 const LoadCommittedDetails& details,
115 const FrameNavigateParams& params) {
116 AssertMainFrameExists();
117 }
118
119 void WebContentsObserverSanityChecker::DidNavigateAnyFrame(
120 RenderFrameHost* render_frame_host,
121 const LoadCommittedDetails& details,
122 const FrameNavigateParams& params) {
123 AssertFrameExists(render_frame_host);
124 }
125
126 void WebContentsObserverSanityChecker::DocumentAvailableInMainFrame() {
127 AssertMainFrameExists();
128 }
129
130 void WebContentsObserverSanityChecker::DocumentOnLoadCompletedInMainFrame() {
131 AssertMainFrameExists();
132 }
133
134 void WebContentsObserverSanityChecker::DocumentLoadedInFrame(
135 RenderFrameHost* render_frame_host) {
136 AssertFrameExists(render_frame_host);
137 }
138
139 void WebContentsObserverSanityChecker::DidFinishLoad(
140 RenderFrameHost* render_frame_host,
141 const GURL& validated_url) {
142 AssertFrameExists(render_frame_host);
143 }
144
145 void WebContentsObserverSanityChecker::DidFailLoad(
146 RenderFrameHost* render_frame_host,
147 const GURL& validated_url,
148 int error_code,
149 const base::string16& error_description) {
150 AssertFrameExists(render_frame_host);
151 }
152
153 void WebContentsObserverSanityChecker::DidGetRedirectForResourceRequest(
154 RenderFrameHost* render_frame_host,
155 const ResourceRedirectDetails& details) {
156 AssertFrameExists(render_frame_host);
157 }
158
159 void WebContentsObserverSanityChecker::DidOpenRequestedURL(
160 WebContents* new_contents,
161 RenderFrameHost* source_render_frame_host,
162 const GURL& url,
163 const Referrer& referrer,
164 WindowOpenDisposition disposition,
165 ui::PageTransition transition) {
166 AssertFrameExists(source_render_frame_host);
167 }
168
169 void WebContentsObserverSanityChecker::FrameDetached(
170 RenderFrameHost* render_frame_host) {
171 AssertFrameExists(render_frame_host);
172 }
173
174 bool WebContentsObserverSanityChecker::OnMessageReceived(
175 const IPC::Message& message,
176 RenderFrameHost* render_frame_host) {
177 AssertFrameExists(render_frame_host);
178 return false;
179 }
180
181 void WebContentsObserverSanityChecker::WebContentsDestroyed() {
182 CHECK(!web_contents_destroyed_);
183 web_contents_destroyed_ = true;
184 }
185
186 WebContentsObserverSanityChecker::WebContentsObserverSanityChecker(
187 WebContents* web_contents)
188 : WebContentsObserver(web_contents), web_contents_destroyed_(false) {
189 // Prime the pump with the initial objects.
190 RenderViewCreated(web_contents->GetRenderViewHost());
191 RenderFrameCreated(web_contents->GetMainFrame());
192 }
193
194 WebContentsObserverSanityChecker::~WebContentsObserverSanityChecker() {
195 CHECK(web_contents_destroyed_);
196 }
197
198 void WebContentsObserverSanityChecker::AssertFrameExists(
199 RenderFrameHost* render_frame_host) {
200 CHECK(!web_contents_destroyed_);
201 std::pair<int, int> routing_pair =
202 std::make_pair(render_frame_host->GetProcess()->GetID(),
203 render_frame_host->GetRoutingID());
204 bool render_frame_created_happened = live_routes_.count(routing_pair) != 0;
205 bool render_frame_deleted_happened = deleted_routes_.count(routing_pair) != 0;
206
207 CHECK(render_frame_created_happened)
208 << "A RenderFrameHost pointer was passed to a WebContentsObserver "
209 << "method, but WebContentsObserver::RenderFrameCreated was never called "
210 << "for that RenderFrameHost: " << Format(render_frame_host);
211 CHECK(!render_frame_deleted_happened)
212 << "A RenderFrameHost pointer was passed to a WebContentsObserver "
213 << "method, but WebContentsObserver::RenderFrameDeleted had already been "
214 << "called on that frame:" << Format(render_frame_host);
215 }
216
217 void WebContentsObserverSanityChecker::AssertMainFrameExists() {
218 AssertFrameExists(web_contents()->GetMainFrame());
219 }
220
221 std::string WebContentsObserverSanityChecker::Format(
222 RenderFrameHost* render_frame_host) {
223 return base::StringPrintf(
224 "(%d, %d -> %s )", render_frame_host->GetProcess()->GetID(),
225 render_frame_host->GetRoutingID(),
226 render_frame_host->GetSiteInstance()->GetSiteURL().spec().c_str());
227 }
228
229 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698