| 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 |