OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 // Implements the Chrome Extensions WebNavigation API. | 5 // Implements the Chrome Extensions WebNavigation API. |
6 | 6 |
7 #include "chrome/browser/extensions/extension_webnavigation_api.h" | 7 #include "chrome/browser/extensions/extension_webnavigation_api.h" |
8 | 8 |
9 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
10 #include "base/time.h" | 10 #include "base/time.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 return details->main_frame() ? 0 : static_cast<int>(details->frame_id()); | 30 return details->main_frame() ? 0 : static_cast<int>(details->frame_id()); |
31 } | 31 } |
32 | 32 |
33 // Returns |time| as milliseconds since the epoch. | 33 // Returns |time| as milliseconds since the epoch. |
34 double MilliSecondsFromTime(const base::Time& time) { | 34 double MilliSecondsFromTime(const base::Time& time) { |
35 return 1000 * time.ToDoubleT(); | 35 return 1000 * time.ToDoubleT(); |
36 } | 36 } |
37 | 37 |
38 } // namespace | 38 } // namespace |
39 | 39 |
| 40 |
40 FrameNavigationState::FrameNavigationState() { | 41 FrameNavigationState::FrameNavigationState() { |
41 } | 42 } |
42 | 43 |
43 FrameNavigationState::~FrameNavigationState() { | 44 FrameNavigationState::~FrameNavigationState() { |
44 } | 45 } |
45 | 46 |
46 bool FrameNavigationState::CanSendEvents(long long frame_id) const { | 47 bool FrameNavigationState::CanSendEvents(int64 frame_id) const { |
47 FrameIdToStateMap::const_iterator frame_state = | 48 FrameIdToStateMap::const_iterator frame_state = |
48 frame_state_map_.find(frame_id); | 49 frame_state_map_.find(frame_id); |
49 return frame_state != frame_state_map_.end() && | 50 return frame_state != frame_state_map_.end() && |
50 !frame_state->second.error_occurred; | 51 !frame_state->second.error_occurred; |
51 } | 52 } |
52 | 53 |
53 void FrameNavigationState::TrackFrame(long long frame_id, | 54 void FrameNavigationState::TrackFrame(int64 frame_id, |
54 const GURL& url, | 55 const GURL& url, |
55 bool is_main_frame, | 56 bool is_main_frame, |
56 const TabContents* tab_contents) { | 57 const TabContents* tab_contents) { |
57 if (is_main_frame) | 58 if (is_main_frame) |
58 RemoveTabContentsState(tab_contents); | 59 RemoveTabContentsState(tab_contents); |
59 tab_contents_map_.insert( | 60 tab_contents_map_.insert(std::make_pair(tab_contents, frame_id)); |
60 TabContentsToFrameIdMap::value_type(tab_contents, frame_id)); | |
61 FrameState& frame_state = frame_state_map_[frame_id]; | 61 FrameState& frame_state = frame_state_map_[frame_id]; |
62 frame_state.error_occurred = (url.spec() == chrome::kUnreachableWebDataURL); | 62 frame_state.error_occurred = (url.spec() == chrome::kUnreachableWebDataURL); |
63 frame_state.url = url; | 63 frame_state.url = url; |
64 frame_state.is_main_frame = is_main_frame; | 64 frame_state.is_main_frame = is_main_frame; |
65 } | 65 } |
66 | 66 |
67 GURL FrameNavigationState::GetUrl(long long frame_id) const { | 67 GURL FrameNavigationState::GetUrl(int64 frame_id) const { |
68 FrameIdToStateMap::const_iterator frame_state = | 68 FrameIdToStateMap::const_iterator frame_state = |
69 frame_state_map_.find(frame_id); | 69 frame_state_map_.find(frame_id); |
70 if (frame_state == frame_state_map_.end()) { | 70 if (frame_state == frame_state_map_.end()) { |
71 NOTREACHED(); | 71 NOTREACHED(); |
72 return GURL(); | 72 return GURL(); |
73 } | 73 } |
74 return frame_state->second.url; | 74 return frame_state->second.url; |
75 } | 75 } |
76 | 76 |
77 bool FrameNavigationState::IsMainFrame(long long frame_id) const { | 77 bool FrameNavigationState::IsMainFrame(int64 frame_id) const { |
78 FrameIdToStateMap::const_iterator frame_state = | 78 FrameIdToStateMap::const_iterator frame_state = |
79 frame_state_map_.find(frame_id); | 79 frame_state_map_.find(frame_id); |
80 if (frame_state == frame_state_map_.end()) { | 80 if (frame_state == frame_state_map_.end()) { |
81 NOTREACHED(); | 81 NOTREACHED(); |
82 return false; | 82 return false; |
83 } | 83 } |
84 return frame_state->second.is_main_frame; | 84 return frame_state->second.is_main_frame; |
85 } | 85 } |
86 | 86 |
87 void FrameNavigationState::ErrorOccurredInFrame(long long frame_id) { | 87 void FrameNavigationState::ErrorOccurredInFrame(int64 frame_id) { |
88 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); | 88 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); |
89 frame_state_map_[frame_id].error_occurred = true; | 89 frame_state_map_[frame_id].error_occurred = true; |
90 } | 90 } |
91 | 91 |
92 void FrameNavigationState::RemoveTabContentsState( | 92 void FrameNavigationState::RemoveTabContentsState( |
93 const TabContents* tab_contents) { | 93 const TabContents* tab_contents) { |
94 typedef TabContentsToFrameIdMap::iterator FrameIdIterator; | 94 typedef TabContentsToFrameIdMap::iterator FrameIdIterator; |
95 std::pair<FrameIdIterator, FrameIdIterator> frame_ids = | 95 std::pair<FrameIdIterator, FrameIdIterator> frame_ids = |
96 tab_contents_map_.equal_range(tab_contents); | 96 tab_contents_map_.equal_range(tab_contents); |
97 for (FrameIdIterator frame_id = frame_ids.first; frame_id != frame_ids.second; | 97 for (FrameIdIterator frame_id = frame_ids.first; frame_id != frame_ids.second; |
98 ++frame_id) { | 98 ++frame_id) { |
99 frame_state_map_.erase(frame_id->second); | 99 frame_state_map_.erase(frame_id->second); |
100 } | 100 } |
101 tab_contents_map_.erase(tab_contents); | 101 tab_contents_map_.erase(tab_contents); |
102 } | 102 } |
103 | 103 |
104 | 104 |
105 // static | 105 // static |
106 ExtensionWebNavigationEventRouter* | 106 ExtensionWebNavigationEventRouter* |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 Details<ProvisionalLoadDetails>(details).ptr()); | 142 Details<ProvisionalLoadDetails>(details).ptr()); |
143 break; | 143 break; |
144 case NotificationType::FRAME_PROVISIONAL_LOAD_COMMITTED: | 144 case NotificationType::FRAME_PROVISIONAL_LOAD_COMMITTED: |
145 FrameProvisionalLoadCommitted( | 145 FrameProvisionalLoadCommitted( |
146 Source<NavigationController>(source).ptr(), | 146 Source<NavigationController>(source).ptr(), |
147 Details<ProvisionalLoadDetails>(details).ptr()); | 147 Details<ProvisionalLoadDetails>(details).ptr()); |
148 break; | 148 break; |
149 case NotificationType::FRAME_DOM_CONTENT_LOADED: | 149 case NotificationType::FRAME_DOM_CONTENT_LOADED: |
150 FrameDomContentLoaded( | 150 FrameDomContentLoaded( |
151 Source<NavigationController>(source).ptr(), | 151 Source<NavigationController>(source).ptr(), |
152 *Details<long long>(details).ptr()); | 152 *Details<int64>(details).ptr()); |
153 break; | 153 break; |
154 case NotificationType::FRAME_DID_FINISH_LOAD: | 154 case NotificationType::FRAME_DID_FINISH_LOAD: |
155 FrameDidFinishLoad( | 155 FrameDidFinishLoad( |
156 Source<NavigationController>(source).ptr(), | 156 Source<NavigationController>(source).ptr(), |
157 *Details<long long>(details).ptr()); | 157 *Details<int64>(details).ptr()); |
158 break; | 158 break; |
159 case NotificationType::FAIL_PROVISIONAL_LOAD_WITH_ERROR: | 159 case NotificationType::FAIL_PROVISIONAL_LOAD_WITH_ERROR: |
160 FailProvisionalLoadWithError( | 160 FailProvisionalLoadWithError( |
161 Source<NavigationController>(source).ptr(), | 161 Source<NavigationController>(source).ptr(), |
162 Details<ProvisionalLoadDetails>(details).ptr()); | 162 Details<ProvisionalLoadDetails>(details).ptr()); |
163 break; | 163 break; |
164 | |
165 case NotificationType::TAB_CONTENTS_DESTROYED: | 164 case NotificationType::TAB_CONTENTS_DESTROYED: |
166 navigation_state_.RemoveTabContentsState( | 165 navigation_state_.RemoveTabContentsState( |
167 Source<TabContents>(source).ptr()); | 166 Source<TabContents>(source).ptr()); |
168 break; | 167 break; |
169 | 168 |
170 default: | 169 default: |
171 NOTREACHED(); | 170 NOTREACHED(); |
172 } | 171 } |
173 } | 172 } |
174 void ExtensionWebNavigationEventRouter::FrameProvisionalLoadStart( | 173 void ExtensionWebNavigationEventRouter::FrameProvisionalLoadStart( |
175 NavigationController* controller, | 174 NavigationController* controller, |
176 ProvisionalLoadDetails* details) { | 175 ProvisionalLoadDetails* details) { |
177 navigation_state_.TrackFrame(details->frame_id(), | 176 navigation_state_.TrackFrame(details->frame_id(), |
178 details->url(), | 177 details->url(), |
179 details->main_frame(), | 178 details->main_frame(), |
180 controller->tab_contents()); | 179 controller->tab_contents()); |
181 if (!navigation_state_.CanSendEvents(details->frame_id())) | 180 if (!navigation_state_.CanSendEvents(details->frame_id())) |
182 return; | 181 return; |
183 ListValue args; | 182 ListValue args; |
184 DictionaryValue* dict = new DictionaryValue(); | 183 DictionaryValue* dict = new DictionaryValue(); |
185 dict->SetInteger(keys::kTabIdKey, | 184 dict->SetInteger(keys::kTabIdKey, |
186 ExtensionTabUtil::GetTabId(controller->tab_contents())); | 185 ExtensionTabUtil::GetTabId(controller->tab_contents())); |
187 dict->SetString(keys::kUrlKey, | 186 dict->SetString(keys::kUrlKey, details->url().spec()); |
188 details->url().spec()); | |
189 dict->SetInteger(keys::kFrameIdKey, GetFrameId(details)); | 187 dict->SetInteger(keys::kFrameIdKey, GetFrameId(details)); |
190 dict->SetInteger(keys::kRequestIdKey, 0); | 188 dict->SetInteger(keys::kRequestIdKey, 0); |
191 dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); | 189 dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); |
192 args.Append(dict); | 190 args.Append(dict); |
193 | 191 |
194 std::string json_args; | 192 std::string json_args; |
195 base::JSONWriter::Write(&args, false, &json_args); | 193 base::JSONWriter::Write(&args, false, &json_args); |
196 DispatchEvent(controller->profile(), keys::kOnBeforeNavigate, json_args); | 194 DispatchEvent(controller->profile(), keys::kOnBeforeNavigate, json_args); |
197 } | 195 } |
198 | 196 |
199 void ExtensionWebNavigationEventRouter::FrameProvisionalLoadCommitted( | 197 void ExtensionWebNavigationEventRouter::FrameProvisionalLoadCommitted( |
200 NavigationController* controller, | 198 NavigationController* controller, |
201 ProvisionalLoadDetails* details) { | 199 ProvisionalLoadDetails* details) { |
202 if (!navigation_state_.CanSendEvents(details->frame_id())) | 200 if (!navigation_state_.CanSendEvents(details->frame_id())) |
203 return; | 201 return; |
204 ListValue args; | 202 ListValue args; |
205 DictionaryValue* dict = new DictionaryValue(); | 203 DictionaryValue* dict = new DictionaryValue(); |
206 dict->SetInteger(keys::kTabIdKey, | 204 dict->SetInteger(keys::kTabIdKey, |
207 ExtensionTabUtil::GetTabId(controller->tab_contents())); | 205 ExtensionTabUtil::GetTabId(controller->tab_contents())); |
208 dict->SetString(keys::kUrlKey, | 206 dict->SetString(keys::kUrlKey, details->url().spec()); |
209 details->url().spec()); | |
210 dict->SetInteger(keys::kFrameIdKey, GetFrameId(details)); | 207 dict->SetInteger(keys::kFrameIdKey, GetFrameId(details)); |
211 dict->SetString(keys::kTransitionTypeKey, | 208 dict->SetString(keys::kTransitionTypeKey, |
212 PageTransition::CoreTransitionString( | 209 PageTransition::CoreTransitionString( |
213 details->transition_type())); | 210 details->transition_type())); |
214 dict->SetString(keys::kTransitionQualifiersKey, | 211 dict->SetString(keys::kTransitionQualifiersKey, |
215 PageTransition::QualifierString( | 212 PageTransition::QualifierString( |
216 details->transition_type())); | 213 details->transition_type())); |
217 dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); | 214 dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); |
218 args.Append(dict); | 215 args.Append(dict); |
219 | 216 |
220 std::string json_args; | 217 std::string json_args; |
221 base::JSONWriter::Write(&args, false, &json_args); | 218 base::JSONWriter::Write(&args, false, &json_args); |
222 DispatchEvent(controller->profile(), keys::kOnCommitted, json_args); | 219 DispatchEvent(controller->profile(), keys::kOnCommitted, json_args); |
223 } | 220 } |
224 | 221 |
225 void ExtensionWebNavigationEventRouter::FrameDomContentLoaded( | 222 void ExtensionWebNavigationEventRouter::FrameDomContentLoaded( |
226 NavigationController* controller, long long frame_id) { | 223 NavigationController* controller, |
| 224 int64 frame_id) { |
227 if (!navigation_state_.CanSendEvents(frame_id)) | 225 if (!navigation_state_.CanSendEvents(frame_id)) |
228 return; | 226 return; |
229 ListValue args; | 227 ListValue args; |
230 DictionaryValue* dict = new DictionaryValue(); | 228 DictionaryValue* dict = new DictionaryValue(); |
231 dict->SetInteger(keys::kTabIdKey, | 229 dict->SetInteger(keys::kTabIdKey, |
232 ExtensionTabUtil::GetTabId(controller->tab_contents())); | 230 ExtensionTabUtil::GetTabId(controller->tab_contents())); |
233 dict->SetString(keys::kUrlKey, navigation_state_.GetUrl(frame_id).spec()); | 231 dict->SetString(keys::kUrlKey, navigation_state_.GetUrl(frame_id).spec()); |
234 dict->SetInteger(keys::kFrameIdKey, navigation_state_.IsMainFrame(frame_id) ? | 232 dict->SetInteger(keys::kFrameIdKey, |
235 0 : static_cast<int>(frame_id)); | 233 navigation_state_.IsMainFrame(frame_id) ? 0 : static_cast<int>(frame_id)); |
236 dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); | 234 dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); |
237 args.Append(dict); | 235 args.Append(dict); |
238 | 236 |
239 std::string json_args; | 237 std::string json_args; |
240 base::JSONWriter::Write(&args, false, &json_args); | 238 base::JSONWriter::Write(&args, false, &json_args); |
241 DispatchEvent(controller->profile(), keys::kOnDOMContentLoaded, json_args); | 239 DispatchEvent(controller->profile(), keys::kOnDOMContentLoaded, json_args); |
242 } | 240 } |
243 | 241 |
244 void ExtensionWebNavigationEventRouter::FrameDidFinishLoad( | 242 void ExtensionWebNavigationEventRouter::FrameDidFinishLoad( |
245 NavigationController* controller, long long frame_id) { | 243 NavigationController* controller, |
| 244 int64 frame_id) { |
246 if (!navigation_state_.CanSendEvents(frame_id)) | 245 if (!navigation_state_.CanSendEvents(frame_id)) |
247 return; | 246 return; |
248 ListValue args; | 247 ListValue args; |
249 DictionaryValue* dict = new DictionaryValue(); | 248 DictionaryValue* dict = new DictionaryValue(); |
250 dict->SetInteger(keys::kTabIdKey, | 249 dict->SetInteger(keys::kTabIdKey, |
251 ExtensionTabUtil::GetTabId(controller->tab_contents())); | 250 ExtensionTabUtil::GetTabId(controller->tab_contents())); |
252 dict->SetString(keys::kUrlKey, navigation_state_.GetUrl(frame_id).spec()); | 251 dict->SetString(keys::kUrlKey, navigation_state_.GetUrl(frame_id).spec()); |
253 dict->SetInteger(keys::kFrameIdKey, navigation_state_.IsMainFrame(frame_id) ? | 252 dict->SetInteger(keys::kFrameIdKey, |
254 0 : static_cast<int>(frame_id)); | 253 navigation_state_.IsMainFrame(frame_id) ? 0 : static_cast<int>(frame_id)); |
255 dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); | 254 dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); |
256 args.Append(dict); | 255 args.Append(dict); |
257 | 256 |
258 std::string json_args; | 257 std::string json_args; |
259 base::JSONWriter::Write(&args, false, &json_args); | 258 base::JSONWriter::Write(&args, false, &json_args); |
260 DispatchEvent(controller->profile(), keys::kOnCompleted, json_args); | 259 DispatchEvent(controller->profile(), keys::kOnCompleted, json_args); |
261 } | 260 } |
262 | 261 |
263 void ExtensionWebNavigationEventRouter::FailProvisionalLoadWithError( | 262 void ExtensionWebNavigationEventRouter::FailProvisionalLoadWithError( |
264 NavigationController* controller, | 263 NavigationController* controller, |
265 ProvisionalLoadDetails* details) { | 264 ProvisionalLoadDetails* details) { |
266 if (!navigation_state_.CanSendEvents(details->frame_id())) | 265 if (!navigation_state_.CanSendEvents(details->frame_id())) |
267 return; | 266 return; |
268 ListValue args; | 267 ListValue args; |
269 DictionaryValue* dict = new DictionaryValue(); | 268 DictionaryValue* dict = new DictionaryValue(); |
270 dict->SetInteger(keys::kTabIdKey, | 269 dict->SetInteger(keys::kTabIdKey, |
271 ExtensionTabUtil::GetTabId(controller->tab_contents())); | 270 ExtensionTabUtil::GetTabId(controller->tab_contents())); |
272 dict->SetString(keys::kUrlKey, | 271 dict->SetString(keys::kUrlKey, details->url().spec()); |
273 details->url().spec()); | |
274 dict->SetInteger(keys::kFrameIdKey, GetFrameId(details)); | 272 dict->SetInteger(keys::kFrameIdKey, GetFrameId(details)); |
275 dict->SetString(keys::kErrorKey, | 273 dict->SetString(keys::kErrorKey, |
276 std::string(net::ErrorToString(details->error_code()))); | 274 std::string(net::ErrorToString(details->error_code()))); |
277 dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); | 275 dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); |
278 args.Append(dict); | 276 args.Append(dict); |
279 | 277 |
280 std::string json_args; | 278 std::string json_args; |
281 base::JSONWriter::Write(&args, false, &json_args); | 279 base::JSONWriter::Write(&args, false, &json_args); |
282 navigation_state_.ErrorOccurredInFrame(details->frame_id()); | 280 navigation_state_.ErrorOccurredInFrame(details->frame_id()); |
283 DispatchEvent(controller->profile(), keys::kOnErrorOccurred, json_args); | 281 DispatchEvent(controller->profile(), keys::kOnErrorOccurred, json_args); |
284 } | 282 } |
285 | 283 |
286 void ExtensionWebNavigationEventRouter::DispatchEvent( | 284 void ExtensionWebNavigationEventRouter::DispatchEvent( |
287 Profile* profile, | 285 Profile* profile, |
288 const char* event_name, | 286 const char* event_name, |
289 const std::string& json_args) { | 287 const std::string& json_args) { |
290 if (profile && profile->GetExtensionEventRouter()) { | 288 if (profile && profile->GetExtensionEventRouter()) { |
291 profile->GetExtensionEventRouter()->DispatchEventToRenderers( | 289 profile->GetExtensionEventRouter()->DispatchEventToRenderers( |
292 event_name, json_args, profile, GURL()); | 290 event_name, json_args, profile, GURL()); |
293 } | 291 } |
294 } | 292 } |
OLD | NEW |