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

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

Issue 384993004: Simplify WebNavigationApi by using RenderFrameHost internally. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove troublesome DCHECKs Created 6 years, 5 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/chrome_notification_types.h" 10 #include "chrome/browser/chrome_notification_types.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 TabObserverMap; 49 TabObserverMap;
50 static base::LazyInstance<TabObserverMap> g_tab_observer = 50 static base::LazyInstance<TabObserverMap> g_tab_observer =
51 LAZY_INSTANCE_INITIALIZER; 51 LAZY_INSTANCE_INITIALIZER;
52 52
53 } // namespace 53 } // namespace
54 54
55 // WebNavigtionEventRouter ------------------------------------------- 55 // WebNavigtionEventRouter -------------------------------------------
56 56
57 WebNavigationEventRouter::PendingWebContents::PendingWebContents() 57 WebNavigationEventRouter::PendingWebContents::PendingWebContents()
58 : source_web_contents(NULL), 58 : source_web_contents(NULL),
59 source_frame_id(0), 59 source_frame_host(NULL),
60 source_frame_is_main_frame(false),
61 target_web_contents(NULL), 60 target_web_contents(NULL),
62 target_url() { 61 target_url() {
63 } 62 }
64 63
65 WebNavigationEventRouter::PendingWebContents::PendingWebContents( 64 WebNavigationEventRouter::PendingWebContents::PendingWebContents(
66 content::WebContents* source_web_contents, 65 content::WebContents* source_web_contents,
67 int64 source_frame_id, 66 content::RenderFrameHost* source_frame_host,
68 bool source_frame_is_main_frame,
69 content::WebContents* target_web_contents, 67 content::WebContents* target_web_contents,
70 const GURL& target_url) 68 const GURL& target_url)
71 : source_web_contents(source_web_contents), 69 : source_web_contents(source_web_contents),
72 source_frame_id(source_frame_id), 70 source_frame_host(source_frame_host),
73 source_frame_is_main_frame(source_frame_is_main_frame),
74 target_web_contents(target_web_contents), 71 target_web_contents(target_web_contents),
75 target_url(target_url) { 72 target_url(target_url) {
76 } 73 }
77 74
78 WebNavigationEventRouter::PendingWebContents::~PendingWebContents() {} 75 WebNavigationEventRouter::PendingWebContents::~PendingWebContents() {}
79 76
80 WebNavigationEventRouter::WebNavigationEventRouter(Profile* profile) 77 WebNavigationEventRouter::WebNavigationEventRouter(Profile* profile)
81 : profile_(profile) { 78 : profile_(profile) {
82 CHECK(registrar_.IsEmpty()); 79 CHECK(registrar_.IsEmpty());
83 registrar_.Add(this, 80 registrar_.Add(this,
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 WebNavigationTabObserver::Get(details->source_web_contents); 167 WebNavigationTabObserver::Get(details->source_web_contents);
171 if (!tab_observer) { 168 if (!tab_observer) {
172 // If you hit this DCHECK(), please add reproduction steps to 169 // If you hit this DCHECK(), please add reproduction steps to
173 // http://crbug.com/109464. 170 // http://crbug.com/109464.
174 DCHECK(GetViewType(details->source_web_contents) != VIEW_TYPE_TAB_CONTENTS); 171 DCHECK(GetViewType(details->source_web_contents) != VIEW_TYPE_TAB_CONTENTS);
175 return; 172 return;
176 } 173 }
177 const FrameNavigationState& frame_navigation_state = 174 const FrameNavigationState& frame_navigation_state =
178 tab_observer->frame_navigation_state(); 175 tab_observer->frame_navigation_state();
179 176
180 FrameNavigationState::FrameID frame_id( 177 content::RenderFrameHost* frame_host = content::RenderFrameHost::FromID(
181 details->source_render_frame_id, 178 details->source_web_contents->GetRenderProcessHost()->GetID(),
182 details->source_web_contents->GetRenderViewHost()); 179 details->source_render_frame_id);
183 if (!frame_navigation_state.CanSendEvents(frame_id)) 180 if (!frame_navigation_state.CanSendEvents(frame_host))
184 return; 181 return;
185 182
186 // If the WebContents isn't yet inserted into a tab strip, we need to delay 183 // If the WebContents isn't yet inserted into a tab strip, we need to delay
187 // the extension event until the WebContents is fully initialized. 184 // the extension event until the WebContents is fully initialized.
188 if (details->not_yet_in_tabstrip) { 185 if (details->not_yet_in_tabstrip) {
189 pending_web_contents_[details->target_web_contents] = 186 pending_web_contents_[details->target_web_contents] =
190 PendingWebContents( 187 PendingWebContents(details->source_web_contents,
191 details->source_web_contents, 188 frame_host,
192 details->source_render_frame_id, 189 details->target_web_contents,
193 frame_navigation_state.IsMainFrame(frame_id), 190 details->target_url);
194 details->target_web_contents,
195 details->target_url);
196 } else { 191 } else {
197 helpers::DispatchOnCreatedNavigationTarget( 192 helpers::DispatchOnCreatedNavigationTarget(
198 details->source_web_contents, 193 details->source_web_contents,
199 details->target_web_contents->GetBrowserContext(), 194 details->target_web_contents->GetBrowserContext(),
200 details->source_render_frame_id, 195 frame_host,
201 frame_navigation_state.IsMainFrame(frame_id),
202 details->target_web_contents, 196 details->target_web_contents,
203 details->target_url); 197 details->target_url);
204 } 198 }
205 } 199 }
206 200
207 void WebNavigationEventRouter::TabAdded(content::WebContents* tab) { 201 void WebNavigationEventRouter::TabAdded(content::WebContents* tab) {
208 std::map<content::WebContents*, PendingWebContents>::iterator iter = 202 std::map<content::WebContents*, PendingWebContents>::iterator iter =
209 pending_web_contents_.find(tab); 203 pending_web_contents_.find(tab);
210 if (iter == pending_web_contents_.end()) 204 if (iter == pending_web_contents_.end())
211 return; 205 return;
212 206
213 WebNavigationTabObserver* tab_observer = 207 WebNavigationTabObserver* tab_observer =
214 WebNavigationTabObserver::Get(iter->second.source_web_contents); 208 WebNavigationTabObserver::Get(iter->second.source_web_contents);
215 if (!tab_observer) { 209 if (!tab_observer) {
216 NOTREACHED(); 210 NOTREACHED();
217 return; 211 return;
218 } 212 }
219 const FrameNavigationState& frame_navigation_state = 213 const FrameNavigationState& frame_navigation_state =
220 tab_observer->frame_navigation_state(); 214 tab_observer->frame_navigation_state();
221 215
222 FrameNavigationState::FrameID frame_id( 216 if (frame_navigation_state.CanSendEvents(iter->second.source_frame_host)) {
223 iter->second.source_frame_id,
224 iter->second.source_web_contents->GetRenderViewHost());
225 if (frame_navigation_state.CanSendEvents(frame_id)) {
226 helpers::DispatchOnCreatedNavigationTarget( 217 helpers::DispatchOnCreatedNavigationTarget(
227 iter->second.source_web_contents, 218 iter->second.source_web_contents,
228 iter->second.target_web_contents->GetBrowserContext(), 219 iter->second.target_web_contents->GetBrowserContext(),
229 iter->second.source_frame_id, 220 iter->second.source_frame_host,
230 iter->second.source_frame_is_main_frame,
231 iter->second.target_web_contents, 221 iter->second.target_web_contents,
232 iter->second.target_url); 222 iter->second.target_url);
233 } 223 }
234 pending_web_contents_.erase(iter); 224 pending_web_contents_.erase(iter);
235 } 225 }
236 226
237 void WebNavigationEventRouter::TabDestroyed(content::WebContents* tab) { 227 void WebNavigationEventRouter::TabDestroyed(content::WebContents* tab) {
238 pending_web_contents_.erase(tab); 228 pending_web_contents_.erase(tab);
239 for (std::map<content::WebContents*, PendingWebContents>::iterator i = 229 for (std::map<content::WebContents*, PendingWebContents>::iterator i =
240 pending_web_contents_.begin(); i != pending_web_contents_.end(); ) { 230 pending_web_contents_.begin(); i != pending_web_contents_.end(); ) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 // we consider the RenderView dead already now. 281 // we consider the RenderView dead already now.
292 RenderViewDeleted(content::Source<content::RenderViewHost>(source).ptr()); 282 RenderViewDeleted(content::Source<content::RenderViewHost>(source).ptr());
293 break; 283 break;
294 } 284 }
295 285
296 default: 286 default:
297 NOTREACHED(); 287 NOTREACHED();
298 } 288 }
299 } 289 }
300 290
291 void WebNavigationTabObserver::RenderFrameDeleted(
292 content::RenderFrameHost* render_frame_host) {
293 content::RenderViewHost* render_view_host =
294 render_frame_host->GetRenderViewHost();
295 if (render_view_host != render_view_host_ &&
296 render_view_host != pending_render_view_host_) {
297 return;
298 }
299 if (navigation_state_.CanSendEvents(render_frame_host) &&
300 !navigation_state_.GetNavigationCompleted(render_frame_host)) {
301 helpers::DispatchOnErrorOccurred(
302 web_contents(),
303 render_frame_host,
304 navigation_state_.GetUrl(render_frame_host),
305 net::ERR_ABORTED);
306 }
307 navigation_state_.FrameDetached(render_frame_host);
308 }
309
301 void WebNavigationTabObserver::RenderViewDeleted( 310 void WebNavigationTabObserver::RenderViewDeleted(
302 content::RenderViewHost* render_view_host) { 311 content::RenderViewHost* render_view_host) {
303 if (render_view_host == render_view_host_) { 312 if (render_view_host == render_view_host_) {
304 render_view_host_ = NULL; 313 render_view_host_ = NULL;
305 if (pending_render_view_host_) { 314 if (pending_render_view_host_) {
306 render_view_host_ = pending_render_view_host_; 315 render_view_host_ = pending_render_view_host_;
307 pending_render_view_host_ = NULL; 316 pending_render_view_host_ = NULL;
308 } 317 }
309 } else if (render_view_host == pending_render_view_host_) { 318 } else if (render_view_host == pending_render_view_host_) {
310 pending_render_view_host_ = NULL; 319 pending_render_view_host_ = NULL;
311 } else { 320 } else {
312 return; 321 return;
313 } 322 }
314 SendErrorEvents( 323 SendErrorEvents(web_contents(), render_view_host, NULL);
315 web_contents(), render_view_host, FrameNavigationState::FrameID());
316 } 324 }
317 325
318 void WebNavigationTabObserver::AboutToNavigateRenderView( 326 void WebNavigationTabObserver::AboutToNavigateRenderView(
319 content::RenderViewHost* render_view_host) { 327 content::RenderViewHost* render_view_host) {
320 if (!render_view_host_) { 328 if (!render_view_host_) {
321 render_view_host_ = render_view_host; 329 render_view_host_ = render_view_host;
322 } else if (render_view_host != render_view_host_) { 330 } else if (render_view_host != render_view_host_) {
323 if (pending_render_view_host_) { 331 if (pending_render_view_host_) {
324 SendErrorEvents(web_contents(), 332 SendErrorEvents(web_contents(), pending_render_view_host_, NULL);
325 pending_render_view_host_,
326 FrameNavigationState::FrameID());
327 } 333 }
328 pending_render_view_host_ = render_view_host; 334 pending_render_view_host_ = render_view_host;
329 } 335 }
330 } 336 }
331 337
332 void WebNavigationTabObserver::DidStartProvisionalLoadForFrame( 338 void WebNavigationTabObserver::DidStartProvisionalLoadForFrame(
333 content::RenderFrameHost* render_frame_host, 339 content::RenderFrameHost* render_frame_host,
334 const GURL& validated_url, 340 const GURL& validated_url,
335 bool is_error_page, 341 bool is_error_page,
336 bool is_iframe_srcdoc) { 342 bool is_iframe_srcdoc) {
337 content::RenderViewHost* render_view_host = 343 content::RenderViewHost* render_view_host =
338 render_frame_host->GetRenderViewHost(); 344 render_frame_host->GetRenderViewHost();
339 DVLOG(2) << "DidStartProvisionalLoad(" 345 DVLOG(2) << "DidStartProvisionalLoad("
340 << "render_view_host=" << render_view_host 346 << "render_view_host=" << render_view_host
341 << ", frame_num=" << render_frame_host->GetRoutingID() 347 << ", frame_num=" << render_frame_host->GetRoutingID()
342 << ", url=" << validated_url << ")"; 348 << ", url=" << validated_url << ")";
343 if (!render_view_host_) 349 if (!render_view_host_)
344 render_view_host_ = render_view_host; 350 render_view_host_ = render_view_host;
345 if (render_view_host != render_view_host_ && 351 if (render_view_host != render_view_host_ &&
346 render_view_host != pending_render_view_host_) 352 render_view_host != pending_render_view_host_)
347 return; 353 return;
348 354
349 // TODO(dcheng): FrameNavigationState and the associated helpers should 355 navigation_state_.TrackFrame(
350 // probably be refactored to use RenderFrameHost directly instead. 356 render_frame_host, validated_url, is_error_page, is_iframe_srcdoc);
351 FrameNavigationState::FrameID frame_id(render_frame_host->GetRoutingID(),
352 render_view_host);
353 FrameNavigationState::FrameID parent_frame_id(
354 render_frame_host->GetParent()
355 ? render_frame_host->GetParent()->GetRoutingID()
356 : -1,
357 render_view_host);
358 bool is_main_frame = !render_frame_host->GetParent();
359 357
360 navigation_state_.TrackFrame(frame_id, 358 if (!navigation_state_.CanSendEvents(render_frame_host))
361 parent_frame_id,
362 validated_url,
363 is_main_frame,
364 is_error_page,
365 is_iframe_srcdoc);
366
367 if (!navigation_state_.CanSendEvents(frame_id))
368 return; 359 return;
369 360
370 helpers::DispatchOnBeforeNavigate( 361 helpers::DispatchOnBeforeNavigate(
371 web_contents(), 362 web_contents(),
372 render_view_host->GetProcess()->GetID(), 363 render_frame_host,
373 frame_id.frame_num, 364 navigation_state_.GetUrl(render_frame_host));
374 is_main_frame,
375 parent_frame_id.frame_num,
376 navigation_state_.IsMainFrame(parent_frame_id),
377 navigation_state_.GetUrl(frame_id));
378 } 365 }
379 366
380 void WebNavigationTabObserver::DidCommitProvisionalLoadForFrame( 367 void WebNavigationTabObserver::DidCommitProvisionalLoadForFrame(
381 content::RenderFrameHost* render_frame_host, 368 content::RenderFrameHost* render_frame_host,
382 const GURL& url, 369 const GURL& url,
383 content::PageTransition transition_type) { 370 content::PageTransition transition_type) {
384 content::RenderViewHost* render_view_host = 371 content::RenderViewHost* render_view_host =
385 render_frame_host->GetRenderViewHost(); 372 render_frame_host->GetRenderViewHost();
386 DVLOG(2) << "DidCommitProvisionalLoad(" 373 DVLOG(2) << "DidCommitProvisionalLoad("
387 << "render_view_host=" << render_view_host 374 << "render_view_host=" << render_view_host
388 << ", frame_num=" << render_frame_host->GetRoutingID() 375 << ", frame_num=" << render_frame_host->GetRoutingID()
389 << ", url=" << url << ")"; 376 << ", url=" << url << ")";
390 if (render_view_host != render_view_host_ && 377 if (render_view_host != render_view_host_ &&
391 render_view_host != pending_render_view_host_) 378 render_view_host != pending_render_view_host_)
392 return; 379 return;
393 FrameNavigationState::FrameID frame_id(render_frame_host->GetRoutingID(),
394 render_view_host);
395 bool is_main_frame = !render_frame_host->GetParent();
396 380
397 bool is_reference_fragment_navigation = 381 bool is_reference_fragment_navigation =
398 IsReferenceFragmentNavigation(frame_id, url); 382 IsReferenceFragmentNavigation(render_frame_host, url);
399 bool is_history_state_modification = 383 bool is_history_state_modification =
400 navigation_state_.GetNavigationCommitted(frame_id); 384 navigation_state_.GetNavigationCommitted(render_frame_host);
401 385
402 if (is_main_frame && render_view_host_ == render_view_host) { 386 if (!render_frame_host->GetParent() &&
387 render_view_host_ == render_view_host) {
403 // Changing the reference fragment or the history state using 388 // Changing the reference fragment or the history state using
404 // history.pushState or history.replaceState does not cancel on-going 389 // history.pushState or history.replaceState does not cancel on-going
405 // iframe navigations. 390 // iframe navigations.
406 if (!is_reference_fragment_navigation && !is_history_state_modification) 391 if (!is_reference_fragment_navigation && !is_history_state_modification)
407 SendErrorEvents(web_contents(), render_view_host_, frame_id); 392 SendErrorEvents(web_contents(), render_view_host_, render_frame_host);
408 if (pending_render_view_host_) { 393 if (pending_render_view_host_) {
409 SendErrorEvents(web_contents(), 394 SendErrorEvents(web_contents(), pending_render_view_host_, NULL);
410 pending_render_view_host_,
411 FrameNavigationState::FrameID());
412 pending_render_view_host_ = NULL; 395 pending_render_view_host_ = NULL;
413 } 396 }
414 } else if (pending_render_view_host_ == render_view_host) { 397 } else if (pending_render_view_host_ == render_view_host) {
415 SendErrorEvents( 398 SendErrorEvents(web_contents(), render_view_host_, NULL);
416 web_contents(), render_view_host_, FrameNavigationState::FrameID());
417 render_view_host_ = pending_render_view_host_; 399 render_view_host_ = pending_render_view_host_;
418 pending_render_view_host_ = NULL; 400 pending_render_view_host_ = NULL;
419 } 401 }
420 402
421 // Update the URL as it might have changed. 403 // Update the URL as it might have changed.
422 navigation_state_.UpdateFrame(frame_id, url); 404 navigation_state_.UpdateFrame(render_frame_host, url);
423 navigation_state_.SetNavigationCommitted(frame_id); 405 navigation_state_.SetNavigationCommitted(render_frame_host);
424 406
425 if (!navigation_state_.CanSendEvents(frame_id)) 407 if (!navigation_state_.CanSendEvents(render_frame_host))
426 return; 408 return;
427 409
428 if (is_reference_fragment_navigation) { 410 if (is_reference_fragment_navigation) {
429 helpers::DispatchOnCommitted( 411 helpers::DispatchOnCommitted(
430 web_navigation::OnReferenceFragmentUpdated::kEventName, 412 web_navigation::OnReferenceFragmentUpdated::kEventName,
431 web_contents(), 413 web_contents(),
432 render_frame_host->GetRoutingID(), 414 render_frame_host,
433 is_main_frame, 415 navigation_state_.GetUrl(render_frame_host),
434 navigation_state_.GetUrl(frame_id),
435 transition_type); 416 transition_type);
436 } else if (is_history_state_modification) { 417 } else if (is_history_state_modification) {
437 helpers::DispatchOnCommitted( 418 helpers::DispatchOnCommitted(
438 web_navigation::OnHistoryStateUpdated::kEventName, 419 web_navigation::OnHistoryStateUpdated::kEventName,
439 web_contents(), 420 web_contents(),
440 render_frame_host->GetRoutingID(), 421 render_frame_host,
441 is_main_frame, 422 navigation_state_.GetUrl(render_frame_host),
442 navigation_state_.GetUrl(frame_id),
443 transition_type); 423 transition_type);
444 } else { 424 } else {
445 if (navigation_state_.GetIsServerRedirected(frame_id)) { 425 if (navigation_state_.GetIsServerRedirected(render_frame_host)) {
446 transition_type = static_cast<content::PageTransition>( 426 transition_type = static_cast<content::PageTransition>(
447 transition_type | content::PAGE_TRANSITION_SERVER_REDIRECT); 427 transition_type | content::PAGE_TRANSITION_SERVER_REDIRECT);
448 } 428 }
449 helpers::DispatchOnCommitted(web_navigation::OnCommitted::kEventName, 429 helpers::DispatchOnCommitted(web_navigation::OnCommitted::kEventName,
450 web_contents(), 430 web_contents(),
451 render_frame_host->GetRoutingID(), 431 render_frame_host,
452 is_main_frame, 432 navigation_state_.GetUrl(render_frame_host),
453 navigation_state_.GetUrl(frame_id),
454 transition_type); 433 transition_type);
455 } 434 }
456 } 435 }
457 436
458 void WebNavigationTabObserver::DidFailProvisionalLoad( 437 void WebNavigationTabObserver::DidFailProvisionalLoad(
459 content::RenderFrameHost* render_frame_host, 438 content::RenderFrameHost* render_frame_host,
460 const GURL& validated_url, 439 const GURL& validated_url,
461 int error_code, 440 int error_code,
462 const base::string16& error_description) { 441 const base::string16& error_description) {
463 content::RenderViewHost* render_view_host = 442 content::RenderViewHost* render_view_host =
464 render_frame_host->GetRenderViewHost(); 443 render_frame_host->GetRenderViewHost();
465 DVLOG(2) << "DidFailProvisionalLoad(" 444 DVLOG(2) << "DidFailProvisionalLoad("
466 << "render_view_host=" << render_view_host 445 << "render_view_host=" << render_view_host
467 << ", frame_num=" << render_frame_host->GetRoutingID() 446 << ", frame_num=" << render_frame_host->GetRoutingID()
468 << ", url=" << validated_url << ")"; 447 << ", url=" << validated_url << ")";
469 if (render_view_host != render_view_host_ && 448 if (render_view_host != render_view_host_ &&
470 render_view_host != pending_render_view_host_) 449 render_view_host != pending_render_view_host_)
471 return; 450 return;
472 bool stop_tracking_frames = false; 451 bool stop_tracking_frames = false;
473 if (render_view_host == pending_render_view_host_) { 452 if (render_view_host == pending_render_view_host_) {
474 pending_render_view_host_ = NULL; 453 pending_render_view_host_ = NULL;
475 stop_tracking_frames = true; 454 stop_tracking_frames = true;
476 } 455 }
477 456
478 FrameNavigationState::FrameID frame_id(render_frame_host->GetRoutingID(), 457 if (navigation_state_.CanSendEvents(render_frame_host)) {
479 render_view_host); 458 helpers::DispatchOnErrorOccurred(
480 bool is_main_frame = !render_frame_host->GetParent(); 459 web_contents(),
481 460 render_frame_host,
482 if (navigation_state_.CanSendEvents(frame_id)) { 461 navigation_state_.GetUrl(render_frame_host),
483 helpers::DispatchOnErrorOccurred(web_contents(), 462 error_code);
484 render_view_host->GetProcess()->GetID(),
485 navigation_state_.GetUrl(frame_id),
486 render_frame_host->GetRoutingID(),
487 is_main_frame,
488 error_code);
489 } 463 }
490 navigation_state_.SetErrorOccurredInFrame(frame_id); 464 navigation_state_.SetErrorOccurredInFrame(render_frame_host);
491 if (stop_tracking_frames) { 465 if (stop_tracking_frames) {
492 navigation_state_.StopTrackingFramesInRVH(render_view_host, 466 navigation_state_.StopTrackingFramesInRVH(render_view_host, NULL);
493 FrameNavigationState::FrameID());
494 } 467 }
495 } 468 }
496 469
497 void WebNavigationTabObserver::DocumentLoadedInFrame( 470 void WebNavigationTabObserver::DocumentLoadedInFrame(
498 content::RenderFrameHost* render_frame_host) { 471 content::RenderFrameHost* render_frame_host) {
499 content::RenderViewHost* render_view_host = 472 content::RenderViewHost* render_view_host =
500 render_frame_host->GetRenderViewHost(); 473 render_frame_host->GetRenderViewHost();
501 DVLOG(2) << "DocumentLoadedInFrame(" 474 DVLOG(2) << "DocumentLoadedInFrame("
502 << "render_view_host=" << render_view_host 475 << "render_view_host=" << render_view_host
503 << ", frame_num=" << render_frame_host->GetRoutingID() << ")"; 476 << ", frame_num=" << render_frame_host->GetRoutingID() << ")";
504 if (render_view_host != render_view_host_) 477 if (render_view_host != render_view_host_)
505 return; 478 return;
506 FrameNavigationState::FrameID frame_id(render_frame_host->GetRoutingID(), 479 if (!navigation_state_.CanSendEvents(render_frame_host))
507 render_view_host);
508 if (!navigation_state_.CanSendEvents(frame_id))
509 return; 480 return;
510 navigation_state_.SetParsingFinished(frame_id); 481 navigation_state_.SetParsingFinished(render_frame_host);
511 helpers::DispatchOnDOMContentLoaded(web_contents(), 482 helpers::DispatchOnDOMContentLoaded(
512 navigation_state_.GetUrl(frame_id), 483 web_contents(),
513 navigation_state_.IsMainFrame(frame_id), 484 render_frame_host,
514 frame_id.frame_num); 485 navigation_state_.GetUrl(render_frame_host));
515 486
516 if (!navigation_state_.GetNavigationCompleted(frame_id)) 487 if (!navigation_state_.GetNavigationCompleted(render_frame_host))
517 return; 488 return;
518 489
519 // The load might already have finished by the time we finished parsing. For 490 // The load might already have finished by the time we finished parsing. For
520 // compatibility reasons, we artifically delay the load completed signal until 491 // compatibility reasons, we artifically delay the load completed signal until
521 // after parsing was completed. 492 // after parsing was completed.
522 helpers::DispatchOnCompleted(web_contents(), 493 helpers::DispatchOnCompleted(web_contents(),
523 navigation_state_.GetUrl(frame_id), 494 render_frame_host,
524 navigation_state_.IsMainFrame(frame_id), 495 navigation_state_.GetUrl(render_frame_host));
525 frame_id.frame_num);
526 } 496 }
527 497
528 void WebNavigationTabObserver::DidFinishLoad( 498 void WebNavigationTabObserver::DidFinishLoad(
529 content::RenderFrameHost* render_frame_host, 499 content::RenderFrameHost* render_frame_host,
530 const GURL& validated_url) { 500 const GURL& validated_url) {
531 content::RenderViewHost* render_view_host = 501 content::RenderViewHost* render_view_host =
532 render_frame_host->GetRenderViewHost(); 502 render_frame_host->GetRenderViewHost();
533 DVLOG(2) << "DidFinishLoad(" 503 DVLOG(2) << "DidFinishLoad("
534 << "render_view_host=" << render_view_host 504 << "render_view_host=" << render_view_host
535 << ", frame_num=" << render_frame_host->GetRoutingID() 505 << ", frame_num=" << render_frame_host->GetRoutingID()
536 << ", url=" << validated_url << ")"; 506 << ", url=" << validated_url << ")";
537 if (render_view_host != render_view_host_) 507 if (render_view_host != render_view_host_)
538 return; 508 return;
539 FrameNavigationState::FrameID frame_id(render_frame_host->GetRoutingID(),
540 render_view_host);
541 // When showing replacement content, we might get load signals for frames 509 // When showing replacement content, we might get load signals for frames
542 // that weren't reguarly loaded. 510 // that weren't reguarly loaded.
543 if (!navigation_state_.IsValidFrame(frame_id)) 511 if (!navigation_state_.IsValidFrame(render_frame_host))
544 return; 512 return;
545 navigation_state_.SetNavigationCompleted(frame_id); 513 navigation_state_.SetNavigationCompleted(render_frame_host);
546 if (!navigation_state_.CanSendEvents(frame_id)) 514 if (!navigation_state_.CanSendEvents(render_frame_host))
547 return; 515 return;
548 DCHECK( 516 DCHECK(navigation_state_.GetUrl(render_frame_host) == validated_url ||
549 navigation_state_.GetUrl(frame_id) == validated_url || 517 (navigation_state_.GetUrl(render_frame_host) ==
550 (navigation_state_.GetUrl(frame_id) == GURL(content::kAboutSrcDocURL) && 518 GURL(content::kAboutSrcDocURL) &&
551 validated_url == GURL(url::kAboutBlankURL))) 519 validated_url == GURL(url::kAboutBlankURL)))
552 << "validated URL is " << validated_url << " but we expected " 520 << "validated URL is " << validated_url << " but we expected "
553 << navigation_state_.GetUrl(frame_id); 521 << navigation_state_.GetUrl(render_frame_host);
554 DCHECK_EQ(navigation_state_.IsMainFrame(frame_id),
555 !render_frame_host->GetParent());
556 522
557 // The load might already have finished by the time we finished parsing. For 523 // The load might already have finished by the time we finished parsing. For
558 // compatibility reasons, we artifically delay the load completed signal until 524 // compatibility reasons, we artifically delay the load completed signal until
559 // after parsing was completed. 525 // after parsing was completed.
560 if (!navigation_state_.GetParsingFinished(frame_id)) 526 if (!navigation_state_.GetParsingFinished(render_frame_host))
561 return; 527 return;
562 helpers::DispatchOnCompleted(web_contents(), 528 helpers::DispatchOnCompleted(web_contents(),
563 navigation_state_.GetUrl(frame_id), 529 render_frame_host,
564 !render_frame_host->GetParent(), 530 navigation_state_.GetUrl(render_frame_host));
565 frame_id.frame_num);
566 } 531 }
567 532
568 void WebNavigationTabObserver::DidFailLoad( 533 void WebNavigationTabObserver::DidFailLoad(
569 content::RenderFrameHost* render_frame_host, 534 content::RenderFrameHost* render_frame_host,
570 const GURL& validated_url, 535 const GURL& validated_url,
571 int error_code, 536 int error_code,
572 const base::string16& error_description) { 537 const base::string16& error_description) {
573 content::RenderViewHost* render_view_host = 538 content::RenderViewHost* render_view_host =
574 render_frame_host->GetRenderViewHost(); 539 render_frame_host->GetRenderViewHost();
575 DVLOG(2) << "DidFailLoad(" 540 DVLOG(2) << "DidFailLoad("
576 << "render_view_host=" << render_view_host 541 << "render_view_host=" << render_view_host
577 << ", frame_num=" << render_frame_host->GetRoutingID() 542 << ", frame_num=" << render_frame_host->GetRoutingID()
578 << ", url=" << validated_url << ")"; 543 << ", url=" << validated_url << ")";
579 if (render_view_host != render_view_host_) 544 if (render_view_host != render_view_host_)
580 return; 545 return;
581 FrameNavigationState::FrameID frame_id(render_frame_host->GetRoutingID(),
582 render_view_host);
583 // When showing replacement content, we might get load signals for frames 546 // When showing replacement content, we might get load signals for frames
584 // that weren't reguarly loaded. 547 // that weren't reguarly loaded.
585 if (!navigation_state_.IsValidFrame(frame_id)) 548 if (!navigation_state_.IsValidFrame(render_frame_host))
586 return; 549 return;
587 if (navigation_state_.CanSendEvents(frame_id)) { 550 if (navigation_state_.CanSendEvents(render_frame_host)) {
588 helpers::DispatchOnErrorOccurred(web_contents(), 551 helpers::DispatchOnErrorOccurred(
589 render_view_host->GetProcess()->GetID(), 552 web_contents(),
590 navigation_state_.GetUrl(frame_id), 553 render_frame_host,
591 frame_id.frame_num, 554 navigation_state_.GetUrl(render_frame_host),
592 !render_frame_host->GetParent(), 555 error_code);
593 error_code);
594 } 556 }
595 navigation_state_.SetErrorOccurredInFrame(frame_id); 557 navigation_state_.SetErrorOccurredInFrame(render_frame_host);
596 } 558 }
597 559
598 void WebNavigationTabObserver::DidGetRedirectForResourceRequest( 560 void WebNavigationTabObserver::DidGetRedirectForResourceRequest(
599 content::RenderViewHost* render_view_host, 561 content::RenderViewHost* render_view_host,
600 const content::ResourceRedirectDetails& details) { 562 const content::ResourceRedirectDetails& details) {
601 if (details.resource_type != ResourceType::MAIN_FRAME && 563 if (details.resource_type != ResourceType::MAIN_FRAME &&
602 details.resource_type != ResourceType::SUB_FRAME) { 564 details.resource_type != ResourceType::SUB_FRAME) {
603 return; 565 return;
604 } 566 }
605 FrameNavigationState::FrameID frame_id(details.render_frame_id, 567 content::RenderFrameHost* render_frame_host =
606 render_view_host); 568 content::RenderFrameHost::FromID(render_view_host->GetProcess()->GetID(),
607 navigation_state_.SetIsServerRedirected(frame_id); 569 details.render_frame_id);
570 navigation_state_.SetIsServerRedirected(render_frame_host);
608 } 571 }
609 572
610 void WebNavigationTabObserver::DidOpenRequestedURL( 573 void WebNavigationTabObserver::DidOpenRequestedURL(
611 content::WebContents* new_contents, 574 content::WebContents* new_contents,
612 const GURL& url, 575 const GURL& url,
613 const content::Referrer& referrer, 576 const content::Referrer& referrer,
614 WindowOpenDisposition disposition, 577 WindowOpenDisposition disposition,
615 content::PageTransition transition, 578 content::PageTransition transition,
616 int64 source_frame_num) { 579 int64 source_frame_num) {
617 FrameNavigationState::FrameID frame_id(source_frame_num, render_view_host_); 580 content::RenderFrameHost* render_frame_host =
618 if (!navigation_state_.CanSendEvents(frame_id)) 581 content::RenderFrameHost::FromID(render_view_host_->GetProcess()->GetID(),
582 source_frame_num);
583 if (!navigation_state_.CanSendEvents(render_frame_host))
619 return; 584 return;
620 585
621 // We only send the onCreatedNavigationTarget if we end up creating a new 586 // We only send the onCreatedNavigationTarget if we end up creating a new
622 // window. 587 // window.
623 if (disposition != SINGLETON_TAB && 588 if (disposition != SINGLETON_TAB &&
624 disposition != NEW_FOREGROUND_TAB && 589 disposition != NEW_FOREGROUND_TAB &&
625 disposition != NEW_BACKGROUND_TAB && 590 disposition != NEW_BACKGROUND_TAB &&
626 disposition != NEW_POPUP && 591 disposition != NEW_POPUP &&
627 disposition != NEW_WINDOW && 592 disposition != NEW_WINDOW &&
628 disposition != OFF_THE_RECORD) 593 disposition != OFF_THE_RECORD)
629 return; 594 return;
630 595
631 helpers::DispatchOnCreatedNavigationTarget( 596 helpers::DispatchOnCreatedNavigationTarget(web_contents(),
632 web_contents(), 597 new_contents->GetBrowserContext(),
633 new_contents->GetBrowserContext(), 598 render_frame_host,
634 source_frame_num, 599 new_contents,
635 navigation_state_.IsMainFrame(frame_id), 600 url);
636 new_contents,
637 url);
638 }
639
640 void WebNavigationTabObserver::FrameDetached(
641 content::RenderFrameHost* render_frame_host) {
642 content::RenderViewHost* render_view_host =
643 render_frame_host->GetRenderViewHost();
644 if (render_view_host != render_view_host_ &&
645 render_view_host != pending_render_view_host_) {
646 return;
647 }
648 FrameNavigationState::FrameID frame_id(render_frame_host->GetRoutingID(),
649 render_view_host);
650 if (navigation_state_.CanSendEvents(frame_id) &&
651 !navigation_state_.GetNavigationCompleted(frame_id)) {
652 helpers::DispatchOnErrorOccurred(web_contents(),
653 render_view_host->GetProcess()->GetID(),
654 navigation_state_.GetUrl(frame_id),
655 frame_id.frame_num,
656 navigation_state_.IsMainFrame(frame_id),
657 net::ERR_ABORTED);
658 }
659 navigation_state_.FrameDetached(frame_id);
660 } 601 }
661 602
662 void WebNavigationTabObserver::WebContentsDestroyed() { 603 void WebNavigationTabObserver::WebContentsDestroyed() {
663 g_tab_observer.Get().erase(web_contents()); 604 g_tab_observer.Get().erase(web_contents());
664 registrar_.RemoveAll(); 605 registrar_.RemoveAll();
665 SendErrorEvents(web_contents(), NULL, FrameNavigationState::FrameID()); 606 SendErrorEvents(web_contents(), NULL, NULL);
666 } 607 }
667 608
668 void WebNavigationTabObserver::SendErrorEvents( 609 void WebNavigationTabObserver::SendErrorEvents(
669 content::WebContents* web_contents, 610 content::WebContents* web_contents,
670 content::RenderViewHost* render_view_host, 611 content::RenderViewHost* render_view_host,
671 FrameNavigationState::FrameID id_to_skip) { 612 content::RenderFrameHost* frame_host_to_skip) {
672 for (FrameNavigationState::const_iterator frame = navigation_state_.begin(); 613 for (FrameNavigationState::const_iterator it = navigation_state_.begin();
673 frame != navigation_state_.end(); ++frame) { 614 it != navigation_state_.end();
674 if (!navigation_state_.GetNavigationCompleted(*frame) && 615 ++it) {
675 navigation_state_.CanSendEvents(*frame) && 616 if (!navigation_state_.GetNavigationCompleted(*it) &&
676 *frame != id_to_skip && 617 navigation_state_.CanSendEvents(*it) && *it != frame_host_to_skip &&
677 (!render_view_host || frame->render_view_host == render_view_host)) { 618 (!render_view_host || (*it)->GetRenderViewHost() == render_view_host)) {
678 navigation_state_.SetErrorOccurredInFrame(*frame); 619 navigation_state_.SetErrorOccurredInFrame(*it);
679 helpers::DispatchOnErrorOccurred( 620 helpers::DispatchOnErrorOccurred(
680 web_contents, 621 web_contents, *it, navigation_state_.GetUrl(*it), net::ERR_ABORTED);
681 frame->render_view_host->GetProcess()->GetID(),
682 navigation_state_.GetUrl(*frame),
683 frame->frame_num,
684 navigation_state_.IsMainFrame(*frame),
685 net::ERR_ABORTED);
686 } 622 }
687 } 623 }
688 if (render_view_host) 624 if (render_view_host)
689 navigation_state_.StopTrackingFramesInRVH(render_view_host, id_to_skip); 625 navigation_state_.StopTrackingFramesInRVH(render_view_host,
626 frame_host_to_skip);
690 } 627 }
691 628
692 // See also NavigationController::IsURLInPageNavigation. 629 // See also NavigationController::IsURLInPageNavigation.
693 bool WebNavigationTabObserver::IsReferenceFragmentNavigation( 630 bool WebNavigationTabObserver::IsReferenceFragmentNavigation(
694 FrameNavigationState::FrameID frame_id, 631 content::RenderFrameHost* render_frame_host,
695 const GURL& url) { 632 const GURL& url) {
696 GURL existing_url = navigation_state_.GetUrl(frame_id); 633 GURL existing_url = navigation_state_.GetUrl(render_frame_host);
697 if (existing_url == url) 634 if (existing_url == url)
698 return false; 635 return false;
699 636
700 url::Replacements<char> replacements; 637 url::Replacements<char> replacements;
701 replacements.ClearRef(); 638 replacements.ClearRef();
702 return existing_url.ReplaceComponents(replacements) == 639 return existing_url.ReplaceComponents(replacements) ==
703 url.ReplaceComponents(replacements); 640 url.ReplaceComponents(replacements);
704 } 641 }
705 642
706 bool WebNavigationGetFrameFunction::RunSync() { 643 bool WebNavigationGetFrameFunction::RunSync() {
(...skipping 17 matching lines...) Expand all
724 return true; 661 return true;
725 } 662 }
726 663
727 WebNavigationTabObserver* observer = 664 WebNavigationTabObserver* observer =
728 WebNavigationTabObserver::Get(web_contents); 665 WebNavigationTabObserver::Get(web_contents);
729 DCHECK(observer); 666 DCHECK(observer);
730 667
731 const FrameNavigationState& frame_navigation_state = 668 const FrameNavigationState& frame_navigation_state =
732 observer->frame_navigation_state(); 669 observer->frame_navigation_state();
733 670
734 if (frame_id == 0) 671 content::RenderFrameHost* render_frame_host =
735 frame_id = frame_navigation_state.GetMainFrameID().frame_num; 672 frame_id == 0 ? frame_navigation_state.GetLastCommittedMainFrameHost()
736 673 : content::RenderFrameHost::FromID(process_id, frame_id);
737 content::RenderViewHost* render_view_host = 674 if (!frame_navigation_state.IsValidFrame(render_frame_host))
738 observer->GetRenderViewHostInProcess(process_id);
739 if (!render_view_host)
740 return true; 675 return true;
741 676
742 FrameNavigationState::FrameID internal_frame_id(frame_id, render_view_host); 677 GURL frame_url = frame_navigation_state.GetUrl(render_frame_host);
743 if (!frame_navigation_state.IsValidFrame(internal_frame_id))
744 return true;
745
746 GURL frame_url = frame_navigation_state.GetUrl(internal_frame_id);
747 if (!frame_navigation_state.IsValidUrl(frame_url)) 678 if (!frame_navigation_state.IsValidUrl(frame_url))
748 return true; 679 return true;
749 680
750 GetFrame::Results::Details frame_details; 681 GetFrame::Results::Details frame_details;
751 frame_details.url = frame_url.spec(); 682 frame_details.url = frame_url.spec();
752 frame_details.error_occurred = 683 frame_details.error_occurred =
753 frame_navigation_state.GetErrorOccurredInFrame(internal_frame_id); 684 frame_navigation_state.GetErrorOccurredInFrame(render_frame_host);
754 FrameNavigationState::FrameID parent_frame_id = 685 frame_details.parent_frame_id =
755 frame_navigation_state.GetParentFrameID(internal_frame_id); 686 helpers::GetFrameId(render_frame_host->GetParent());
756 frame_details.parent_frame_id = helpers::GetFrameId(
757 frame_navigation_state.IsMainFrame(parent_frame_id),
758 parent_frame_id.frame_num);
759 results_ = GetFrame::Results::Create(frame_details); 687 results_ = GetFrame::Results::Create(frame_details);
760 return true; 688 return true;
761 } 689 }
762 690
763 bool WebNavigationGetAllFramesFunction::RunSync() { 691 bool WebNavigationGetAllFramesFunction::RunSync() {
764 scoped_ptr<GetAllFrames::Params> params(GetAllFrames::Params::Create(*args_)); 692 scoped_ptr<GetAllFrames::Params> params(GetAllFrames::Params::Create(*args_));
765 EXTENSION_FUNCTION_VALIDATE(params.get()); 693 EXTENSION_FUNCTION_VALIDATE(params.get());
766 int tab_id = params->details.tab_id; 694 int tab_id = params->details.tab_id;
767 695
768 SetResult(base::Value::CreateNullValue()); 696 SetResult(base::Value::CreateNullValue());
(...skipping 13 matching lines...) Expand all
782 WebNavigationTabObserver* observer = 710 WebNavigationTabObserver* observer =
783 WebNavigationTabObserver::Get(web_contents); 711 WebNavigationTabObserver::Get(web_contents);
784 DCHECK(observer); 712 DCHECK(observer);
785 713
786 const FrameNavigationState& navigation_state = 714 const FrameNavigationState& navigation_state =
787 observer->frame_navigation_state(); 715 observer->frame_navigation_state();
788 716
789 std::vector<linked_ptr<GetAllFrames::Results::DetailsType> > result_list; 717 std::vector<linked_ptr<GetAllFrames::Results::DetailsType> > result_list;
790 for (FrameNavigationState::const_iterator it = navigation_state.begin(); 718 for (FrameNavigationState::const_iterator it = navigation_state.begin();
791 it != navigation_state.end(); ++it) { 719 it != navigation_state.end(); ++it) {
792 FrameNavigationState::FrameID frame_id = *it; 720 GURL frame_url = navigation_state.GetUrl(*it);
793 FrameNavigationState::FrameID parent_frame_id =
794 navigation_state.GetParentFrameID(frame_id);
795 GURL frame_url = navigation_state.GetUrl(frame_id);
796 if (!navigation_state.IsValidUrl(frame_url)) 721 if (!navigation_state.IsValidUrl(frame_url))
797 continue; 722 continue;
798 linked_ptr<GetAllFrames::Results::DetailsType> frame( 723 linked_ptr<GetAllFrames::Results::DetailsType> frame(
799 new GetAllFrames::Results::DetailsType()); 724 new GetAllFrames::Results::DetailsType());
800 frame->url = frame_url.spec(); 725 frame->url = frame_url.spec();
801 frame->frame_id = helpers::GetFrameId( 726 frame->frame_id = helpers::GetFrameId(*it);
802 navigation_state.IsMainFrame(frame_id), frame_id.frame_num); 727 frame->parent_frame_id = helpers::GetFrameId((*it)->GetParent());
803 frame->parent_frame_id = helpers::GetFrameId( 728 frame->process_id = (*it)->GetRenderViewHost()->GetProcess()->GetID();
804 navigation_state.IsMainFrame(parent_frame_id), 729 frame->error_occurred = navigation_state.GetErrorOccurredInFrame(*it);
805 parent_frame_id.frame_num);
806 frame->process_id = frame_id.render_view_host->GetProcess()->GetID();
807 frame->error_occurred = navigation_state.GetErrorOccurredInFrame(frame_id);
808 result_list.push_back(frame); 730 result_list.push_back(frame);
809 } 731 }
810 results_ = GetAllFrames::Results::Create(result_list); 732 results_ = GetAllFrames::Results::Create(result_list);
811 return true; 733 return true;
812 } 734 }
813 735
814 WebNavigationAPI::WebNavigationAPI(content::BrowserContext* context) 736 WebNavigationAPI::WebNavigationAPI(content::BrowserContext* context)
815 : browser_context_(context) { 737 : browser_context_(context) {
816 EventRouter* event_router = EventRouter::Get(browser_context_); 738 EventRouter* event_router = EventRouter::Get(browser_context_);
817 event_router->RegisterObserver(this, 739 event_router->RegisterObserver(this,
(...skipping 30 matching lines...) Expand all
848 return g_factory.Pointer(); 770 return g_factory.Pointer();
849 } 771 }
850 772
851 void WebNavigationAPI::OnListenerAdded(const EventListenerInfo& details) { 773 void WebNavigationAPI::OnListenerAdded(const EventListenerInfo& details) {
852 web_navigation_event_router_.reset(new WebNavigationEventRouter( 774 web_navigation_event_router_.reset(new WebNavigationEventRouter(
853 Profile::FromBrowserContext(browser_context_))); 775 Profile::FromBrowserContext(browser_context_)));
854 EventRouter::Get(browser_context_)->UnregisterObserver(this); 776 EventRouter::Get(browser_context_)->UnregisterObserver(this);
855 } 777 }
856 778
857 } // namespace extensions 779 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698