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 // Implements the Chrome Extensions WebNavigation API. | 5 // Implements the Chrome Extensions WebNavigation API. |
6 | 6 |
7 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h" | 7 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h" |
8 | 8 |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api_consta
nts.h" | 10 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api_consta
nts.h" |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 if (!tab_observer) { | 172 if (!tab_observer) { |
173 // If you hit this DCHECK(), please add reproduction steps to | 173 // If you hit this DCHECK(), please add reproduction steps to |
174 // http://crbug.com/109464. | 174 // http://crbug.com/109464. |
175 DCHECK(chrome::GetViewType(details->source_web_contents) != | 175 DCHECK(chrome::GetViewType(details->source_web_contents) != |
176 chrome::VIEW_TYPE_TAB_CONTENTS); | 176 chrome::VIEW_TYPE_TAB_CONTENTS); |
177 return; | 177 return; |
178 } | 178 } |
179 const FrameNavigationState& frame_navigation_state = | 179 const FrameNavigationState& frame_navigation_state = |
180 tab_observer->frame_navigation_state(); | 180 tab_observer->frame_navigation_state(); |
181 | 181 |
182 if (!frame_navigation_state.CanSendEvents(details->source_frame_id)) | 182 FrameNavigationState::FrameID frame_id( |
| 183 details->source_frame_id, |
| 184 details->source_web_contents->GetRenderViewHost()->GetProcess()->GetID()); |
| 185 if (!frame_navigation_state.CanSendEvents(frame_id)) |
183 return; | 186 return; |
184 | 187 |
185 // If the WebContents was created as a response to an IPC from a renderer | 188 // If the WebContents was created as a response to an IPC from a renderer |
186 // (and therefore doesn't yet have a TabContents), or if it isn't yet inserted | 189 // (and therefore doesn't yet have a TabContents), or if it isn't yet inserted |
187 // into a tab strip, we need to delay the extension event until the | 190 // into a tab strip, we need to delay the extension event until the |
188 // WebContents is fully initialized. | 191 // WebContents is fully initialized. |
189 if (TabContents::FromWebContents(details->target_web_contents) == NULL || | 192 if (TabContents::FromWebContents(details->target_web_contents) == NULL || |
190 details->not_yet_in_tabstrip) { | 193 details->not_yet_in_tabstrip) { |
191 pending_web_contents_[details->target_web_contents] = | 194 pending_web_contents_[details->target_web_contents] = |
192 PendingWebContents( | 195 PendingWebContents( |
193 details->source_web_contents, | 196 details->source_web_contents, |
194 details->source_frame_id, | 197 details->source_frame_id, |
195 frame_navigation_state.IsMainFrame(details->source_frame_id), | 198 frame_navigation_state.IsMainFrame(frame_id), |
196 details->target_web_contents, | 199 details->target_web_contents, |
197 details->target_url); | 200 details->target_url); |
198 } else { | 201 } else { |
199 helpers::DispatchOnCreatedNavigationTarget( | 202 helpers::DispatchOnCreatedNavigationTarget( |
200 details->source_web_contents, | 203 details->source_web_contents, |
201 details->target_web_contents->GetBrowserContext(), | 204 details->target_web_contents->GetBrowserContext(), |
202 details->source_frame_id, | 205 details->source_frame_id, |
203 frame_navigation_state.IsMainFrame(details->source_frame_id), | 206 frame_navigation_state.IsMainFrame(frame_id), |
204 details->target_web_contents, | 207 details->target_web_contents, |
205 details->target_url); | 208 details->target_url); |
206 } | 209 } |
207 } | 210 } |
208 | 211 |
209 void WebNavigationEventRouter::TabAdded(content::WebContents* tab) { | 212 void WebNavigationEventRouter::TabAdded(content::WebContents* tab) { |
210 std::map<content::WebContents*, PendingWebContents>::iterator iter = | 213 std::map<content::WebContents*, PendingWebContents>::iterator iter = |
211 pending_web_contents_.find(tab); | 214 pending_web_contents_.find(tab); |
212 if (iter == pending_web_contents_.end()) | 215 if (iter == pending_web_contents_.end()) |
213 return; | 216 return; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 const content::NotificationSource& source, | 263 const content::NotificationSource& source, |
261 const content::NotificationDetails& details) { | 264 const content::NotificationDetails& details) { |
262 switch (type) { | 265 switch (type) { |
263 case content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT: { | 266 case content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT: { |
264 content::ResourceRedirectDetails* resource_redirect_details = | 267 content::ResourceRedirectDetails* resource_redirect_details = |
265 content::Details<content::ResourceRedirectDetails>(details).ptr(); | 268 content::Details<content::ResourceRedirectDetails>(details).ptr(); |
266 ResourceType::Type resource_type = | 269 ResourceType::Type resource_type = |
267 resource_redirect_details->resource_type; | 270 resource_redirect_details->resource_type; |
268 if (resource_type == ResourceType::MAIN_FRAME || | 271 if (resource_type == ResourceType::MAIN_FRAME || |
269 resource_type == ResourceType::SUB_FRAME) { | 272 resource_type == ResourceType::SUB_FRAME) { |
270 int64 frame_id = resource_redirect_details->frame_id; | 273 FrameNavigationState::FrameID frame_id( |
| 274 resource_redirect_details->frame_id, |
| 275 resource_redirect_details->origin_child_id); |
271 if (!navigation_state_.CanSendEvents(frame_id)) | 276 if (!navigation_state_.CanSendEvents(frame_id)) |
272 return; | 277 return; |
273 navigation_state_.SetIsServerRedirected(frame_id); | 278 navigation_state_.SetIsServerRedirected(frame_id); |
274 } | 279 } |
275 break; | 280 break; |
276 } | 281 } |
277 | 282 |
278 default: | 283 default: |
279 NOTREACHED(); | 284 NOTREACHED(); |
280 } | 285 } |
281 } | 286 } |
282 | 287 |
283 void WebNavigationTabObserver::AboutToNavigateRenderView( | 288 void WebNavigationTabObserver::AboutToNavigateRenderView( |
284 content::RenderViewHost* render_view_host) { | 289 content::RenderViewHost* render_view_host) { |
285 if (!render_view_host_) { | 290 if (!render_view_host_) { |
286 render_view_host_ = render_view_host; | 291 render_view_host_ = render_view_host; |
287 } else if (render_view_host != render_view_host_) { | 292 } else if (render_view_host != render_view_host_) { |
288 // TODO(jochen): If pending_render_view_host_ is non-NULL, send error events | 293 // TODO(jochen): If pending_render_view_host_ is non-NULL, send error events |
289 // for all ongoing navigations in that RVH. | 294 // for all ongoing navigations in that RVH. |
290 pending_render_view_host_ = render_view_host; | 295 pending_render_view_host_ = render_view_host; |
291 } | 296 } |
292 } | 297 } |
293 | 298 |
294 void WebNavigationTabObserver::DidStartProvisionalLoadForFrame( | 299 void WebNavigationTabObserver::DidStartProvisionalLoadForFrame( |
295 int64 frame_id, | 300 int64 frame_num, |
296 bool is_main_frame, | 301 bool is_main_frame, |
297 const GURL& validated_url, | 302 const GURL& validated_url, |
298 bool is_error_page, | 303 bool is_error_page, |
299 content::RenderViewHost* render_view_host) { | 304 content::RenderViewHost* render_view_host) { |
300 if (!render_view_host_) | 305 if (!render_view_host_) |
301 render_view_host_ = render_view_host; | 306 render_view_host_ = render_view_host; |
302 if (render_view_host != render_view_host_ && | 307 if (render_view_host != render_view_host_ && |
303 render_view_host != pending_render_view_host_) | 308 render_view_host != pending_render_view_host_) |
304 return; | 309 return; |
305 | 310 |
| 311 FrameNavigationState::FrameID frame_id( |
| 312 frame_num, render_view_host->GetProcess()->GetID()); |
| 313 |
306 navigation_state_.TrackFrame(frame_id, | 314 navigation_state_.TrackFrame(frame_id, |
307 validated_url, | 315 validated_url, |
308 is_main_frame, | 316 is_main_frame, |
309 is_error_page); | 317 is_error_page); |
310 if (!navigation_state_.CanSendEvents(frame_id)) | 318 if (!navigation_state_.CanSendEvents(frame_id)) |
311 return; | 319 return; |
312 | 320 |
313 helpers::DispatchOnBeforeNavigate( | 321 helpers::DispatchOnBeforeNavigate( |
314 web_contents(), render_view_host->GetProcess()->GetID(), frame_id, | 322 web_contents(), render_view_host->GetProcess()->GetID(), frame_num, |
315 is_main_frame, validated_url); | 323 is_main_frame, validated_url); |
316 } | 324 } |
317 | 325 |
318 void WebNavigationTabObserver::DidCommitProvisionalLoadForFrame( | 326 void WebNavigationTabObserver::DidCommitProvisionalLoadForFrame( |
319 int64 frame_id, | 327 int64 frame_num, |
320 bool is_main_frame, | 328 bool is_main_frame, |
321 const GURL& url, | 329 const GURL& url, |
322 content::PageTransition transition_type, | 330 content::PageTransition transition_type, |
323 content::RenderViewHost* render_view_host) { | 331 content::RenderViewHost* render_view_host) { |
324 if (render_view_host != render_view_host_ && | 332 if (render_view_host != render_view_host_ && |
325 render_view_host != pending_render_view_host_) | 333 render_view_host != pending_render_view_host_) |
326 return; | 334 return; |
327 // TODO(jochen): If we switched the RVH, send error events for all ongoing | 335 // TODO(jochen): If we switched the RVH, send error events for all ongoing |
328 // navigations in the old RVH. | 336 // navigations in the old RVH. |
329 render_view_host_ = render_view_host; | 337 render_view_host_ = render_view_host; |
330 pending_render_view_host_ = NULL; | 338 pending_render_view_host_ = NULL; |
331 | 339 |
| 340 FrameNavigationState::FrameID frame_id( |
| 341 frame_num, render_view_host->GetProcess()->GetID()); |
332 if (!navigation_state_.CanSendEvents(frame_id)) | 342 if (!navigation_state_.CanSendEvents(frame_id)) |
333 return; | 343 return; |
334 | 344 |
335 bool is_reference_fragment_navigation = | 345 bool is_reference_fragment_navigation = |
336 IsReferenceFragmentNavigation(frame_id, url); | 346 IsReferenceFragmentNavigation(frame_id, url); |
337 bool is_history_navigation = | 347 bool is_history_navigation = |
338 navigation_state_.GetNavigationCommitted(frame_id); | 348 navigation_state_.GetNavigationCommitted(frame_id); |
339 | 349 |
340 // Update the URL as it might have changed. | 350 // Update the URL as it might have changed. |
341 navigation_state_.UpdateFrame(frame_id, url); | 351 navigation_state_.UpdateFrame(frame_id, url); |
342 navigation_state_.SetNavigationCommitted(frame_id); | 352 navigation_state_.SetNavigationCommitted(frame_id); |
343 | 353 |
344 if (is_reference_fragment_navigation) { | 354 if (is_reference_fragment_navigation) { |
345 helpers::DispatchOnCommitted( | 355 helpers::DispatchOnCommitted( |
346 keys::kOnReferenceFragmentUpdated, | 356 keys::kOnReferenceFragmentUpdated, |
347 web_contents(), | 357 web_contents(), |
348 frame_id, | 358 frame_num, |
349 is_main_frame, | 359 is_main_frame, |
350 url, | 360 url, |
351 transition_type); | 361 transition_type); |
352 navigation_state_.SetNavigationCompleted(frame_id); | 362 navigation_state_.SetNavigationCompleted(frame_id); |
353 } else if (is_history_navigation) { | 363 } else if (is_history_navigation) { |
354 // Make the transition type match the one for reference fragment updates. | 364 // Make the transition type match the one for reference fragment updates. |
355 transition_type = static_cast<content::PageTransition>( | 365 transition_type = static_cast<content::PageTransition>( |
356 transition_type | content::PAGE_TRANSITION_CLIENT_REDIRECT); | 366 transition_type | content::PAGE_TRANSITION_CLIENT_REDIRECT); |
357 helpers::DispatchOnCommitted( | 367 helpers::DispatchOnCommitted( |
358 keys::kOnHistoryStateUpdated, | 368 keys::kOnHistoryStateUpdated, |
359 web_contents(), | 369 web_contents(), |
360 frame_id, | 370 frame_num, |
361 is_main_frame, | 371 is_main_frame, |
362 url, | 372 url, |
363 transition_type); | 373 transition_type); |
364 navigation_state_.SetNavigationCompleted(frame_id); | 374 navigation_state_.SetNavigationCompleted(frame_id); |
365 } else { | 375 } else { |
366 if (navigation_state_.GetIsServerRedirected(frame_id)) { | 376 if (navigation_state_.GetIsServerRedirected(frame_id)) { |
367 transition_type = static_cast<content::PageTransition>( | 377 transition_type = static_cast<content::PageTransition>( |
368 transition_type | content::PAGE_TRANSITION_SERVER_REDIRECT); | 378 transition_type | content::PAGE_TRANSITION_SERVER_REDIRECT); |
369 } | 379 } |
370 helpers::DispatchOnCommitted( | 380 helpers::DispatchOnCommitted( |
371 keys::kOnCommitted, | 381 keys::kOnCommitted, |
372 web_contents(), | 382 web_contents(), |
373 frame_id, | 383 frame_num, |
374 is_main_frame, | 384 is_main_frame, |
375 url, | 385 url, |
376 transition_type); | 386 transition_type); |
377 } | 387 } |
378 } | 388 } |
379 | 389 |
380 void WebNavigationTabObserver::DidFailProvisionalLoad( | 390 void WebNavigationTabObserver::DidFailProvisionalLoad( |
381 int64 frame_id, | 391 int64 frame_num, |
382 bool is_main_frame, | 392 bool is_main_frame, |
383 const GURL& validated_url, | 393 const GURL& validated_url, |
384 int error_code, | 394 int error_code, |
385 const string16& error_description, | 395 const string16& error_description, |
386 content::RenderViewHost* render_view_host) { | 396 content::RenderViewHost* render_view_host) { |
387 if (render_view_host != render_view_host_ && | 397 if (render_view_host != render_view_host_ && |
388 render_view_host != pending_render_view_host_) | 398 render_view_host != pending_render_view_host_) |
389 return; | 399 return; |
390 if (render_view_host == pending_render_view_host_) | 400 if (render_view_host == pending_render_view_host_) |
391 pending_render_view_host_ = NULL; | 401 pending_render_view_host_ = NULL; |
392 | 402 |
| 403 FrameNavigationState::FrameID frame_id( |
| 404 frame_num, render_view_host->GetProcess()->GetID()); |
393 if (!navigation_state_.CanSendEvents(frame_id)) | 405 if (!navigation_state_.CanSendEvents(frame_id)) |
394 return; | 406 return; |
395 | 407 |
396 navigation_state_.SetErrorOccurredInFrame(frame_id); | 408 navigation_state_.SetErrorOccurredInFrame(frame_id); |
397 helpers::DispatchOnErrorOccurred( | 409 helpers::DispatchOnErrorOccurred( |
398 web_contents(), render_view_host->GetProcess()->GetID(), validated_url, | 410 web_contents(), render_view_host->GetProcess()->GetID(), validated_url, |
399 frame_id, is_main_frame, error_code); | 411 frame_num, is_main_frame, error_code); |
400 } | 412 } |
401 | 413 |
402 void WebNavigationTabObserver::DocumentLoadedInFrame( | 414 void WebNavigationTabObserver::DocumentLoadedInFrame( |
403 int64 frame_id, | 415 int64 frame_num, |
404 content::RenderViewHost* render_view_host) { | 416 content::RenderViewHost* render_view_host) { |
405 if (render_view_host != render_view_host_) | 417 if (render_view_host != render_view_host_) |
406 return; | 418 return; |
| 419 FrameNavigationState::FrameID frame_id( |
| 420 frame_num, render_view_host->GetProcess()->GetID()); |
407 if (!navigation_state_.CanSendEvents(frame_id)) | 421 if (!navigation_state_.CanSendEvents(frame_id)) |
408 return; | 422 return; |
409 helpers::DispatchOnDOMContentLoaded(web_contents(), | 423 helpers::DispatchOnDOMContentLoaded(web_contents(), |
410 navigation_state_.GetUrl(frame_id), | 424 navigation_state_.GetUrl(frame_id), |
411 navigation_state_.IsMainFrame(frame_id), | 425 navigation_state_.IsMainFrame(frame_id), |
412 frame_id); | 426 frame_num); |
413 } | 427 } |
414 | 428 |
415 void WebNavigationTabObserver::DidFinishLoad( | 429 void WebNavigationTabObserver::DidFinishLoad( |
416 int64 frame_id, | 430 int64 frame_num, |
417 const GURL& validated_url, | 431 const GURL& validated_url, |
418 bool is_main_frame, | 432 bool is_main_frame, |
419 content::RenderViewHost* render_view_host) { | 433 content::RenderViewHost* render_view_host) { |
420 if (render_view_host != render_view_host_) | 434 if (render_view_host != render_view_host_) |
421 return; | 435 return; |
| 436 FrameNavigationState::FrameID frame_id( |
| 437 frame_num, render_view_host->GetProcess()->GetID()); |
422 if (!navigation_state_.CanSendEvents(frame_id)) | 438 if (!navigation_state_.CanSendEvents(frame_id)) |
423 return; | 439 return; |
424 navigation_state_.SetNavigationCompleted(frame_id); | 440 navigation_state_.SetNavigationCompleted(frame_id); |
425 DCHECK_EQ(navigation_state_.GetUrl(frame_id), validated_url); | 441 DCHECK_EQ(navigation_state_.GetUrl(frame_id), validated_url); |
426 DCHECK_EQ(navigation_state_.IsMainFrame(frame_id), is_main_frame); | 442 DCHECK_EQ(navigation_state_.IsMainFrame(frame_id), is_main_frame); |
427 helpers::DispatchOnCompleted(web_contents(), | 443 helpers::DispatchOnCompleted(web_contents(), |
428 validated_url, | 444 validated_url, |
429 is_main_frame, | 445 is_main_frame, |
430 frame_id); | 446 frame_num); |
431 } | 447 } |
432 | 448 |
433 void WebNavigationTabObserver::DidFailLoad( | 449 void WebNavigationTabObserver::DidFailLoad( |
434 int64 frame_id, | 450 int64 frame_num, |
435 const GURL& validated_url, | 451 const GURL& validated_url, |
436 bool is_main_frame, | 452 bool is_main_frame, |
437 int error_code, | 453 int error_code, |
438 const string16& error_description, | 454 const string16& error_description, |
439 content::RenderViewHost* render_view_host) { | 455 content::RenderViewHost* render_view_host) { |
440 if (render_view_host != render_view_host_) | 456 if (render_view_host != render_view_host_) |
441 return; | 457 return; |
| 458 FrameNavigationState::FrameID frame_id( |
| 459 frame_num, render_view_host->GetProcess()->GetID()); |
442 if (!navigation_state_.CanSendEvents(frame_id)) | 460 if (!navigation_state_.CanSendEvents(frame_id)) |
443 return; | 461 return; |
444 navigation_state_.SetErrorOccurredInFrame(frame_id); | 462 navigation_state_.SetErrorOccurredInFrame(frame_id); |
445 helpers::DispatchOnErrorOccurred( | 463 helpers::DispatchOnErrorOccurred( |
446 web_contents(), render_view_host->GetProcess()->GetID(), validated_url, | 464 web_contents(), render_view_host->GetProcess()->GetID(), validated_url, |
447 frame_id, is_main_frame, error_code); | 465 frame_num, is_main_frame, error_code); |
448 } | 466 } |
449 | 467 |
450 void WebNavigationTabObserver::DidOpenRequestedURL( | 468 void WebNavigationTabObserver::DidOpenRequestedURL( |
451 content::WebContents* new_contents, | 469 content::WebContents* new_contents, |
452 const GURL& url, | 470 const GURL& url, |
453 const content::Referrer& referrer, | 471 const content::Referrer& referrer, |
454 WindowOpenDisposition disposition, | 472 WindowOpenDisposition disposition, |
455 content::PageTransition transition, | 473 content::PageTransition transition, |
456 int64 source_frame_id) { | 474 int64 source_frame_num) { |
457 if (!navigation_state_.CanSendEvents(source_frame_id)) | 475 FrameNavigationState::FrameID frame_id( |
| 476 source_frame_num, render_view_host_->GetProcess()->GetID()); |
| 477 if (!navigation_state_.CanSendEvents(frame_id)) |
458 return; | 478 return; |
459 | 479 |
460 // We only send the onCreatedNavigationTarget if we end up creating a new | 480 // We only send the onCreatedNavigationTarget if we end up creating a new |
461 // window. | 481 // window. |
462 if (disposition != SINGLETON_TAB && | 482 if (disposition != SINGLETON_TAB && |
463 disposition != NEW_FOREGROUND_TAB && | 483 disposition != NEW_FOREGROUND_TAB && |
464 disposition != NEW_BACKGROUND_TAB && | 484 disposition != NEW_BACKGROUND_TAB && |
465 disposition != NEW_POPUP && | 485 disposition != NEW_POPUP && |
466 disposition != NEW_WINDOW && | 486 disposition != NEW_WINDOW && |
467 disposition != OFF_THE_RECORD) | 487 disposition != OFF_THE_RECORD) |
468 return; | 488 return; |
469 | 489 |
470 helpers::DispatchOnCreatedNavigationTarget( | 490 helpers::DispatchOnCreatedNavigationTarget( |
471 web_contents(), | 491 web_contents(), |
472 new_contents->GetBrowserContext(), | 492 new_contents->GetBrowserContext(), |
473 source_frame_id, | 493 source_frame_num, |
474 navigation_state_.IsMainFrame(source_frame_id), | 494 navigation_state_.IsMainFrame(frame_id), |
475 new_contents, | 495 new_contents, |
476 url); | 496 url); |
477 } | 497 } |
478 | 498 |
479 void WebNavigationTabObserver::WebContentsDestroyed(content::WebContents* tab) { | 499 void WebNavigationTabObserver::WebContentsDestroyed(content::WebContents* tab) { |
480 g_tab_observer.Get().erase(tab); | 500 g_tab_observer.Get().erase(tab); |
481 for (FrameNavigationState::const_iterator frame = navigation_state_.begin(); | 501 for (FrameNavigationState::const_iterator frame = navigation_state_.begin(); |
482 frame != navigation_state_.end(); ++frame) { | 502 frame != navigation_state_.end(); ++frame) { |
483 if (!navigation_state_.GetNavigationCompleted(*frame) && | 503 if (!navigation_state_.GetNavigationCompleted(*frame) && |
484 navigation_state_.CanSendEvents(*frame)) { | 504 navigation_state_.CanSendEvents(*frame)) { |
485 helpers::DispatchOnErrorOccurred( | 505 helpers::DispatchOnErrorOccurred( |
486 tab, | 506 tab, |
487 tab->GetRenderViewHost()->GetProcess()->GetID(), | 507 frame->render_process_id, |
488 navigation_state_.GetUrl(*frame), | 508 navigation_state_.GetUrl(*frame), |
489 *frame, | 509 frame->frame_num, |
490 navigation_state_.IsMainFrame(*frame), | 510 navigation_state_.IsMainFrame(*frame), |
491 net::ERR_ABORTED); | 511 net::ERR_ABORTED); |
492 } | 512 } |
493 } | 513 } |
494 } | 514 } |
495 | 515 |
496 // See also NavigationController::IsURLInPageNavigation. | 516 // See also NavigationController::IsURLInPageNavigation. |
497 bool WebNavigationTabObserver::IsReferenceFragmentNavigation( | 517 bool WebNavigationTabObserver::IsReferenceFragmentNavigation( |
498 int64 frame_id, | 518 FrameNavigationState::FrameID frame_id, |
499 const GURL& url) { | 519 const GURL& url) { |
500 GURL existing_url = navigation_state_.GetUrl(frame_id); | 520 GURL existing_url = navigation_state_.GetUrl(frame_id); |
501 if (existing_url == url) | 521 if (existing_url == url) |
502 return false; | 522 return false; |
503 | 523 |
504 url_canon::Replacements<char> replacements; | 524 url_canon::Replacements<char> replacements; |
505 replacements.ClearRef(); | 525 replacements.ClearRef(); |
506 return existing_url.ReplaceComponents(replacements) == | 526 return existing_url.ReplaceComponents(replacements) == |
507 url.ReplaceComponents(replacements); | 527 url.ReplaceComponents(replacements); |
508 } | 528 } |
509 | 529 |
510 bool GetFrameFunction::RunImpl() { | 530 bool GetFrameFunction::RunImpl() { |
511 scoped_ptr<GetFrame::Params> params(GetFrame::Params::Create(*args_)); | 531 scoped_ptr<GetFrame::Params> params(GetFrame::Params::Create(*args_)); |
512 EXTENSION_FUNCTION_VALIDATE(params.get()); | 532 EXTENSION_FUNCTION_VALIDATE(params.get()); |
513 int tab_id = params->details.tab_id; | 533 int tab_id = params->details.tab_id; |
514 int frame_id = params->details.frame_id; | 534 int frame_id = params->details.frame_id; |
| 535 int process_id = params->details.process_id; |
515 | 536 |
516 SetResult(Value::CreateNullValue()); | 537 SetResult(Value::CreateNullValue()); |
517 | 538 |
518 TabContents* tab_contents; | 539 TabContents* tab_contents; |
519 if (!ExtensionTabUtil::GetTabById(tab_id, | 540 if (!ExtensionTabUtil::GetTabById(tab_id, |
520 profile(), | 541 profile(), |
521 include_incognito(), | 542 include_incognito(), |
522 NULL, NULL, | 543 NULL, NULL, |
523 &tab_contents, | 544 &tab_contents, |
524 NULL) || | 545 NULL) || |
525 !tab_contents) { | 546 !tab_contents) { |
526 return true; | 547 return true; |
527 } | 548 } |
528 | 549 |
529 content::WebContents* web_contents = tab_contents->web_contents(); | 550 content::WebContents* web_contents = tab_contents->web_contents(); |
530 WebNavigationTabObserver* observer = | 551 WebNavigationTabObserver* observer = |
531 WebNavigationTabObserver::Get(web_contents); | 552 WebNavigationTabObserver::Get(web_contents); |
532 DCHECK(observer); | 553 DCHECK(observer); |
533 | 554 |
534 const FrameNavigationState& frame_navigation_state = | 555 const FrameNavigationState& frame_navigation_state = |
535 observer->frame_navigation_state(); | 556 observer->frame_navigation_state(); |
536 | 557 |
537 if (frame_id == 0) | 558 if (frame_id == 0) |
538 frame_id = frame_navigation_state.GetMainFrameID(); | 559 frame_id = frame_navigation_state.GetMainFrameID().frame_num; |
539 if (!frame_navigation_state.IsValidFrame(frame_id)) | 560 |
| 561 FrameNavigationState::FrameID internal_frame_id(frame_id, process_id); |
| 562 if (!frame_navigation_state.IsValidFrame(internal_frame_id)) |
540 return true; | 563 return true; |
541 | 564 |
542 GURL frame_url = frame_navigation_state.GetUrl(frame_id); | 565 GURL frame_url = frame_navigation_state.GetUrl(internal_frame_id); |
543 if (!frame_navigation_state.IsValidUrl(frame_url)) | 566 if (!frame_navigation_state.IsValidUrl(frame_url)) |
544 return true; | 567 return true; |
545 | 568 |
546 GetFrame::Results::Details frame_details; | 569 GetFrame::Results::Details frame_details; |
547 frame_details.url = frame_url.spec(); | 570 frame_details.url = frame_url.spec(); |
548 frame_details.error_occurred = | 571 frame_details.error_occurred = |
549 frame_navigation_state.GetErrorOccurredInFrame(frame_id); | 572 frame_navigation_state.GetErrorOccurredInFrame(internal_frame_id); |
550 results_ = GetFrame::Results::Create(frame_details); | 573 results_ = GetFrame::Results::Create(frame_details); |
551 return true; | 574 return true; |
552 } | 575 } |
553 | 576 |
554 bool GetAllFramesFunction::RunImpl() { | 577 bool GetAllFramesFunction::RunImpl() { |
555 scoped_ptr<GetAllFrames::Params> params(GetAllFrames::Params::Create(*args_)); | 578 scoped_ptr<GetAllFrames::Params> params(GetAllFrames::Params::Create(*args_)); |
556 EXTENSION_FUNCTION_VALIDATE(params.get()); | 579 EXTENSION_FUNCTION_VALIDATE(params.get()); |
557 int tab_id = params->details.tab_id; | 580 int tab_id = params->details.tab_id; |
558 | 581 |
559 SetResult(Value::CreateNullValue()); | 582 SetResult(Value::CreateNullValue()); |
(...skipping 13 matching lines...) Expand all Loading... |
573 WebNavigationTabObserver* observer = | 596 WebNavigationTabObserver* observer = |
574 WebNavigationTabObserver::Get(web_contents); | 597 WebNavigationTabObserver::Get(web_contents); |
575 DCHECK(observer); | 598 DCHECK(observer); |
576 | 599 |
577 const FrameNavigationState& navigation_state = | 600 const FrameNavigationState& navigation_state = |
578 observer->frame_navigation_state(); | 601 observer->frame_navigation_state(); |
579 | 602 |
580 std::vector<linked_ptr<GetAllFrames::Results::DetailsElement> > result_list; | 603 std::vector<linked_ptr<GetAllFrames::Results::DetailsElement> > result_list; |
581 for (FrameNavigationState::const_iterator it = navigation_state.begin(); | 604 for (FrameNavigationState::const_iterator it = navigation_state.begin(); |
582 it != navigation_state.end(); ++it) { | 605 it != navigation_state.end(); ++it) { |
583 int64 frame_id = *it; | 606 FrameNavigationState::FrameID frame_id = *it; |
584 GURL frame_url = navigation_state.GetUrl(frame_id); | 607 GURL frame_url = navigation_state.GetUrl(frame_id); |
585 if (!navigation_state.IsValidUrl(frame_url)) | 608 if (!navigation_state.IsValidUrl(frame_url)) |
586 continue; | 609 continue; |
587 linked_ptr<GetAllFrames::Results::DetailsElement> frame( | 610 linked_ptr<GetAllFrames::Results::DetailsElement> frame( |
588 new GetAllFrames::Results::DetailsElement()); | 611 new GetAllFrames::Results::DetailsElement()); |
589 frame->url = frame_url.spec(); | 612 frame->url = frame_url.spec(); |
590 frame->frame_id = helpers::GetFrameId( | 613 frame->frame_id = helpers::GetFrameId( |
591 navigation_state.IsMainFrame(frame_id), frame_id); | 614 navigation_state.IsMainFrame(frame_id), frame_id.frame_num); |
| 615 frame->process_id = frame_id.render_process_id; |
592 frame->error_occurred = navigation_state.GetErrorOccurredInFrame(frame_id); | 616 frame->error_occurred = navigation_state.GetErrorOccurredInFrame(frame_id); |
593 result_list.push_back(frame); | 617 result_list.push_back(frame); |
594 } | 618 } |
595 results_ = GetAllFrames::Results::Create(result_list); | 619 results_ = GetAllFrames::Results::Create(result_list); |
596 return true; | 620 return true; |
597 } | 621 } |
598 | 622 |
599 } // namespace extensions | 623 } // namespace extensions |
OLD | NEW |