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

Side by Side Diff: chrome/browser/extensions/api/web_navigation/frame_navigation_state.cc

Issue 384993004: Simplify WebNavigationApi by using RenderFrameHost internally. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove troublesome DCHECKs Created 6 years, 5 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/browser/extensions/api/web_navigation/frame_navigation_state.h" 5 #include "chrome/browser/extensions/api/web_navigation/frame_navigation_state.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "chrome/common/url_constants.h" 8 #include "chrome/common/url_constants.h"
9 #include "content/public/browser/render_frame_host.h"
9 #include "extensions/common/constants.h" 10 #include "extensions/common/constants.h"
10 11
11 namespace extensions { 12 namespace extensions {
12 13
13 namespace { 14 namespace {
14 15
15 // URL schemes for which we'll send events. 16 // URL schemes for which we'll send events.
16 const char* kValidSchemes[] = { 17 const char* kValidSchemes[] = {
17 content::kChromeUIScheme, 18 content::kChromeUIScheme,
18 url::kHttpScheme, 19 url::kHttpScheme,
19 url::kHttpsScheme, 20 url::kHttpsScheme,
20 url::kFileScheme, 21 url::kFileScheme,
21 url::kFtpScheme, 22 url::kFtpScheme,
22 url::kJavaScriptScheme, 23 url::kJavaScriptScheme,
23 url::kDataScheme, 24 url::kDataScheme,
24 url::kFileSystemScheme, 25 url::kFileSystemScheme,
25 }; 26 };
26 27
27 } // namespace 28 } // namespace
28 29
29 FrameNavigationState::FrameID::FrameID()
30 : frame_num(-1),
31 render_view_host(NULL) {
32 }
33
34 FrameNavigationState::FrameID::FrameID(
35 int64 frame_num,
36 content::RenderViewHost* render_view_host)
37 : frame_num(frame_num),
38 render_view_host(render_view_host) {
39 }
40
41 bool FrameNavigationState::FrameID::operator<(
42 const FrameNavigationState::FrameID& other) const {
43 return frame_num < other.frame_num ||
44 (frame_num == other.frame_num &&
45 render_view_host < other.render_view_host);
46 }
47
48 bool FrameNavigationState::FrameID::operator==(
49 const FrameNavigationState::FrameID& other) const {
50 return frame_num == other.frame_num &&
51 render_view_host == other.render_view_host;
52 }
53
54 bool FrameNavigationState::FrameID::operator!=(
55 const FrameNavigationState::FrameID& other) const {
56 return !(*this == other);
57 }
58
59 FrameNavigationState::FrameState::FrameState() {} 30 FrameNavigationState::FrameState::FrameState() {}
60 31
61 // static 32 // static
62 bool FrameNavigationState::allow_extension_scheme_ = false; 33 bool FrameNavigationState::allow_extension_scheme_ = false;
63 34
64 FrameNavigationState::FrameNavigationState() {} 35 FrameNavigationState::FrameNavigationState() : main_frame_host_(NULL) {
36 }
65 37
66 FrameNavigationState::~FrameNavigationState() {} 38 FrameNavigationState::~FrameNavigationState() {}
67 39
68 bool FrameNavigationState::CanSendEvents(FrameID frame_id) const { 40 bool FrameNavigationState::CanSendEvents(
69 FrameIdToStateMap::const_iterator frame_state = 41 content::RenderFrameHost* frame_host) const {
70 frame_state_map_.find(frame_id); 42 FrameHostToStateMap::const_iterator it =
71 if (frame_state == frame_state_map_.end() || 43 frame_host_state_map_.find(frame_host);
72 frame_state->second.error_occurred) { 44 if (it == frame_host_state_map_.end() || it->second.error_occurred) {
73 return false; 45 return false;
74 } 46 }
75 return IsValidUrl(frame_state->second.url); 47 return IsValidUrl(it->second.url);
76 } 48 }
77 49
78 bool FrameNavigationState::IsValidUrl(const GURL& url) const { 50 bool FrameNavigationState::IsValidUrl(const GURL& url) const {
79 for (unsigned i = 0; i < arraysize(kValidSchemes); ++i) { 51 for (unsigned i = 0; i < arraysize(kValidSchemes); ++i) {
80 if (url.scheme() == kValidSchemes[i]) 52 if (url.scheme() == kValidSchemes[i])
81 return true; 53 return true;
82 } 54 }
83 // Allow about:blank and about:srcdoc. 55 // Allow about:blank and about:srcdoc.
84 if (url.spec() == url::kAboutBlankURL || 56 if (url.spec() == url::kAboutBlankURL ||
85 url.spec() == content::kAboutSrcDocURL) { 57 url.spec() == content::kAboutSrcDocURL) {
86 return true; 58 return true;
87 } 59 }
88 return allow_extension_scheme_ && url.scheme() == kExtensionScheme; 60 return allow_extension_scheme_ && url.scheme() == kExtensionScheme;
89 } 61 }
90 62
91 void FrameNavigationState::TrackFrame(FrameID frame_id, 63 void FrameNavigationState::TrackFrame(content::RenderFrameHost* frame_host,
92 FrameID parent_frame_id,
93 const GURL& url, 64 const GURL& url,
94 bool is_main_frame,
95 bool is_error_page, 65 bool is_error_page,
96 bool is_iframe_srcdoc) { 66 bool is_iframe_srcdoc) {
97 FrameState& frame_state = frame_state_map_[frame_id]; 67 FrameState& frame_state = frame_host_state_map_[frame_host];
98 frame_state.error_occurred = is_error_page; 68 frame_state.error_occurred = is_error_page;
99 frame_state.url = url; 69 frame_state.url = url;
100 frame_state.is_main_frame = is_main_frame;
101 frame_state.is_iframe_srcdoc = is_iframe_srcdoc; 70 frame_state.is_iframe_srcdoc = is_iframe_srcdoc;
102 DCHECK(!is_iframe_srcdoc || url == GURL(url::kAboutBlankURL)); 71 DCHECK(!is_iframe_srcdoc || url == GURL(url::kAboutBlankURL));
103 frame_state.is_navigating = true; 72 frame_state.is_navigating = true;
104 frame_state.is_committed = false; 73 frame_state.is_committed = false;
105 frame_state.is_server_redirected = false; 74 frame_state.is_server_redirected = false;
106 frame_state.is_parsing = true; 75 frame_state.is_parsing = true;
107 if (!is_main_frame) { 76 frame_hosts_.insert(frame_host);
108 frame_state.parent_frame_num = parent_frame_id.frame_num;
109 } else {
110 DCHECK_EQ(-1, parent_frame_id.frame_num);
111 frame_state.parent_frame_num = -1;
112 }
113 frame_ids_.insert(frame_id);
114 } 77 }
115 78
116 void FrameNavigationState::FrameDetached(FrameID frame_id) { 79 void FrameNavigationState::FrameDetached(content::RenderFrameHost* frame_host) {
117 FrameIdToStateMap::const_iterator frame_state = 80 if (frame_host == main_frame_host_)
118 frame_state_map_.find(frame_id); 81 main_frame_host_ = NULL;
119 if (frame_state == frame_state_map_.end()) 82 frame_host_state_map_.erase(frame_host);
120 return; 83 frame_hosts_.erase(frame_host);
121 if (frame_id == main_frame_id_)
122 main_frame_id_ = FrameID();
123 frame_state_map_.erase(frame_id);
124 frame_ids_.erase(frame_id);
125 #ifndef NDEBUG
126 // Check that the deleted frame was not the parent of any other frame. WebKit
127 // should always detach frames starting with the children.
128 for (FrameIdToStateMap::const_iterator frame = frame_state_map_.begin();
129 frame != frame_state_map_.end(); ++frame) {
130 if (frame->first.render_view_host != frame_id.render_view_host)
131 continue;
132 if (frame->second.parent_frame_num != frame_id.frame_num)
133 continue;
134 NOTREACHED();
135 }
136 #endif
137 } 84 }
138 85
139 void FrameNavigationState::StopTrackingFramesInRVH( 86 void FrameNavigationState::StopTrackingFramesInRVH(
140 content::RenderViewHost* render_view_host, 87 content::RenderViewHost* render_view_host,
141 FrameID id_to_skip) { 88 content::RenderFrameHost* frame_host_to_skip) {
142 for (std::set<FrameID>::iterator frame = frame_ids_.begin(); 89 for (std::set<content::RenderFrameHost*>::iterator it = frame_hosts_.begin();
143 frame != frame_ids_.end();) { 90 it != frame_hosts_.end();) {
144 if (frame->render_view_host != render_view_host || *frame == id_to_skip) { 91 if ((*it)->GetRenderViewHost() != render_view_host ||
145 ++frame; 92 *it == frame_host_to_skip) {
93 ++it;
146 continue; 94 continue;
147 } 95 }
148 FrameID frame_id = *frame; 96 if (*it == main_frame_host_)
149 ++frame; 97 main_frame_host_ = NULL;
150 if (frame_id == main_frame_id_) 98 frame_host_state_map_.erase(*it);
151 main_frame_id_ = FrameID(); 99 frame_hosts_.erase(it++);
152 frame_state_map_.erase(frame_id);
153 frame_ids_.erase(frame_id);
154 } 100 }
155 } 101 }
156 102
157 void FrameNavigationState::UpdateFrame(FrameID frame_id, const GURL& url) { 103 void FrameNavigationState::UpdateFrame(content::RenderFrameHost* frame_host,
158 FrameIdToStateMap::iterator frame_state = frame_state_map_.find(frame_id); 104 const GURL& url) {
159 if (frame_state == frame_state_map_.end()) { 105 FrameHostToStateMap::iterator it = frame_host_state_map_.find(frame_host);
106 if (it == frame_host_state_map_.end()) {
160 NOTREACHED(); 107 NOTREACHED();
161 return; 108 return;
162 } 109 }
163 frame_state->second.url = url; 110 it->second.url = url;
164 } 111 }
165 112
166 bool FrameNavigationState::IsValidFrame(FrameID frame_id) const { 113 bool FrameNavigationState::IsValidFrame(
167 FrameIdToStateMap::const_iterator frame_state = 114 content::RenderFrameHost* frame_host) const {
168 frame_state_map_.find(frame_id); 115 return frame_host_state_map_.find(frame_host) != frame_host_state_map_.end();
169 return (frame_state != frame_state_map_.end());
170 } 116 }
171 117
172 GURL FrameNavigationState::GetUrl(FrameID frame_id) const { 118 GURL FrameNavigationState::GetUrl(content::RenderFrameHost* frame_host) const {
173 FrameIdToStateMap::const_iterator frame_state = 119 FrameHostToStateMap::const_iterator it =
174 frame_state_map_.find(frame_id); 120 frame_host_state_map_.find(frame_host);
175 if (frame_state == frame_state_map_.end()) { 121 if (it == frame_host_state_map_.end()) {
176 NOTREACHED(); 122 NOTREACHED();
177 return GURL(); 123 return GURL();
178 } 124 }
179 if (frame_state->second.is_iframe_srcdoc) 125 if (it->second.is_iframe_srcdoc)
180 return GURL(content::kAboutSrcDocURL); 126 return GURL(content::kAboutSrcDocURL);
181 return frame_state->second.url; 127 return it->second.url;
182 } 128 }
183 129
184 bool FrameNavigationState::IsMainFrame(FrameID frame_id) const { 130 content::RenderFrameHost* FrameNavigationState::GetLastCommittedMainFrameHost()
185 FrameIdToStateMap::const_iterator frame_state = 131 const {
186 frame_state_map_.find(frame_id); 132 return main_frame_host_;
187 return (frame_state != frame_state_map_.end() &&
188 frame_state->second.is_main_frame);
189 } 133 }
190 134
191 FrameNavigationState::FrameID FrameNavigationState::GetMainFrameID() const { 135 void FrameNavigationState::SetErrorOccurredInFrame(
192 return main_frame_id_; 136 content::RenderFrameHost* frame_host) {
137 FrameHostToStateMap::iterator it = frame_host_state_map_.find(frame_host);
138 if (it == frame_host_state_map_.end()) {
139 NOTREACHED();
140 return;
141 }
142 it->second.error_occurred = true;
193 } 143 }
194 144
195 FrameNavigationState::FrameID FrameNavigationState::GetParentFrameID( 145 bool FrameNavigationState::GetErrorOccurredInFrame(
196 FrameID frame_id) const { 146 content::RenderFrameHost* frame_host) const {
197 FrameIdToStateMap::const_iterator frame_state = 147 FrameHostToStateMap::const_iterator it =
198 frame_state_map_.find(frame_id); 148 frame_host_state_map_.find(frame_host);
199 if (frame_state == frame_state_map_.end()) { 149 DCHECK(it != frame_host_state_map_.end());
200 NOTREACHED(); 150 return it == frame_host_state_map_.end() || it->second.error_occurred;
201 return FrameID();
202 }
203 return FrameID(frame_state->second.parent_frame_num,
204 frame_id.render_view_host);
205 } 151 }
206 152
207 void FrameNavigationState::SetErrorOccurredInFrame(FrameID frame_id) { 153 void FrameNavigationState::SetNavigationCompleted(
208 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); 154 content::RenderFrameHost* frame_host) {
209 frame_state_map_[frame_id].error_occurred = true; 155 FrameHostToStateMap::iterator it = frame_host_state_map_.find(frame_host);
156 if (it == frame_host_state_map_.end()) {
157 NOTREACHED();
158 return;
159 }
160 it->second.is_navigating = false;
210 } 161 }
211 162
212 bool FrameNavigationState::GetErrorOccurredInFrame(FrameID frame_id) const { 163 bool FrameNavigationState::GetNavigationCompleted(
213 FrameIdToStateMap::const_iterator frame_state = 164 content::RenderFrameHost* frame_host) const {
214 frame_state_map_.find(frame_id); 165 FrameHostToStateMap::const_iterator it =
215 return (frame_state == frame_state_map_.end() || 166 frame_host_state_map_.find(frame_host);
216 frame_state->second.error_occurred); 167 DCHECK(it != frame_host_state_map_.end());
168 return it == frame_host_state_map_.end() || !it->second.is_navigating;
217 } 169 }
218 170
219 void FrameNavigationState::SetNavigationCompleted(FrameID frame_id) { 171 void FrameNavigationState::SetParsingFinished(
220 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); 172 content::RenderFrameHost* frame_host) {
221 frame_state_map_[frame_id].is_navigating = false; 173 FrameHostToStateMap::iterator it = frame_host_state_map_.find(frame_host);
174 if (it == frame_host_state_map_.end()) {
175 NOTREACHED();
176 return;
177 }
178 it->second.is_parsing = false;
222 } 179 }
223 180
224 bool FrameNavigationState::GetNavigationCompleted(FrameID frame_id) const { 181 bool FrameNavigationState::GetParsingFinished(
225 FrameIdToStateMap::const_iterator frame_state = 182 content::RenderFrameHost* frame_host) const {
226 frame_state_map_.find(frame_id); 183 FrameHostToStateMap::const_iterator it =
227 return (frame_state == frame_state_map_.end() || 184 frame_host_state_map_.find(frame_host);
228 !frame_state->second.is_navigating); 185 DCHECK(it != frame_host_state_map_.end());
186 return it == frame_host_state_map_.end() || !it->second.is_parsing;
229 } 187 }
230 188
231 void FrameNavigationState::SetParsingFinished(FrameID frame_id) { 189 void FrameNavigationState::SetNavigationCommitted(
232 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); 190 content::RenderFrameHost* frame_host) {
233 frame_state_map_[frame_id].is_parsing = false; 191 FrameHostToStateMap::iterator it = frame_host_state_map_.find(frame_host);
192 if (it == frame_host_state_map_.end()) {
193 NOTREACHED();
194 return;
195 }
196 it->second.is_committed = true;
197 if (!frame_host->GetParent())
198 main_frame_host_ = frame_host;
234 } 199 }
235 200
236 bool FrameNavigationState::GetParsingFinished(FrameID frame_id) const { 201 bool FrameNavigationState::GetNavigationCommitted(
237 FrameIdToStateMap::const_iterator frame_state = 202 content::RenderFrameHost* frame_host) const {
238 frame_state_map_.find(frame_id); 203 FrameHostToStateMap::const_iterator it =
239 return (frame_state == frame_state_map_.end() || 204 frame_host_state_map_.find(frame_host);
240 !frame_state->second.is_parsing); 205 DCHECK(it != frame_host_state_map_.end());
206 return it != frame_host_state_map_.end() && it->second.is_committed;
241 } 207 }
242 208
243 void FrameNavigationState::SetNavigationCommitted(FrameID frame_id) { 209 void FrameNavigationState::SetIsServerRedirected(
244 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); 210 content::RenderFrameHost* frame_host) {
245 frame_state_map_[frame_id].is_committed = true; 211 FrameHostToStateMap::iterator it = frame_host_state_map_.find(frame_host);
246 if (frame_state_map_[frame_id].is_main_frame) 212 if (it == frame_host_state_map_.end()) {
247 main_frame_id_ = frame_id; 213 NOTREACHED();
214 return;
215 }
216 it->second.is_server_redirected = true;
248 } 217 }
249 218
250 bool FrameNavigationState::GetNavigationCommitted(FrameID frame_id) const { 219 bool FrameNavigationState::GetIsServerRedirected(
251 FrameIdToStateMap::const_iterator frame_state = 220 content::RenderFrameHost* frame_host) const {
252 frame_state_map_.find(frame_id); 221 FrameHostToStateMap::const_iterator it =
253 return (frame_state != frame_state_map_.end() && 222 frame_host_state_map_.find(frame_host);
254 frame_state->second.is_committed); 223 DCHECK(it != frame_host_state_map_.end());
255 } 224 return it != frame_host_state_map_.end() && it->second.is_server_redirected;
256
257 void FrameNavigationState::SetIsServerRedirected(FrameID frame_id) {
258 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end());
259 frame_state_map_[frame_id].is_server_redirected = true;
260 }
261
262 bool FrameNavigationState::GetIsServerRedirected(FrameID frame_id) const {
263 FrameIdToStateMap::const_iterator frame_state =
264 frame_state_map_.find(frame_id);
265 return (frame_state != frame_state_map_.end() &&
266 frame_state->second.is_server_redirected);
267 } 225 }
268 226
269 } // namespace extensions 227 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698