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(long long 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(long long 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( |
60 TabContentsToFrameIdMap::value_type(tab_contents, frame_id)); | 61 TabContentsToFrameIdMap::value_type(tab_contents, frame_id)); |
brettw
2010/11/23 22:44:09
Optional: I might have used std::make_pair(tab_con
jochen (gone - plz use gerrit)
2010/11/24 07:37:37
Done.
| |
61 FrameState& frame_state = frame_state_map_[frame_id]; | 62 FrameState& frame_state = frame_state_map_[frame_id]; |
62 frame_state.error_occurred = (url.spec() == chrome::kUnreachableWebDataURL); | 63 frame_state.error_occurred = (url.spec() == chrome::kUnreachableWebDataURL); |
63 frame_state.url = url; | 64 frame_state.url = url; |
64 frame_state.is_main_frame = is_main_frame; | 65 frame_state.is_main_frame = is_main_frame; |
65 } | 66 } |
66 | 67 |
67 GURL FrameNavigationState::GetUrl(long long frame_id) const { | 68 GURL FrameNavigationState::GetUrl(long long frame_id) const { |
68 FrameIdToStateMap::const_iterator frame_state = | 69 FrameIdToStateMap::const_iterator frame_state = |
69 frame_state_map_.find(frame_id); | 70 frame_state_map_.find(frame_id); |
70 if (frame_state == frame_state_map_.end()) { | 71 if (frame_state == frame_state_map_.end()) { |
(...skipping 15 matching lines...) Expand all Loading... | |
86 | 87 |
87 void FrameNavigationState::ErrorOccurredInFrame(long long frame_id) { | 88 void FrameNavigationState::ErrorOccurredInFrame(long long frame_id) { |
88 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); | 89 DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end()); |
89 frame_state_map_[frame_id].error_occurred = true; | 90 frame_state_map_[frame_id].error_occurred = true; |
90 } | 91 } |
91 | 92 |
92 void FrameNavigationState::RemoveTabContentsState( | 93 void FrameNavigationState::RemoveTabContentsState( |
93 const TabContents* tab_contents) { | 94 const TabContents* tab_contents) { |
94 typedef TabContentsToFrameIdMap::iterator FrameIdIterator; | 95 typedef TabContentsToFrameIdMap::iterator FrameIdIterator; |
95 std::pair<FrameIdIterator, FrameIdIterator> frame_ids = | 96 std::pair<FrameIdIterator, FrameIdIterator> frame_ids = |
96 tab_contents_map_.equal_range(tab_contents); | 97 tab_contents_map_.equal_range(tab_contents); |
brettw
2010/11/23 22:44:09
This only needs to be indented 4 spaces.
jochen (gone - plz use gerrit)
2010/11/24 07:37:37
Done.
| |
97 for (FrameIdIterator frame_id = frame_ids.first; frame_id != frame_ids.second; | 98 for (FrameIdIterator frame_id = frame_ids.first; frame_id != frame_ids.second; |
98 ++frame_id) { | 99 ++frame_id) { |
99 frame_state_map_.erase(frame_id->second); | 100 frame_state_map_.erase(frame_id->second); |
100 } | 101 } |
101 tab_contents_map_.erase(tab_contents); | 102 tab_contents_map_.erase(tab_contents); |
102 } | 103 } |
103 | 104 |
104 | 105 |
105 // static | 106 // static |
106 ExtensionWebNavigationEventRouter* | 107 ExtensionWebNavigationEventRouter* |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
155 FrameDidFinishLoad( | 156 FrameDidFinishLoad( |
156 Source<NavigationController>(source).ptr(), | 157 Source<NavigationController>(source).ptr(), |
157 *Details<long long>(details).ptr()); | 158 *Details<long long>(details).ptr()); |
158 break; | 159 break; |
159 case NotificationType::FAIL_PROVISIONAL_LOAD_WITH_ERROR: | 160 case NotificationType::FAIL_PROVISIONAL_LOAD_WITH_ERROR: |
160 FailProvisionalLoadWithError( | 161 FailProvisionalLoadWithError( |
161 Source<NavigationController>(source).ptr(), | 162 Source<NavigationController>(source).ptr(), |
162 Details<ProvisionalLoadDetails>(details).ptr()); | 163 Details<ProvisionalLoadDetails>(details).ptr()); |
163 break; | 164 break; |
164 | 165 |
165 case NotificationType::TAB_CONTENTS_DESTROYED: | 166 case NotificationType::TAB_CONTENTS_DESTROYED: |
brettw
2010/11/23 22:44:09
Can you be consistent about whether there's a blan
jochen (gone - plz use gerrit)
2010/11/24 07:37:37
Done.
| |
166 navigation_state_.RemoveTabContentsState( | 167 navigation_state_.RemoveTabContentsState( |
167 Source<TabContents>(source).ptr()); | 168 Source<TabContents>(source).ptr()); |
168 break; | 169 break; |
169 | 170 |
170 default: | 171 default: |
171 NOTREACHED(); | 172 NOTREACHED(); |
172 } | 173 } |
173 } | 174 } |
174 void ExtensionWebNavigationEventRouter::FrameProvisionalLoadStart( | 175 void ExtensionWebNavigationEventRouter::FrameProvisionalLoadStart( |
175 NavigationController* controller, | 176 NavigationController* controller, |
176 ProvisionalLoadDetails* details) { | 177 ProvisionalLoadDetails* details) { |
177 navigation_state_.TrackFrame(details->frame_id(), | 178 navigation_state_.TrackFrame(details->frame_id(), |
178 details->url(), | 179 details->url(), |
179 details->main_frame(), | 180 details->main_frame(), |
180 controller->tab_contents()); | 181 controller->tab_contents()); |
181 if (!navigation_state_.CanSendEvents(details->frame_id())) | 182 if (!navigation_state_.CanSendEvents(details->frame_id())) |
182 return; | 183 return; |
183 ListValue args; | 184 ListValue args; |
184 DictionaryValue* dict = new DictionaryValue(); | 185 DictionaryValue* dict = new DictionaryValue(); |
185 dict->SetInteger(keys::kTabIdKey, | 186 dict->SetInteger(keys::kTabIdKey, |
186 ExtensionTabUtil::GetTabId(controller->tab_contents())); | 187 ExtensionTabUtil::GetTabId(controller->tab_contents())); |
187 dict->SetString(keys::kUrlKey, | 188 dict->SetString(keys::kUrlKey, |
brettw
2010/11/23 22:44:09
This can fit on one line (same below when you set
jochen (gone - plz use gerrit)
2010/11/24 07:37:37
Done.
| |
188 details->url().spec()); | 189 details->url().spec()); |
189 dict->SetInteger(keys::kFrameIdKey, GetFrameId(details)); | 190 dict->SetInteger(keys::kFrameIdKey, GetFrameId(details)); |
190 dict->SetInteger(keys::kRequestIdKey, 0); | 191 dict->SetInteger(keys::kRequestIdKey, 0); |
191 dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); | 192 dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); |
192 args.Append(dict); | 193 args.Append(dict); |
193 | 194 |
194 std::string json_args; | 195 std::string json_args; |
195 base::JSONWriter::Write(&args, false, &json_args); | 196 base::JSONWriter::Write(&args, false, &json_args); |
196 DispatchEvent(controller->profile(), keys::kOnBeforeNavigate, json_args); | 197 DispatchEvent(controller->profile(), keys::kOnBeforeNavigate, json_args); |
197 } | 198 } |
(...skipping 26 matching lines...) Expand all Loading... | |
224 | 225 |
225 void ExtensionWebNavigationEventRouter::FrameDomContentLoaded( | 226 void ExtensionWebNavigationEventRouter::FrameDomContentLoaded( |
226 NavigationController* controller, long long frame_id) { | 227 NavigationController* controller, long long frame_id) { |
227 if (!navigation_state_.CanSendEvents(frame_id)) | 228 if (!navigation_state_.CanSendEvents(frame_id)) |
228 return; | 229 return; |
229 ListValue args; | 230 ListValue args; |
230 DictionaryValue* dict = new DictionaryValue(); | 231 DictionaryValue* dict = new DictionaryValue(); |
231 dict->SetInteger(keys::kTabIdKey, | 232 dict->SetInteger(keys::kTabIdKey, |
232 ExtensionTabUtil::GetTabId(controller->tab_contents())); | 233 ExtensionTabUtil::GetTabId(controller->tab_contents())); |
233 dict->SetString(keys::kUrlKey, navigation_state_.GetUrl(frame_id).spec()); | 234 dict->SetString(keys::kUrlKey, navigation_state_.GetUrl(frame_id).spec()); |
234 dict->SetInteger(keys::kFrameIdKey, navigation_state_.IsMainFrame(frame_id) ? | 235 dict->SetInteger(keys::kFrameIdKey, navigation_state_.IsMainFrame(frame_id) ? |
brettw
2010/11/23 22:44:09
I always try to format the ternary operators as cl
jochen (gone - plz use gerrit)
2010/11/24 07:37:37
Done.
| |
235 0 : static_cast<int>(frame_id)); | 236 0 : static_cast<int>(frame_id)); |
236 dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); | 237 dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); |
237 args.Append(dict); | 238 args.Append(dict); |
238 | 239 |
239 std::string json_args; | 240 std::string json_args; |
240 base::JSONWriter::Write(&args, false, &json_args); | 241 base::JSONWriter::Write(&args, false, &json_args); |
241 DispatchEvent(controller->profile(), keys::kOnDOMContentLoaded, json_args); | 242 DispatchEvent(controller->profile(), keys::kOnDOMContentLoaded, json_args); |
242 } | 243 } |
243 | 244 |
244 void ExtensionWebNavigationEventRouter::FrameDidFinishLoad( | 245 void ExtensionWebNavigationEventRouter::FrameDidFinishLoad( |
245 NavigationController* controller, long long frame_id) { | 246 NavigationController* controller, long long frame_id) { |
brettw
2010/11/23 22:44:09
the frame_id should probably be on the next line l
jochen (gone - plz use gerrit)
2010/11/24 07:37:37
Done.
| |
246 if (!navigation_state_.CanSendEvents(frame_id)) | 247 if (!navigation_state_.CanSendEvents(frame_id)) |
247 return; | 248 return; |
248 ListValue args; | 249 ListValue args; |
249 DictionaryValue* dict = new DictionaryValue(); | 250 DictionaryValue* dict = new DictionaryValue(); |
250 dict->SetInteger(keys::kTabIdKey, | 251 dict->SetInteger(keys::kTabIdKey, |
251 ExtensionTabUtil::GetTabId(controller->tab_contents())); | 252 ExtensionTabUtil::GetTabId(controller->tab_contents())); |
252 dict->SetString(keys::kUrlKey, navigation_state_.GetUrl(frame_id).spec()); | 253 dict->SetString(keys::kUrlKey, navigation_state_.GetUrl(frame_id).spec()); |
253 dict->SetInteger(keys::kFrameIdKey, navigation_state_.IsMainFrame(frame_id) ? | 254 dict->SetInteger(keys::kFrameIdKey, navigation_state_.IsMainFrame(frame_id) ? |
brettw
2010/11/23 22:44:09
Sane ternary formatting suggestion.
jochen (gone - plz use gerrit)
2010/11/24 07:37:37
Done.
| |
254 0 : static_cast<int>(frame_id)); | 255 0 : static_cast<int>(frame_id)); |
255 dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); | 256 dict->SetReal(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); |
256 args.Append(dict); | 257 args.Append(dict); |
257 | 258 |
258 std::string json_args; | 259 std::string json_args; |
259 base::JSONWriter::Write(&args, false, &json_args); | 260 base::JSONWriter::Write(&args, false, &json_args); |
260 DispatchEvent(controller->profile(), keys::kOnCompleted, json_args); | 261 DispatchEvent(controller->profile(), keys::kOnCompleted, json_args); |
261 } | 262 } |
262 | 263 |
263 void ExtensionWebNavigationEventRouter::FailProvisionalLoadWithError( | 264 void ExtensionWebNavigationEventRouter::FailProvisionalLoadWithError( |
(...skipping 21 matching lines...) Expand all Loading... | |
285 | 286 |
286 void ExtensionWebNavigationEventRouter::DispatchEvent( | 287 void ExtensionWebNavigationEventRouter::DispatchEvent( |
287 Profile* profile, | 288 Profile* profile, |
288 const char* event_name, | 289 const char* event_name, |
289 const std::string& json_args) { | 290 const std::string& json_args) { |
290 if (profile && profile->GetExtensionEventRouter()) { | 291 if (profile && profile->GetExtensionEventRouter()) { |
291 profile->GetExtensionEventRouter()->DispatchEventToRenderers( | 292 profile->GetExtensionEventRouter()->DispatchEventToRenderers( |
292 event_name, json_args, profile, GURL()); | 293 event_name, json_args, profile, GURL()); |
293 } | 294 } |
294 } | 295 } |
OLD | NEW |