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 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
175 // http://crbug.com/109464. | 175 // http://crbug.com/109464. |
176 DCHECK(chrome::GetViewType(details->source_web_contents) != | 176 DCHECK(chrome::GetViewType(details->source_web_contents) != |
177 chrome::VIEW_TYPE_TAB_CONTENTS); | 177 chrome::VIEW_TYPE_TAB_CONTENTS); |
178 return; | 178 return; |
179 } | 179 } |
180 const FrameNavigationState& frame_navigation_state = | 180 const FrameNavigationState& frame_navigation_state = |
181 tab_observer->frame_navigation_state(); | 181 tab_observer->frame_navigation_state(); |
182 | 182 |
183 FrameNavigationState::FrameID frame_id( | 183 FrameNavigationState::FrameID frame_id( |
184 details->source_frame_id, | 184 details->source_frame_id, |
185 details->source_web_contents->GetRenderViewHost()->GetProcess()->GetID()); | 185 details->source_web_contents->GetRenderViewHost()); |
186 if (!frame_navigation_state.CanSendEvents(frame_id)) | 186 if (!frame_navigation_state.CanSendEvents(frame_id)) |
187 return; | 187 return; |
188 | 188 |
189 // If the WebContents was created as a response to an IPC from a renderer | 189 // If the WebContents was created as a response to an IPC from a renderer |
190 // (and therefore doesn't yet have a TabContents), or if it isn't yet inserted | 190 // (and therefore doesn't yet have a TabContents), or if it isn't yet inserted |
191 // into a tab strip, we need to delay the extension event until the | 191 // into a tab strip, we need to delay the extension event until the |
192 // WebContents is fully initialized. | 192 // WebContents is fully initialized. |
193 if (TabContents::FromWebContents(details->target_web_contents) == NULL || | 193 if (TabContents::FromWebContents(details->target_web_contents) == NULL || |
194 details->not_yet_in_tabstrip) { | 194 details->not_yet_in_tabstrip) { |
195 pending_web_contents_[details->target_web_contents] = | 195 pending_web_contents_[details->target_web_contents] = |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
241 | 241 |
242 WebNavigationTabObserver::WebNavigationTabObserver( | 242 WebNavigationTabObserver::WebNavigationTabObserver( |
243 content::WebContents* web_contents) | 243 content::WebContents* web_contents) |
244 : WebContentsObserver(web_contents), | 244 : WebContentsObserver(web_contents), |
245 render_view_host_(NULL), | 245 render_view_host_(NULL), |
246 pending_render_view_host_(NULL) { | 246 pending_render_view_host_(NULL) { |
247 g_tab_observer.Get().insert(TabObserverMap::value_type(web_contents, this)); | 247 g_tab_observer.Get().insert(TabObserverMap::value_type(web_contents, this)); |
248 registrar_.Add(this, | 248 registrar_.Add(this, |
249 content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, | 249 content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, |
250 content::Source<content::WebContents>(web_contents)); | 250 content::Source<content::WebContents>(web_contents)); |
251 registrar_.Add(this, | |
252 content::NOTIFICATION_RENDER_VIEW_HOST_DELETED, | |
253 content::NotificationService::AllSources()); | |
251 } | 254 } |
252 | 255 |
253 WebNavigationTabObserver::~WebNavigationTabObserver() {} | 256 WebNavigationTabObserver::~WebNavigationTabObserver() {} |
254 | 257 |
255 // static | 258 // static |
256 WebNavigationTabObserver* WebNavigationTabObserver::Get( | 259 WebNavigationTabObserver* WebNavigationTabObserver::Get( |
257 content::WebContents* web_contents) { | 260 content::WebContents* web_contents) { |
258 TabObserverMap::iterator i = g_tab_observer.Get().find(web_contents); | 261 TabObserverMap::iterator i = g_tab_observer.Get().find(web_contents); |
259 return i == g_tab_observer.Get().end() ? NULL : i->second; | 262 return i == g_tab_observer.Get().end() ? NULL : i->second; |
260 } | 263 } |
261 | 264 |
265 content::RenderViewHost* WebNavigationTabObserver::GetRenderViewHostInProcess( | |
266 int process_id) const { | |
267 if (render_view_host_ && | |
268 render_view_host_->GetProcess()->GetID() == process_id) { | |
269 return render_view_host_; | |
270 } | |
271 if (pending_render_view_host_ && | |
272 pending_render_view_host_->GetProcess()->GetID() == process_id) { | |
273 return pending_render_view_host_; | |
274 } | |
275 return NULL; | |
276 } | |
277 | |
262 void WebNavigationTabObserver::Observe( | 278 void WebNavigationTabObserver::Observe( |
263 int type, | 279 int type, |
264 const content::NotificationSource& source, | 280 const content::NotificationSource& source, |
265 const content::NotificationDetails& details) { | 281 const content::NotificationDetails& details) { |
266 switch (type) { | 282 switch (type) { |
267 case content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT: { | 283 case content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT: { |
268 content::ResourceRedirectDetails* resource_redirect_details = | 284 content::ResourceRedirectDetails* resource_redirect_details = |
269 content::Details<content::ResourceRedirectDetails>(details).ptr(); | 285 content::Details<content::ResourceRedirectDetails>(details).ptr(); |
270 ResourceType::Type resource_type = | 286 ResourceType::Type resource_type = |
271 resource_redirect_details->resource_type; | 287 resource_redirect_details->resource_type; |
272 if (resource_type == ResourceType::MAIN_FRAME || | 288 if (resource_type == ResourceType::MAIN_FRAME || |
273 resource_type == ResourceType::SUB_FRAME) { | 289 resource_type == ResourceType::SUB_FRAME) { |
290 content::RenderViewHost* render_view_host = NULL; | |
291 if (render_view_host_ && | |
292 resource_redirect_details->origin_child_id == | |
293 render_view_host_->GetProcess()->GetID()) { | |
294 render_view_host = render_view_host_; | |
295 } else if (pending_render_view_host_ && | |
296 resource_redirect_details->origin_child_id == | |
297 pending_render_view_host_->GetProcess()->GetID()) { | |
298 render_view_host = pending_render_view_host_; | |
299 } | |
300 if (!render_view_host) | |
301 return; | |
274 FrameNavigationState::FrameID frame_id( | 302 FrameNavigationState::FrameID frame_id( |
275 resource_redirect_details->frame_id, | 303 resource_redirect_details->frame_id, render_view_host); |
276 resource_redirect_details->origin_child_id); | |
277 if (!navigation_state_.CanSendEvents(frame_id)) | 304 if (!navigation_state_.CanSendEvents(frame_id)) |
278 return; | 305 return; |
279 navigation_state_.SetIsServerRedirected(frame_id); | 306 navigation_state_.SetIsServerRedirected(frame_id); |
280 } | 307 } |
281 break; | 308 break; |
282 } | 309 } |
283 | 310 |
311 case content::NOTIFICATION_RENDER_VIEW_HOST_DELETED: { | |
312 content::RenderViewHost* render_view_host = | |
313 content::Source<content::RenderViewHost>(source).ptr(); | |
314 if (render_view_host == render_view_host_) | |
315 render_view_host_ = NULL; | |
316 else if (render_view_host == pending_render_view_host_) | |
317 pending_render_view_host_ = NULL; | |
318 else | |
319 return; | |
320 SendErrorEvents(web_contents(), render_view_host); | |
Matt Perry
2012/07/31 09:58:10
Technically this is dangerous. This notification i
jochen (gone - plz use gerrit)
2012/07/31 10:12:33
I agree that it's a bit borderline :-/
| |
321 break; | |
322 } | |
323 | |
284 default: | 324 default: |
285 NOTREACHED(); | 325 NOTREACHED(); |
286 } | 326 } |
287 } | 327 } |
288 | 328 |
289 void WebNavigationTabObserver::AboutToNavigateRenderView( | 329 void WebNavigationTabObserver::AboutToNavigateRenderView( |
290 content::RenderViewHost* render_view_host) { | 330 content::RenderViewHost* render_view_host) { |
291 if (!render_view_host_) { | 331 if (!render_view_host_) { |
292 render_view_host_ = render_view_host; | 332 render_view_host_ = render_view_host; |
293 } else if (render_view_host != render_view_host_) { | 333 } else if (render_view_host != render_view_host_) { |
294 // TODO(jochen): If pending_render_view_host_ is non-NULL, send error events | 334 if (pending_render_view_host_) |
295 // for all ongoing navigations in that RVH. | 335 SendErrorEvents(web_contents(), pending_render_view_host_); |
296 pending_render_view_host_ = render_view_host; | 336 pending_render_view_host_ = render_view_host; |
297 } | 337 } |
298 } | 338 } |
299 | 339 |
300 void WebNavigationTabObserver::DidStartProvisionalLoadForFrame( | 340 void WebNavigationTabObserver::DidStartProvisionalLoadForFrame( |
301 int64 frame_num, | 341 int64 frame_num, |
302 bool is_main_frame, | 342 bool is_main_frame, |
303 const GURL& validated_url, | 343 const GURL& validated_url, |
304 bool is_error_page, | 344 bool is_error_page, |
305 content::RenderViewHost* render_view_host) { | 345 content::RenderViewHost* render_view_host) { |
306 if (!render_view_host_) | 346 if (!render_view_host_) |
307 render_view_host_ = render_view_host; | 347 render_view_host_ = render_view_host; |
308 if (render_view_host != render_view_host_ && | 348 if (render_view_host != render_view_host_ && |
309 render_view_host != pending_render_view_host_) | 349 render_view_host != pending_render_view_host_) |
310 return; | 350 return; |
311 | 351 |
312 FrameNavigationState::FrameID frame_id( | 352 FrameNavigationState::FrameID frame_id(frame_num, render_view_host); |
313 frame_num, render_view_host->GetProcess()->GetID()); | |
314 | 353 |
315 navigation_state_.TrackFrame(frame_id, | 354 navigation_state_.TrackFrame(frame_id, |
316 validated_url, | 355 validated_url, |
317 is_main_frame, | 356 is_main_frame, |
318 is_error_page); | 357 is_error_page); |
319 if (!navigation_state_.CanSendEvents(frame_id)) | 358 if (!navigation_state_.CanSendEvents(frame_id)) |
320 return; | 359 return; |
321 | 360 |
322 helpers::DispatchOnBeforeNavigate( | 361 helpers::DispatchOnBeforeNavigate( |
323 web_contents(), render_view_host->GetProcess()->GetID(), frame_num, | 362 web_contents(), render_view_host->GetProcess()->GetID(), frame_num, |
324 is_main_frame, validated_url); | 363 is_main_frame, validated_url); |
325 } | 364 } |
326 | 365 |
327 void WebNavigationTabObserver::DidCommitProvisionalLoadForFrame( | 366 void WebNavigationTabObserver::DidCommitProvisionalLoadForFrame( |
328 int64 frame_num, | 367 int64 frame_num, |
329 bool is_main_frame, | 368 bool is_main_frame, |
330 const GURL& url, | 369 const GURL& url, |
331 content::PageTransition transition_type, | 370 content::PageTransition transition_type, |
332 content::RenderViewHost* render_view_host) { | 371 content::RenderViewHost* render_view_host) { |
333 if (render_view_host != render_view_host_ && | 372 if (render_view_host != render_view_host_ && |
334 render_view_host != pending_render_view_host_) | 373 render_view_host != pending_render_view_host_) |
335 return; | 374 return; |
336 // TODO(jochen): If we switched the RVH, send error events for all ongoing | 375 if (render_view_host != render_view_host_) |
337 // navigations in the old RVH. | 376 SendErrorEvents(web_contents(), render_view_host_); |
338 render_view_host_ = render_view_host; | 377 render_view_host_ = render_view_host; |
339 pending_render_view_host_ = NULL; | 378 pending_render_view_host_ = NULL; |
340 | 379 |
341 FrameNavigationState::FrameID frame_id( | 380 FrameNavigationState::FrameID frame_id(frame_num, render_view_host); |
342 frame_num, render_view_host->GetProcess()->GetID()); | |
343 if (!navigation_state_.CanSendEvents(frame_id)) | 381 if (!navigation_state_.CanSendEvents(frame_id)) |
344 return; | 382 return; |
345 | 383 |
346 bool is_reference_fragment_navigation = | 384 bool is_reference_fragment_navigation = |
347 IsReferenceFragmentNavigation(frame_id, url); | 385 IsReferenceFragmentNavigation(frame_id, url); |
348 bool is_history_navigation = | 386 bool is_history_navigation = |
349 navigation_state_.GetNavigationCommitted(frame_id); | 387 navigation_state_.GetNavigationCommitted(frame_id); |
350 | 388 |
351 // Update the URL as it might have changed. | 389 // Update the URL as it might have changed. |
352 navigation_state_.UpdateFrame(frame_id, url); | 390 navigation_state_.UpdateFrame(frame_id, url); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
391 void WebNavigationTabObserver::DidFailProvisionalLoad( | 429 void WebNavigationTabObserver::DidFailProvisionalLoad( |
392 int64 frame_num, | 430 int64 frame_num, |
393 bool is_main_frame, | 431 bool is_main_frame, |
394 const GURL& validated_url, | 432 const GURL& validated_url, |
395 int error_code, | 433 int error_code, |
396 const string16& error_description, | 434 const string16& error_description, |
397 content::RenderViewHost* render_view_host) { | 435 content::RenderViewHost* render_view_host) { |
398 if (render_view_host != render_view_host_ && | 436 if (render_view_host != render_view_host_ && |
399 render_view_host != pending_render_view_host_) | 437 render_view_host != pending_render_view_host_) |
400 return; | 438 return; |
401 if (render_view_host == pending_render_view_host_) | 439 bool stop_tracking_frames = false; |
440 if (render_view_host == pending_render_view_host_) { | |
402 pending_render_view_host_ = NULL; | 441 pending_render_view_host_ = NULL; |
442 stop_tracking_frames = true; | |
443 } | |
403 | 444 |
404 FrameNavigationState::FrameID frame_id( | 445 FrameNavigationState::FrameID frame_id(frame_num, render_view_host); |
405 frame_num, render_view_host->GetProcess()->GetID()); | 446 if (navigation_state_.CanSendEvents(frame_id)) { |
406 if (!navigation_state_.CanSendEvents(frame_id)) | 447 navigation_state_.SetErrorOccurredInFrame(frame_id); |
407 return; | 448 helpers::DispatchOnErrorOccurred( |
408 | 449 web_contents(), render_view_host->GetProcess()->GetID(), validated_url, |
409 navigation_state_.SetErrorOccurredInFrame(frame_id); | 450 frame_num, is_main_frame, error_code); |
410 helpers::DispatchOnErrorOccurred( | 451 } |
411 web_contents(), render_view_host->GetProcess()->GetID(), validated_url, | 452 if (stop_tracking_frames) |
412 frame_num, is_main_frame, error_code); | 453 navigation_state_.StopTrackingFramesInRVH(render_view_host); |
413 } | 454 } |
414 | 455 |
415 void WebNavigationTabObserver::DocumentLoadedInFrame( | 456 void WebNavigationTabObserver::DocumentLoadedInFrame( |
416 int64 frame_num, | 457 int64 frame_num, |
417 content::RenderViewHost* render_view_host) { | 458 content::RenderViewHost* render_view_host) { |
418 if (render_view_host != render_view_host_) | 459 if (render_view_host != render_view_host_) |
419 return; | 460 return; |
420 FrameNavigationState::FrameID frame_id( | 461 FrameNavigationState::FrameID frame_id(frame_num, render_view_host); |
421 frame_num, render_view_host->GetProcess()->GetID()); | |
422 if (!navigation_state_.CanSendEvents(frame_id)) | 462 if (!navigation_state_.CanSendEvents(frame_id)) |
423 return; | 463 return; |
424 helpers::DispatchOnDOMContentLoaded(web_contents(), | 464 helpers::DispatchOnDOMContentLoaded(web_contents(), |
425 navigation_state_.GetUrl(frame_id), | 465 navigation_state_.GetUrl(frame_id), |
426 navigation_state_.IsMainFrame(frame_id), | 466 navigation_state_.IsMainFrame(frame_id), |
427 frame_num); | 467 frame_num); |
428 } | 468 } |
429 | 469 |
430 void WebNavigationTabObserver::DidFinishLoad( | 470 void WebNavigationTabObserver::DidFinishLoad( |
431 int64 frame_num, | 471 int64 frame_num, |
432 const GURL& validated_url, | 472 const GURL& validated_url, |
433 bool is_main_frame, | 473 bool is_main_frame, |
434 content::RenderViewHost* render_view_host) { | 474 content::RenderViewHost* render_view_host) { |
435 if (render_view_host != render_view_host_) | 475 if (render_view_host != render_view_host_) |
436 return; | 476 return; |
437 FrameNavigationState::FrameID frame_id( | 477 FrameNavigationState::FrameID frame_id(frame_num, render_view_host); |
438 frame_num, render_view_host->GetProcess()->GetID()); | |
439 if (!navigation_state_.CanSendEvents(frame_id)) | 478 if (!navigation_state_.CanSendEvents(frame_id)) |
440 return; | 479 return; |
441 navigation_state_.SetNavigationCompleted(frame_id); | 480 navigation_state_.SetNavigationCompleted(frame_id); |
442 DCHECK_EQ(navigation_state_.GetUrl(frame_id), validated_url); | 481 DCHECK_EQ(navigation_state_.GetUrl(frame_id), validated_url); |
443 DCHECK_EQ(navigation_state_.IsMainFrame(frame_id), is_main_frame); | 482 DCHECK_EQ(navigation_state_.IsMainFrame(frame_id), is_main_frame); |
444 helpers::DispatchOnCompleted(web_contents(), | 483 helpers::DispatchOnCompleted(web_contents(), |
445 validated_url, | 484 validated_url, |
446 is_main_frame, | 485 is_main_frame, |
447 frame_num); | 486 frame_num); |
448 } | 487 } |
449 | 488 |
450 void WebNavigationTabObserver::DidFailLoad( | 489 void WebNavigationTabObserver::DidFailLoad( |
451 int64 frame_num, | 490 int64 frame_num, |
452 const GURL& validated_url, | 491 const GURL& validated_url, |
453 bool is_main_frame, | 492 bool is_main_frame, |
454 int error_code, | 493 int error_code, |
455 const string16& error_description, | 494 const string16& error_description, |
456 content::RenderViewHost* render_view_host) { | 495 content::RenderViewHost* render_view_host) { |
457 if (render_view_host != render_view_host_) | 496 if (render_view_host != render_view_host_) |
458 return; | 497 return; |
459 FrameNavigationState::FrameID frame_id( | 498 FrameNavigationState::FrameID frame_id(frame_num, render_view_host); |
460 frame_num, render_view_host->GetProcess()->GetID()); | |
461 if (!navigation_state_.CanSendEvents(frame_id)) | 499 if (!navigation_state_.CanSendEvents(frame_id)) |
462 return; | 500 return; |
463 navigation_state_.SetErrorOccurredInFrame(frame_id); | 501 navigation_state_.SetErrorOccurredInFrame(frame_id); |
464 helpers::DispatchOnErrorOccurred( | 502 helpers::DispatchOnErrorOccurred( |
465 web_contents(), render_view_host->GetProcess()->GetID(), validated_url, | 503 web_contents(), render_view_host->GetProcess()->GetID(), validated_url, |
466 frame_num, is_main_frame, error_code); | 504 frame_num, is_main_frame, error_code); |
467 } | 505 } |
468 | 506 |
469 void WebNavigationTabObserver::DidOpenRequestedURL( | 507 void WebNavigationTabObserver::DidOpenRequestedURL( |
470 content::WebContents* new_contents, | 508 content::WebContents* new_contents, |
471 const GURL& url, | 509 const GURL& url, |
472 const content::Referrer& referrer, | 510 const content::Referrer& referrer, |
473 WindowOpenDisposition disposition, | 511 WindowOpenDisposition disposition, |
474 content::PageTransition transition, | 512 content::PageTransition transition, |
475 int64 source_frame_num) { | 513 int64 source_frame_num) { |
476 FrameNavigationState::FrameID frame_id( | 514 FrameNavigationState::FrameID frame_id(source_frame_num, render_view_host_); |
477 source_frame_num, render_view_host_->GetProcess()->GetID()); | |
478 if (!navigation_state_.CanSendEvents(frame_id)) | 515 if (!navigation_state_.CanSendEvents(frame_id)) |
479 return; | 516 return; |
480 | 517 |
481 // We only send the onCreatedNavigationTarget if we end up creating a new | 518 // We only send the onCreatedNavigationTarget if we end up creating a new |
482 // window. | 519 // window. |
483 if (disposition != SINGLETON_TAB && | 520 if (disposition != SINGLETON_TAB && |
484 disposition != NEW_FOREGROUND_TAB && | 521 disposition != NEW_FOREGROUND_TAB && |
485 disposition != NEW_BACKGROUND_TAB && | 522 disposition != NEW_BACKGROUND_TAB && |
486 disposition != NEW_POPUP && | 523 disposition != NEW_POPUP && |
487 disposition != NEW_WINDOW && | 524 disposition != NEW_WINDOW && |
488 disposition != OFF_THE_RECORD) | 525 disposition != OFF_THE_RECORD) |
489 return; | 526 return; |
490 | 527 |
491 helpers::DispatchOnCreatedNavigationTarget( | 528 helpers::DispatchOnCreatedNavigationTarget( |
492 web_contents(), | 529 web_contents(), |
493 new_contents->GetBrowserContext(), | 530 new_contents->GetBrowserContext(), |
494 source_frame_num, | 531 source_frame_num, |
495 navigation_state_.IsMainFrame(frame_id), | 532 navigation_state_.IsMainFrame(frame_id), |
496 new_contents, | 533 new_contents, |
497 url); | 534 url); |
498 } | 535 } |
499 | 536 |
500 void WebNavigationTabObserver::WebContentsDestroyed(content::WebContents* tab) { | 537 void WebNavigationTabObserver::WebContentsDestroyed(content::WebContents* tab) { |
501 g_tab_observer.Get().erase(tab); | 538 g_tab_observer.Get().erase(tab); |
539 registrar_.RemoveAll(); | |
540 SendErrorEvents(tab, NULL); | |
541 } | |
542 | |
543 void WebNavigationTabObserver::SendErrorEvents( | |
544 content::WebContents* web_contents, | |
545 content::RenderViewHost* render_view_host) { | |
502 for (FrameNavigationState::const_iterator frame = navigation_state_.begin(); | 546 for (FrameNavigationState::const_iterator frame = navigation_state_.begin(); |
503 frame != navigation_state_.end(); ++frame) { | 547 frame != navigation_state_.end(); ++frame) { |
504 if (!navigation_state_.GetNavigationCompleted(*frame) && | 548 if (!navigation_state_.GetNavigationCompleted(*frame) && |
505 navigation_state_.CanSendEvents(*frame)) { | 549 navigation_state_.CanSendEvents(*frame) && |
550 (!render_view_host || frame->render_view_host == render_view_host)) { | |
506 helpers::DispatchOnErrorOccurred( | 551 helpers::DispatchOnErrorOccurred( |
507 tab, | 552 web_contents, |
508 frame->render_process_id, | 553 frame->render_view_host->GetProcess()->GetID(), |
509 navigation_state_.GetUrl(*frame), | 554 navigation_state_.GetUrl(*frame), |
510 frame->frame_num, | 555 frame->frame_num, |
511 navigation_state_.IsMainFrame(*frame), | 556 navigation_state_.IsMainFrame(*frame), |
512 net::ERR_ABORTED); | 557 net::ERR_ABORTED); |
513 } | 558 } |
514 } | 559 } |
560 if (render_view_host) | |
561 navigation_state_.StopTrackingFramesInRVH(render_view_host); | |
515 } | 562 } |
516 | 563 |
517 // See also NavigationController::IsURLInPageNavigation. | 564 // See also NavigationController::IsURLInPageNavigation. |
518 bool WebNavigationTabObserver::IsReferenceFragmentNavigation( | 565 bool WebNavigationTabObserver::IsReferenceFragmentNavigation( |
519 FrameNavigationState::FrameID frame_id, | 566 FrameNavigationState::FrameID frame_id, |
520 const GURL& url) { | 567 const GURL& url) { |
521 GURL existing_url = navigation_state_.GetUrl(frame_id); | 568 GURL existing_url = navigation_state_.GetUrl(frame_id); |
522 if (existing_url == url) | 569 if (existing_url == url) |
523 return false; | 570 return false; |
524 | 571 |
(...skipping 27 matching lines...) Expand all Loading... | |
552 WebNavigationTabObserver* observer = | 599 WebNavigationTabObserver* observer = |
553 WebNavigationTabObserver::Get(web_contents); | 600 WebNavigationTabObserver::Get(web_contents); |
554 DCHECK(observer); | 601 DCHECK(observer); |
555 | 602 |
556 const FrameNavigationState& frame_navigation_state = | 603 const FrameNavigationState& frame_navigation_state = |
557 observer->frame_navigation_state(); | 604 observer->frame_navigation_state(); |
558 | 605 |
559 if (frame_id == 0) | 606 if (frame_id == 0) |
560 frame_id = frame_navigation_state.GetMainFrameID().frame_num; | 607 frame_id = frame_navigation_state.GetMainFrameID().frame_num; |
561 | 608 |
562 FrameNavigationState::FrameID internal_frame_id(frame_id, process_id); | 609 content::RenderViewHost* render_view_host = |
610 observer->GetRenderViewHostInProcess(process_id); | |
611 if (!render_view_host) | |
612 return true; | |
613 | |
614 FrameNavigationState::FrameID internal_frame_id(frame_id, render_view_host); | |
563 if (!frame_navigation_state.IsValidFrame(internal_frame_id)) | 615 if (!frame_navigation_state.IsValidFrame(internal_frame_id)) |
564 return true; | 616 return true; |
565 | 617 |
566 GURL frame_url = frame_navigation_state.GetUrl(internal_frame_id); | 618 GURL frame_url = frame_navigation_state.GetUrl(internal_frame_id); |
567 if (!frame_navigation_state.IsValidUrl(frame_url)) | 619 if (!frame_navigation_state.IsValidUrl(frame_url)) |
568 return true; | 620 return true; |
569 | 621 |
570 GetFrame::Results::Details frame_details; | 622 GetFrame::Results::Details frame_details; |
571 frame_details.url = frame_url.spec(); | 623 frame_details.url = frame_url.spec(); |
572 frame_details.error_occurred = | 624 frame_details.error_occurred = |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
606 it != navigation_state.end(); ++it) { | 658 it != navigation_state.end(); ++it) { |
607 FrameNavigationState::FrameID frame_id = *it; | 659 FrameNavigationState::FrameID frame_id = *it; |
608 GURL frame_url = navigation_state.GetUrl(frame_id); | 660 GURL frame_url = navigation_state.GetUrl(frame_id); |
609 if (!navigation_state.IsValidUrl(frame_url)) | 661 if (!navigation_state.IsValidUrl(frame_url)) |
610 continue; | 662 continue; |
611 linked_ptr<GetAllFrames::Results::DetailsElement> frame( | 663 linked_ptr<GetAllFrames::Results::DetailsElement> frame( |
612 new GetAllFrames::Results::DetailsElement()); | 664 new GetAllFrames::Results::DetailsElement()); |
613 frame->url = frame_url.spec(); | 665 frame->url = frame_url.spec(); |
614 frame->frame_id = helpers::GetFrameId( | 666 frame->frame_id = helpers::GetFrameId( |
615 navigation_state.IsMainFrame(frame_id), frame_id.frame_num); | 667 navigation_state.IsMainFrame(frame_id), frame_id.frame_num); |
616 frame->process_id = frame_id.render_process_id; | 668 frame->process_id = frame_id.render_view_host->GetProcess()->GetID(); |
617 frame->error_occurred = navigation_state.GetErrorOccurredInFrame(frame_id); | 669 frame->error_occurred = navigation_state.GetErrorOccurredInFrame(frame_id); |
618 result_list.push_back(frame); | 670 result_list.push_back(frame); |
619 } | 671 } |
620 results_ = GetAllFrames::Results::Create(result_list); | 672 results_ = GetAllFrames::Results::Create(result_list); |
621 return true; | 673 return true; |
622 } | 674 } |
623 | 675 |
624 } // namespace extensions | 676 } // namespace extensions |
OLD | NEW |