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() | |
28 : frame_num(-1), | |
29 render_process_id(-1) { | |
30 } | |
31 | |
32 FrameNavigationState::FrameID::FrameID(int64 frame_num, | |
33 int render_process_id) | |
34 : frame_num(frame_num), | |
35 render_process_id(render_process_id) { | |
36 } | |
37 | |
38 FrameNavigationState::FrameID::~FrameID() {} | |
39 | |
40 bool FrameNavigationState::FrameID::operator<( | |
41 const FrameNavigationState::FrameID& other) const { | |
42 return frame_num < other.frame_num || | |
43 (frame_num == other.frame_num && | |
44 render_process_id < other.render_process_id); | |
45 } | |
46 | |
47 bool FrameNavigationState::FrameID::operator==( | |
48 const FrameNavigationState::FrameID& other) const { | |
49 return frame_num == other.frame_num && | |
50 render_process_id == other.render_process_id; | |
51 } | |
52 | |
53 bool FrameNavigationState::FrameID::operator!=( | |
54 const FrameNavigationState::FrameID& other) const { | |
55 return !(*this == other); | |
56 } | |
57 | |
58 // static | |
59 FrameNavigationState::FrameID FrameNavigationState::kInvalidFrameID = | |
60 FrameNavigationState::FrameID(-1, -1); | |
61 | |
62 // static | 27 // static |
63 bool FrameNavigationState::allow_extension_scheme_ = false; | 28 bool FrameNavigationState::allow_extension_scheme_ = false; |
64 | 29 |
65 FrameNavigationState::FrameNavigationState() | 30 FrameNavigationState::FrameNavigationState() |
66 : main_frame_id_(kInvalidFrameID) { | 31 : main_frame_id_(-1) { |
67 } | 32 } |
68 | 33 |
69 FrameNavigationState::~FrameNavigationState() {} | 34 FrameNavigationState::~FrameNavigationState() {} |
70 | 35 |
71 bool FrameNavigationState::CanSendEvents(FrameID frame_id) const { | 36 bool FrameNavigationState::CanSendEvents(int64 frame_id) const { |
72 FrameIdToStateMap::const_iterator frame_state = | 37 FrameIdToStateMap::const_iterator frame_state = |
73 frame_state_map_.find(frame_id); | 38 frame_state_map_.find(frame_id); |
74 if (frame_state == frame_state_map_.end() || | 39 if (frame_state == frame_state_map_.end() || |
75 frame_state->second.error_occurred) { | 40 frame_state->second.error_occurred) { |
76 return false; | 41 return false; |
77 } | 42 } |
78 return IsValidUrl(frame_state->second.url); | 43 return IsValidUrl(frame_state->second.url); |
79 } | 44 } |
80 | 45 |
81 bool FrameNavigationState::IsValidUrl(const GURL& url) const { | 46 bool FrameNavigationState::IsValidUrl(const GURL& url) const { |
82 for (unsigned i = 0; i < arraysize(kValidSchemes); ++i) { | 47 for (unsigned i = 0; i < arraysize(kValidSchemes); ++i) { |
83 if (url.scheme() == kValidSchemes[i]) | 48 if (url.scheme() == kValidSchemes[i]) |
84 return true; | 49 return true; |
85 } | 50 } |
86 // Allow about:blank. | 51 // Allow about:blank. |
87 if (url.spec() == chrome::kAboutBlankURL) | 52 if (url.spec() == chrome::kAboutBlankURL) |
88 return true; | 53 return true; |
89 if (allow_extension_scheme_ && url.scheme() == chrome::kExtensionScheme) | 54 if (allow_extension_scheme_ && url.scheme() == chrome::kExtensionScheme) |
90 return true; | 55 return true; |
91 return false; | 56 return false; |
92 } | 57 } |
93 | 58 |
94 void FrameNavigationState::TrackFrame(FrameID frame_id, | 59 void FrameNavigationState::TrackFrame(int64 frame_id, |
95 const GURL& url, | 60 const GURL& url, |
96 bool is_main_frame, | 61 bool is_main_frame, |
97 bool is_error_page) { | 62 bool is_error_page) { |
98 if (is_main_frame) { | 63 if (is_main_frame) { |
99 frame_state_map_.clear(); | 64 frame_state_map_.clear(); |
100 frame_ids_.clear(); | 65 frame_ids_.clear(); |
101 } | 66 } |
102 FrameState& frame_state = frame_state_map_[frame_id]; | 67 FrameState& frame_state = frame_state_map_[frame_id]; |
103 frame_state.error_occurred = is_error_page; | 68 frame_state.error_occurred = is_error_page; |
104 frame_state.url = url; | 69 frame_state.url = url; |
105 frame_state.is_main_frame = is_main_frame; | 70 frame_state.is_main_frame = is_main_frame; |
106 frame_state.is_navigating = true; | 71 frame_state.is_navigating = true; |
107 frame_state.is_committed = false; | 72 frame_state.is_committed = false; |
108 frame_state.is_server_redirected = false; | 73 frame_state.is_server_redirected = false; |
109 if (is_main_frame) { | 74 if (is_main_frame) { |
110 main_frame_id_ = frame_id; | 75 main_frame_id_ = frame_id; |
111 } | 76 } |
112 frame_ids_.insert(frame_id); | 77 frame_ids_.insert(frame_id); |
113 } | 78 } |
114 | 79 |
115 void FrameNavigationState::UpdateFrame(FrameID frame_id, const GURL& url) { | 80 void FrameNavigationState::UpdateFrame(int64 frame_id, const GURL& url) { |
116 FrameIdToStateMap::iterator frame_state = frame_state_map_.find(frame_id); | 81 FrameIdToStateMap::iterator frame_state = frame_state_map_.find(frame_id); |
117 if (frame_state == frame_state_map_.end()) { | 82 if (frame_state == frame_state_map_.end()) { |
118 NOTREACHED(); | 83 NOTREACHED(); |
119 return; | 84 return; |
120 } | 85 } |
121 frame_state->second.url = url; | 86 frame_state->second.url = url; |
122 } | 87 } |
123 | 88 |
124 bool FrameNavigationState::IsValidFrame(FrameID frame_id) const { | 89 bool FrameNavigationState::IsValidFrame(int64 frame_id) const { |
125 FrameIdToStateMap::const_iterator frame_state = | 90 FrameIdToStateMap::const_iterator frame_state = |
126 frame_state_map_.find(frame_id); | 91 frame_state_map_.find(frame_id); |
127 return (frame_state != frame_state_map_.end()); | 92 return (frame_state != frame_state_map_.end()); |
128 } | 93 } |
129 | 94 |
130 GURL FrameNavigationState::GetUrl(FrameID frame_id) const { | 95 GURL FrameNavigationState::GetUrl(int64 frame_id) const { |
131 FrameIdToStateMap::const_iterator frame_state = | 96 FrameIdToStateMap::const_iterator frame_state = |
132 frame_state_map_.find(frame_id); | 97 frame_state_map_.find(frame_id); |
133 if (frame_state == frame_state_map_.end()) { | 98 if (frame_state == frame_state_map_.end()) { |
134 NOTREACHED(); | 99 NOTREACHED(); |
135 return GURL(); | 100 return GURL(); |
136 } | 101 } |
137 return frame_state->second.url; | 102 return frame_state->second.url; |
138 } | 103 } |
139 | 104 |
140 bool FrameNavigationState::IsMainFrame(FrameID frame_id) const { | 105 bool FrameNavigationState::IsMainFrame(int64 frame_id) const { |
141 return main_frame_id_ != kInvalidFrameID && main_frame_id_ == frame_id; | 106 return main_frame_id_ != -1 && main_frame_id_ == frame_id; |
142 } | 107 } |
143 | 108 |
144 FrameNavigationState::FrameID FrameNavigationState::GetMainFrameID() const { | 109 int64 FrameNavigationState::GetMainFrameID() const { |
145 return main_frame_id_; | 110 return main_frame_id_; |
146 } | 111 } |
147 | 112 |
148 void FrameNavigationState::SetErrorOccurredInFrame(FrameID frame_id) { | 113 void FrameNavigationState::SetErrorOccurredInFrame(int64 frame_id) { |
149 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); | 114 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); |
150 frame_state_map_[frame_id].error_occurred = true; | 115 frame_state_map_[frame_id].error_occurred = true; |
151 } | 116 } |
152 | 117 |
153 bool FrameNavigationState::GetErrorOccurredInFrame(FrameID frame_id) const { | 118 bool FrameNavigationState::GetErrorOccurredInFrame(int64 frame_id) const { |
154 FrameIdToStateMap::const_iterator frame_state = | 119 FrameIdToStateMap::const_iterator frame_state = |
155 frame_state_map_.find(frame_id); | 120 frame_state_map_.find(frame_id); |
156 return (frame_state == frame_state_map_.end() || | 121 return (frame_state == frame_state_map_.end() || |
157 frame_state->second.error_occurred); | 122 frame_state->second.error_occurred); |
158 } | 123 } |
159 | 124 |
160 void FrameNavigationState::SetNavigationCompleted(FrameID frame_id) { | 125 void FrameNavigationState::SetNavigationCompleted(int64 frame_id) { |
161 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); | 126 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); |
162 frame_state_map_[frame_id].is_navigating = false; | 127 frame_state_map_[frame_id].is_navigating = false; |
163 } | 128 } |
164 | 129 |
165 bool FrameNavigationState::GetNavigationCompleted(FrameID frame_id) const { | 130 bool FrameNavigationState::GetNavigationCompleted(int64 frame_id) const { |
166 FrameIdToStateMap::const_iterator frame_state = | 131 FrameIdToStateMap::const_iterator frame_state = |
167 frame_state_map_.find(frame_id); | 132 frame_state_map_.find(frame_id); |
168 return (frame_state == frame_state_map_.end() || | 133 return (frame_state == frame_state_map_.end() || |
169 !frame_state->second.is_navigating); | 134 !frame_state->second.is_navigating); |
170 } | 135 } |
171 | 136 |
172 void FrameNavigationState::SetNavigationCommitted(FrameID frame_id) { | 137 void FrameNavigationState::SetNavigationCommitted(int64 frame_id) { |
173 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); | 138 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); |
174 frame_state_map_[frame_id].is_committed = true; | 139 frame_state_map_[frame_id].is_committed = true; |
175 } | 140 } |
176 | 141 |
177 bool FrameNavigationState::GetNavigationCommitted(FrameID frame_id) const { | 142 bool FrameNavigationState::GetNavigationCommitted(int64 frame_id) const { |
178 FrameIdToStateMap::const_iterator frame_state = | 143 FrameIdToStateMap::const_iterator frame_state = |
179 frame_state_map_.find(frame_id); | 144 frame_state_map_.find(frame_id); |
180 return (frame_state != frame_state_map_.end() && | 145 return (frame_state != frame_state_map_.end() && |
181 frame_state->second.is_committed); | 146 frame_state->second.is_committed); |
182 } | 147 } |
183 | 148 |
184 void FrameNavigationState::SetIsServerRedirected(FrameID frame_id) { | 149 void FrameNavigationState::SetIsServerRedirected(int64 frame_id) { |
185 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); | 150 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); |
186 frame_state_map_[frame_id].is_server_redirected = true; | 151 frame_state_map_[frame_id].is_server_redirected = true; |
187 } | 152 } |
188 | 153 |
189 bool FrameNavigationState::GetIsServerRedirected(FrameID frame_id) const { | 154 bool FrameNavigationState::GetIsServerRedirected(int64 frame_id) const { |
190 FrameIdToStateMap::const_iterator frame_state = | 155 FrameIdToStateMap::const_iterator frame_state = |
191 frame_state_map_.find(frame_id); | 156 frame_state_map_.find(frame_id); |
192 return (frame_state != frame_state_map_.end() && | 157 return (frame_state != frame_state_map_.end() && |
193 frame_state->second.is_server_redirected); | 158 frame_state->second.is_server_redirected); |
194 } | 159 } |
195 | 160 |
196 } // namespace extensions | 161 } // namespace extensions |
OLD | NEW |