Chromium Code Reviews| 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 |