Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Side by Side Diff: chrome/browser/extensions/api/web_navigation/web_navigation_api.cc

Issue 10835033: Only delete old frames when a new main frame navigation commits (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: updates Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698