OLD | NEW |
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 | 9 |
10 namespace extensions { | 10 namespace extensions { |
11 | 11 |
12 namespace { | 12 namespace { |
13 | 13 |
14 // URL schemes for which we'll send events. | 14 // URL schemes for which we'll send events. |
15 const char* kValidSchemes[] = { | 15 const char* kValidSchemes[] = { |
16 chrome::kHttpScheme, | 16 chrome::kHttpScheme, |
17 chrome::kHttpsScheme, | 17 chrome::kHttpsScheme, |
18 chrome::kFileScheme, | 18 chrome::kFileScheme, |
19 chrome::kFtpScheme, | 19 chrome::kFtpScheme, |
20 chrome::kJavaScriptScheme, | 20 chrome::kJavaScriptScheme, |
21 chrome::kDataScheme, | 21 chrome::kDataScheme, |
22 chrome::kFileSystemScheme, | 22 chrome::kFileSystemScheme, |
23 }; | 23 }; |
24 | 24 |
25 } // namespace | 25 } // namespace |
26 | 26 |
27 FrameNavigationState::FrameID::FrameID() | 27 FrameNavigationState::FrameID::FrameID() |
28 : frame_num(-1), | 28 : frame_num(-1), |
29 render_process_id(-1) { | 29 render_view_host(NULL) { |
30 } | 30 } |
31 | 31 |
32 FrameNavigationState::FrameID::FrameID(int64 frame_num, | 32 FrameNavigationState::FrameID::FrameID( |
33 int render_process_id) | 33 int64 frame_num, |
| 34 content::RenderViewHost* render_view_host) |
34 : frame_num(frame_num), | 35 : frame_num(frame_num), |
35 render_process_id(render_process_id) { | 36 render_view_host(render_view_host) { |
36 } | 37 } |
37 | 38 |
38 bool FrameNavigationState::FrameID::IsValid() const { | 39 bool FrameNavigationState::FrameID::IsValid() const { |
39 return frame_num >= 0 && render_process_id >= 0; | 40 return frame_num >= 0 && render_view_host; |
40 } | 41 } |
41 | 42 |
42 bool FrameNavigationState::FrameID::operator<( | 43 bool FrameNavigationState::FrameID::operator<( |
43 const FrameNavigationState::FrameID& other) const { | 44 const FrameNavigationState::FrameID& other) const { |
44 return frame_num < other.frame_num || | 45 return frame_num < other.frame_num || |
45 (frame_num == other.frame_num && | 46 (frame_num == other.frame_num && |
46 render_process_id < other.render_process_id); | 47 render_view_host < other.render_view_host); |
47 } | 48 } |
48 | 49 |
49 bool FrameNavigationState::FrameID::operator==( | 50 bool FrameNavigationState::FrameID::operator==( |
50 const FrameNavigationState::FrameID& other) const { | 51 const FrameNavigationState::FrameID& other) const { |
51 return frame_num == other.frame_num && | 52 return frame_num == other.frame_num && |
52 render_process_id == other.render_process_id; | 53 render_view_host == other.render_view_host; |
53 } | 54 } |
54 | 55 |
55 bool FrameNavigationState::FrameID::operator!=( | 56 bool FrameNavigationState::FrameID::operator!=( |
56 const FrameNavigationState::FrameID& other) const { | 57 const FrameNavigationState::FrameID& other) const { |
57 return !(*this == other); | 58 return !(*this == other); |
58 } | 59 } |
59 | 60 |
60 // static | 61 // static |
61 bool FrameNavigationState::allow_extension_scheme_ = false; | 62 bool FrameNavigationState::allow_extension_scheme_ = false; |
62 | 63 |
(...skipping 21 matching lines...) Expand all Loading... |
84 return true; | 85 return true; |
85 if (allow_extension_scheme_ && url.scheme() == chrome::kExtensionScheme) | 86 if (allow_extension_scheme_ && url.scheme() == chrome::kExtensionScheme) |
86 return true; | 87 return true; |
87 return false; | 88 return false; |
88 } | 89 } |
89 | 90 |
90 void FrameNavigationState::TrackFrame(FrameID frame_id, | 91 void FrameNavigationState::TrackFrame(FrameID frame_id, |
91 const GURL& url, | 92 const GURL& url, |
92 bool is_main_frame, | 93 bool is_main_frame, |
93 bool is_error_page) { | 94 bool is_error_page) { |
94 if (is_main_frame) { | |
95 frame_state_map_.clear(); | |
96 frame_ids_.clear(); | |
97 } | |
98 FrameState& frame_state = frame_state_map_[frame_id]; | 95 FrameState& frame_state = frame_state_map_[frame_id]; |
99 frame_state.error_occurred = is_error_page; | 96 frame_state.error_occurred = is_error_page; |
100 frame_state.url = url; | 97 frame_state.url = url; |
101 frame_state.is_main_frame = is_main_frame; | 98 frame_state.is_main_frame = is_main_frame; |
102 frame_state.is_navigating = true; | 99 frame_state.is_navigating = true; |
103 frame_state.is_committed = false; | 100 frame_state.is_committed = false; |
104 frame_state.is_server_redirected = false; | 101 frame_state.is_server_redirected = false; |
105 if (is_main_frame) { | 102 frame_ids_.insert(frame_id); |
106 main_frame_id_ = frame_id; | 103 } |
| 104 |
| 105 void FrameNavigationState::StopTrackingFramesInRVH( |
| 106 content::RenderViewHost* render_view_host) { |
| 107 for (std::set<FrameID>::iterator frame = frame_ids_.begin(); |
| 108 frame != frame_ids_.end();) { |
| 109 if (frame->render_view_host != render_view_host) { |
| 110 ++frame; |
| 111 continue; |
| 112 } |
| 113 FrameID frame_id = *frame; |
| 114 ++frame; |
| 115 if (frame_id == main_frame_id_) |
| 116 main_frame_id_ = FrameID(); |
| 117 frame_state_map_.erase(frame_id); |
| 118 frame_ids_.erase(frame_id); |
107 } | 119 } |
108 frame_ids_.insert(frame_id); | |
109 } | 120 } |
110 | 121 |
111 void FrameNavigationState::UpdateFrame(FrameID frame_id, const GURL& url) { | 122 void FrameNavigationState::UpdateFrame(FrameID frame_id, const GURL& url) { |
112 FrameIdToStateMap::iterator frame_state = frame_state_map_.find(frame_id); | 123 FrameIdToStateMap::iterator frame_state = frame_state_map_.find(frame_id); |
113 if (frame_state == frame_state_map_.end()) { | 124 if (frame_state == frame_state_map_.end()) { |
114 NOTREACHED(); | 125 NOTREACHED(); |
115 return; | 126 return; |
116 } | 127 } |
117 frame_state->second.url = url; | 128 frame_state->second.url = url; |
118 } | 129 } |
119 | 130 |
120 bool FrameNavigationState::IsValidFrame(FrameID frame_id) const { | 131 bool FrameNavigationState::IsValidFrame(FrameID frame_id) const { |
121 FrameIdToStateMap::const_iterator frame_state = | 132 FrameIdToStateMap::const_iterator frame_state = |
122 frame_state_map_.find(frame_id); | 133 frame_state_map_.find(frame_id); |
123 return (frame_state != frame_state_map_.end()); | 134 return (frame_state != frame_state_map_.end()); |
124 } | 135 } |
125 | 136 |
126 GURL FrameNavigationState::GetUrl(FrameID frame_id) const { | 137 GURL FrameNavigationState::GetUrl(FrameID frame_id) const { |
127 FrameIdToStateMap::const_iterator frame_state = | 138 FrameIdToStateMap::const_iterator frame_state = |
128 frame_state_map_.find(frame_id); | 139 frame_state_map_.find(frame_id); |
129 if (frame_state == frame_state_map_.end()) { | 140 if (frame_state == frame_state_map_.end()) { |
130 NOTREACHED(); | 141 NOTREACHED(); |
131 return GURL(); | 142 return GURL(); |
132 } | 143 } |
133 return frame_state->second.url; | 144 return frame_state->second.url; |
134 } | 145 } |
135 | 146 |
136 bool FrameNavigationState::IsMainFrame(FrameID frame_id) const { | 147 bool FrameNavigationState::IsMainFrame(FrameID frame_id) const { |
137 return main_frame_id_.IsValid() && main_frame_id_ == frame_id; | 148 FrameIdToStateMap::const_iterator frame_state = |
| 149 frame_state_map_.find(frame_id); |
| 150 return (frame_state != frame_state_map_.end() && |
| 151 frame_state->second.is_main_frame); |
138 } | 152 } |
139 | 153 |
140 FrameNavigationState::FrameID FrameNavigationState::GetMainFrameID() const { | 154 FrameNavigationState::FrameID FrameNavigationState::GetMainFrameID() const { |
141 return main_frame_id_; | 155 return main_frame_id_; |
142 } | 156 } |
143 | 157 |
144 void FrameNavigationState::SetErrorOccurredInFrame(FrameID frame_id) { | 158 void FrameNavigationState::SetErrorOccurredInFrame(FrameID frame_id) { |
145 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); | 159 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); |
146 frame_state_map_[frame_id].error_occurred = true; | 160 frame_state_map_[frame_id].error_occurred = true; |
147 } | 161 } |
(...skipping 13 matching lines...) Expand all Loading... |
161 bool FrameNavigationState::GetNavigationCompleted(FrameID frame_id) const { | 175 bool FrameNavigationState::GetNavigationCompleted(FrameID frame_id) const { |
162 FrameIdToStateMap::const_iterator frame_state = | 176 FrameIdToStateMap::const_iterator frame_state = |
163 frame_state_map_.find(frame_id); | 177 frame_state_map_.find(frame_id); |
164 return (frame_state == frame_state_map_.end() || | 178 return (frame_state == frame_state_map_.end() || |
165 !frame_state->second.is_navigating); | 179 !frame_state->second.is_navigating); |
166 } | 180 } |
167 | 181 |
168 void FrameNavigationState::SetNavigationCommitted(FrameID frame_id) { | 182 void FrameNavigationState::SetNavigationCommitted(FrameID frame_id) { |
169 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); | 183 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); |
170 frame_state_map_[frame_id].is_committed = true; | 184 frame_state_map_[frame_id].is_committed = true; |
| 185 if (frame_state_map_[frame_id].is_main_frame) |
| 186 main_frame_id_ = frame_id; |
171 } | 187 } |
172 | 188 |
173 bool FrameNavigationState::GetNavigationCommitted(FrameID frame_id) const { | 189 bool FrameNavigationState::GetNavigationCommitted(FrameID frame_id) const { |
174 FrameIdToStateMap::const_iterator frame_state = | 190 FrameIdToStateMap::const_iterator frame_state = |
175 frame_state_map_.find(frame_id); | 191 frame_state_map_.find(frame_id); |
176 return (frame_state != frame_state_map_.end() && | 192 return (frame_state != frame_state_map_.end() && |
177 frame_state->second.is_committed); | 193 frame_state->second.is_committed); |
178 } | 194 } |
179 | 195 |
180 void FrameNavigationState::SetIsServerRedirected(FrameID frame_id) { | 196 void FrameNavigationState::SetIsServerRedirected(FrameID frame_id) { |
181 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); | 197 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); |
182 frame_state_map_[frame_id].is_server_redirected = true; | 198 frame_state_map_[frame_id].is_server_redirected = true; |
183 } | 199 } |
184 | 200 |
185 bool FrameNavigationState::GetIsServerRedirected(FrameID frame_id) const { | 201 bool FrameNavigationState::GetIsServerRedirected(FrameID frame_id) const { |
186 FrameIdToStateMap::const_iterator frame_state = | 202 FrameIdToStateMap::const_iterator frame_state = |
187 frame_state_map_.find(frame_id); | 203 frame_state_map_.find(frame_id); |
188 return (frame_state != frame_state_map_.end() && | 204 return (frame_state != frame_state_map_.end() && |
189 frame_state->second.is_server_redirected); | 205 frame_state->second.is_server_redirected); |
190 } | 206 } |
191 | 207 |
192 } // namespace extensions | 208 } // namespace extensions |
OLD | NEW |