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

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: Revert formatting too 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 FrameDetached(render_frame_host);
294 }
295
301 void WebNavigationTabObserver::RenderViewDeleted( 296 void WebNavigationTabObserver::RenderViewDeleted(
302 content::RenderViewHost* render_view_host) { 297 content::RenderViewHost* render_view_host) {
303 if (render_view_host == render_view_host_) { 298 if (render_view_host == render_view_host_) {
304 render_view_host_ = NULL; 299 render_view_host_ = NULL;
305 if (pending_render_view_host_) { 300 if (pending_render_view_host_) {
306 render_view_host_ = pending_render_view_host_; 301 render_view_host_ = pending_render_view_host_;
307 pending_render_view_host_ = NULL; 302 pending_render_view_host_ = NULL;
308 } 303 }
309 } else if (render_view_host == pending_render_view_host_) { 304 } else if (render_view_host == pending_render_view_host_) {
310 pending_render_view_host_ = NULL; 305 pending_render_view_host_ = NULL;
311 } else { 306 } else {
312 return; 307 return;
313 } 308 }
314 SendErrorEvents( 309 SendErrorEvents(web_contents(), render_view_host, NULL);
315 web_contents(), render_view_host, FrameNavigationState::FrameID());
316 } 310 }
317 311
318 void WebNavigationTabObserver::AboutToNavigateRenderView( 312 void WebNavigationTabObserver::AboutToNavigateRenderView(
319 content::RenderViewHost* render_view_host) { 313 content::RenderViewHost* render_view_host) {
320 if (!render_view_host_) { 314 if (!render_view_host_) {
321 render_view_host_ = render_view_host; 315 render_view_host_ = render_view_host;
322 } else if (render_view_host != render_view_host_) { 316 } else if (render_view_host != render_view_host_) {
323 if (pending_render_view_host_) { 317 if (pending_render_view_host_) {
324 SendErrorEvents(web_contents(), 318 SendErrorEvents(web_contents(), pending_render_view_host_, NULL);
325 pending_render_view_host_,
326 FrameNavigationState::FrameID());
327 } 319 }
328 pending_render_view_host_ = render_view_host; 320 pending_render_view_host_ = render_view_host;
329 } 321 }
330 } 322 }
331 323
332 void WebNavigationTabObserver::DidStartProvisionalLoadForFrame( 324 void WebNavigationTabObserver::DidStartProvisionalLoadForFrame(
333 content::RenderFrameHost* render_frame_host, 325 content::RenderFrameHost* render_frame_host,
334 const GURL& validated_url, 326 const GURL& validated_url,
335 bool is_error_page, 327 bool is_error_page,
336 bool is_iframe_srcdoc) { 328 bool is_iframe_srcdoc) {
337 content::RenderViewHost* render_view_host = 329 content::RenderViewHost* render_view_host =
338 render_frame_host->GetRenderViewHost(); 330 render_frame_host->GetRenderViewHost();
339 DVLOG(2) << "DidStartProvisionalLoad(" 331 DVLOG(2) << "DidStartProvisionalLoad("
340 << "render_view_host=" << render_view_host 332 << "render_view_host=" << render_view_host
341 << ", frame_num=" << render_frame_host->GetRoutingID() 333 << ", frame_num=" << render_frame_host->GetRoutingID()
342 << ", url=" << validated_url << ")"; 334 << ", url=" << validated_url << ")";
343 if (!render_view_host_) 335 if (!render_view_host_)
344 render_view_host_ = render_view_host; 336 render_view_host_ = render_view_host;
345 if (render_view_host != render_view_host_ && 337 if (render_view_host != render_view_host_ &&
346 render_view_host != pending_render_view_host_) 338 render_view_host != pending_render_view_host_)
347 return; 339 return;
348 340
349 // TODO(dcheng): FrameNavigationState and the associated helpers should 341 navigation_state_.TrackFrame(
350 // probably be refactored to use RenderFrameHost directly instead. 342 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 343
360 navigation_state_.TrackFrame(frame_id, 344 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; 345 return;
369 346
370 helpers::DispatchOnBeforeNavigate( 347 helpers::DispatchOnBeforeNavigate(
371 web_contents(), 348 web_contents(),
372 render_view_host->GetProcess()->GetID(), 349 render_frame_host,
373 frame_id.frame_num, 350 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 } 351 }
379 352
380 void WebNavigationTabObserver::DidCommitProvisionalLoadForFrame( 353 void WebNavigationTabObserver::DidCommitProvisionalLoadForFrame(
381 content::RenderFrameHost* render_frame_host, 354 content::RenderFrameHost* render_frame_host,
382 const GURL& url, 355 const GURL& url,
383 content::PageTransition transition_type) { 356 content::PageTransition transition_type) {
384 content::RenderViewHost* render_view_host = 357 content::RenderViewHost* render_view_host =
385 render_frame_host->GetRenderViewHost(); 358 render_frame_host->GetRenderViewHost();
386 DVLOG(2) << "DidCommitProvisionalLoad(" 359 DVLOG(2) << "DidCommitProvisionalLoad("
387 << "render_view_host=" << render_view_host 360 << "render_view_host=" << render_view_host
388 << ", frame_num=" << render_frame_host->GetRoutingID() 361 << ", frame_num=" << render_frame_host->GetRoutingID()
389 << ", url=" << url << ")"; 362 << ", url=" << url << ")";
390 if (render_view_host != render_view_host_ && 363 if (render_view_host != render_view_host_ &&
391 render_view_host != pending_render_view_host_) 364 render_view_host != pending_render_view_host_)
392 return; 365 return;
393 FrameNavigationState::FrameID frame_id(render_frame_host->GetRoutingID(),
394 render_view_host);
395 bool is_main_frame = !render_frame_host->GetParent();
396 366
397 bool is_reference_fragment_navigation = 367 bool is_reference_fragment_navigation =
398 IsReferenceFragmentNavigation(frame_id, url); 368 IsReferenceFragmentNavigation(render_frame_host, url);
399 bool is_history_state_modification = 369 bool is_history_state_modification =
400 navigation_state_.GetNavigationCommitted(frame_id); 370 navigation_state_.GetNavigationCommitted(render_frame_host);
401 371
402 if (is_main_frame && render_view_host_ == render_view_host) { 372 if (!render_frame_host->GetParent() &&
373 render_view_host_ == render_view_host) {
403 // Changing the reference fragment or the history state using 374 // Changing the reference fragment or the history state using
404 // history.pushState or history.replaceState does not cancel on-going 375 // history.pushState or history.replaceState does not cancel on-going
405 // iframe navigations. 376 // iframe navigations.
406 if (!is_reference_fragment_navigation && !is_history_state_modification) 377 if (!is_reference_fragment_navigation && !is_history_state_modification)
407 SendErrorEvents(web_contents(), render_view_host_, frame_id); 378 SendErrorEvents(web_contents(), render_view_host_, render_frame_host);
408 if (pending_render_view_host_) { 379 if (pending_render_view_host_) {
409 SendErrorEvents(web_contents(), 380 SendErrorEvents(web_contents(), pending_render_view_host_, NULL);
410 pending_render_view_host_,
411 FrameNavigationState::FrameID());
412 pending_render_view_host_ = NULL; 381 pending_render_view_host_ = NULL;
413 } 382 }
414 } else if (pending_render_view_host_ == render_view_host) { 383 } else if (pending_render_view_host_ == render_view_host) {
415 SendErrorEvents( 384 SendErrorEvents(web_contents(), render_view_host_, NULL);
416 web_contents(), render_view_host_, FrameNavigationState::FrameID());
417 render_view_host_ = pending_render_view_host_; 385 render_view_host_ = pending_render_view_host_;
418 pending_render_view_host_ = NULL; 386 pending_render_view_host_ = NULL;
419 } 387 }
420 388
421 // Update the URL as it might have changed. 389 // Update the URL as it might have changed.
422 navigation_state_.UpdateFrame(frame_id, url); 390 navigation_state_.UpdateFrame(render_frame_host, url);
423 navigation_state_.SetNavigationCommitted(frame_id); 391 navigation_state_.SetNavigationCommitted(render_frame_host);
424 392
425 if (!navigation_state_.CanSendEvents(frame_id)) 393 if (!navigation_state_.CanSendEvents(render_frame_host))
426 return; 394 return;
427 395
428 if (is_reference_fragment_navigation) { 396 if (is_reference_fragment_navigation) {
429 helpers::DispatchOnCommitted( 397 helpers::DispatchOnCommitted(
430 web_navigation::OnReferenceFragmentUpdated::kEventName, 398 web_navigation::OnReferenceFragmentUpdated::kEventName,
431 web_contents(), 399 web_contents(),
432 render_frame_host->GetRoutingID(), 400 render_frame_host,
433 is_main_frame, 401 navigation_state_.GetUrl(render_frame_host),
434 navigation_state_.GetUrl(frame_id),
435 transition_type); 402 transition_type);
436 } else if (is_history_state_modification) { 403 } else if (is_history_state_modification) {
437 helpers::DispatchOnCommitted( 404 helpers::DispatchOnCommitted(
438 web_navigation::OnHistoryStateUpdated::kEventName, 405 web_navigation::OnHistoryStateUpdated::kEventName,
439 web_contents(), 406 web_contents(),
440 render_frame_host->GetRoutingID(), 407 render_frame_host,
441 is_main_frame, 408 navigation_state_.GetUrl(render_frame_host),
442 navigation_state_.GetUrl(frame_id),
443 transition_type); 409 transition_type);
444 } else { 410 } else {
445 if (navigation_state_.GetIsServerRedirected(frame_id)) { 411 if (navigation_state_.GetIsServerRedirected(render_frame_host)) {
446 transition_type = static_cast<content::PageTransition>( 412 transition_type = static_cast<content::PageTransition>(
447 transition_type | content::PAGE_TRANSITION_SERVER_REDIRECT); 413 transition_type | content::PAGE_TRANSITION_SERVER_REDIRECT);
448 } 414 }
449 helpers::DispatchOnCommitted(web_navigation::OnCommitted::kEventName, 415 helpers::DispatchOnCommitted(web_navigation::OnCommitted::kEventName,
450 web_contents(), 416 web_contents(),
451 render_frame_host->GetRoutingID(), 417 render_frame_host,
452 is_main_frame, 418 navigation_state_.GetUrl(render_frame_host),
453 navigation_state_.GetUrl(frame_id),
454 transition_type); 419 transition_type);
455 } 420 }
456 } 421 }
457 422
458 void WebNavigationTabObserver::DidFailProvisionalLoad( 423 void WebNavigationTabObserver::DidFailProvisionalLoad(
459 content::RenderFrameHost* render_frame_host, 424 content::RenderFrameHost* render_frame_host,
460 const GURL& validated_url, 425 const GURL& validated_url,
461 int error_code, 426 int error_code,
462 const base::string16& error_description) { 427 const base::string16& error_description) {
463 content::RenderViewHost* render_view_host = 428 content::RenderViewHost* render_view_host =
464 render_frame_host->GetRenderViewHost(); 429 render_frame_host->GetRenderViewHost();
465 DVLOG(2) << "DidFailProvisionalLoad(" 430 DVLOG(2) << "DidFailProvisionalLoad("
466 << "render_view_host=" << render_view_host 431 << "render_view_host=" << render_view_host
467 << ", frame_num=" << render_frame_host->GetRoutingID() 432 << ", frame_num=" << render_frame_host->GetRoutingID()
468 << ", url=" << validated_url << ")"; 433 << ", url=" << validated_url << ")";
469 if (render_view_host != render_view_host_ && 434 if (render_view_host != render_view_host_ &&
470 render_view_host != pending_render_view_host_) 435 render_view_host != pending_render_view_host_)
471 return; 436 return;
472 bool stop_tracking_frames = false; 437 bool stop_tracking_frames = false;
473 if (render_view_host == pending_render_view_host_) { 438 if (render_view_host == pending_render_view_host_) {
474 pending_render_view_host_ = NULL; 439 pending_render_view_host_ = NULL;
475 stop_tracking_frames = true; 440 stop_tracking_frames = true;
476 } 441 }
477 442
478 FrameNavigationState::FrameID frame_id(render_frame_host->GetRoutingID(), 443 if (navigation_state_.CanSendEvents(render_frame_host)) {
479 render_view_host); 444 helpers::DispatchOnErrorOccurred(
480 bool is_main_frame = !render_frame_host->GetParent(); 445 web_contents(),
481 446 render_frame_host,
482 if (navigation_state_.CanSendEvents(frame_id)) { 447 navigation_state_.GetUrl(render_frame_host),
483 helpers::DispatchOnErrorOccurred(web_contents(), 448 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 } 449 }
490 navigation_state_.SetErrorOccurredInFrame(frame_id); 450 navigation_state_.SetErrorOccurredInFrame(render_frame_host);
491 if (stop_tracking_frames) { 451 if (stop_tracking_frames) {
492 navigation_state_.StopTrackingFramesInRVH(render_view_host, 452 navigation_state_.StopTrackingFramesInRVH(render_view_host, NULL);
493 FrameNavigationState::FrameID());
494 } 453 }
495 } 454 }
496 455
497 void WebNavigationTabObserver::DocumentLoadedInFrame( 456 void WebNavigationTabObserver::DocumentLoadedInFrame(
498 content::RenderFrameHost* render_frame_host) { 457 content::RenderFrameHost* render_frame_host) {
499 content::RenderViewHost* render_view_host = 458 content::RenderViewHost* render_view_host =
500 render_frame_host->GetRenderViewHost(); 459 render_frame_host->GetRenderViewHost();
501 DVLOG(2) << "DocumentLoadedInFrame(" 460 DVLOG(2) << "DocumentLoadedInFrame("
502 << "render_view_host=" << render_view_host 461 << "render_view_host=" << render_view_host
503 << ", frame_num=" << render_frame_host->GetRoutingID() << ")"; 462 << ", frame_num=" << render_frame_host->GetRoutingID() << ")";
504 if (render_view_host != render_view_host_) 463 if (render_view_host != render_view_host_)
505 return; 464 return;
506 FrameNavigationState::FrameID frame_id(render_frame_host->GetRoutingID(), 465 if (!navigation_state_.CanSendEvents(render_frame_host))
507 render_view_host);
508 if (!navigation_state_.CanSendEvents(frame_id))
509 return; 466 return;
510 navigation_state_.SetParsingFinished(frame_id); 467 navigation_state_.SetParsingFinished(render_frame_host);
511 helpers::DispatchOnDOMContentLoaded(web_contents(), 468 helpers::DispatchOnDOMContentLoaded(
512 navigation_state_.GetUrl(frame_id), 469 web_contents(),
513 navigation_state_.IsMainFrame(frame_id), 470 render_frame_host,
514 frame_id.frame_num); 471 navigation_state_.GetUrl(render_frame_host));
515 472
516 if (!navigation_state_.GetNavigationCompleted(frame_id)) 473 if (!navigation_state_.GetNavigationCompleted(render_frame_host))
517 return; 474 return;
518 475
519 // The load might already have finished by the time we finished parsing. For 476 // The load might already have finished by the time we finished parsing. For
520 // compatibility reasons, we artifically delay the load completed signal until 477 // compatibility reasons, we artifically delay the load completed signal until
521 // after parsing was completed. 478 // after parsing was completed.
522 helpers::DispatchOnCompleted(web_contents(), 479 helpers::DispatchOnCompleted(web_contents(),
523 navigation_state_.GetUrl(frame_id), 480 render_frame_host,
524 navigation_state_.IsMainFrame(frame_id), 481 navigation_state_.GetUrl(render_frame_host));
525 frame_id.frame_num);
526 } 482 }
527 483
528 void WebNavigationTabObserver::DidFinishLoad( 484 void WebNavigationTabObserver::DidFinishLoad(
529 content::RenderFrameHost* render_frame_host, 485 content::RenderFrameHost* render_frame_host,
530 const GURL& validated_url) { 486 const GURL& validated_url) {
531 content::RenderViewHost* render_view_host = 487 content::RenderViewHost* render_view_host =
532 render_frame_host->GetRenderViewHost(); 488 render_frame_host->GetRenderViewHost();
533 DVLOG(2) << "DidFinishLoad(" 489 DVLOG(2) << "DidFinishLoad("
534 << "render_view_host=" << render_view_host 490 << "render_view_host=" << render_view_host
535 << ", frame_num=" << render_frame_host->GetRoutingID() 491 << ", frame_num=" << render_frame_host->GetRoutingID()
536 << ", url=" << validated_url << ")"; 492 << ", url=" << validated_url << ")";
537 if (render_view_host != render_view_host_) 493 if (render_view_host != render_view_host_)
538 return; 494 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 495 // When showing replacement content, we might get load signals for frames
542 // that weren't reguarly loaded. 496 // that weren't reguarly loaded.
543 if (!navigation_state_.IsValidFrame(frame_id)) 497 if (!navigation_state_.IsValidFrame(render_frame_host))
544 return; 498 return;
545 navigation_state_.SetNavigationCompleted(frame_id); 499 navigation_state_.SetNavigationCompleted(render_frame_host);
546 if (!navigation_state_.CanSendEvents(frame_id)) 500 if (!navigation_state_.CanSendEvents(render_frame_host))
547 return; 501 return;
548 DCHECK( 502 DCHECK(navigation_state_.GetUrl(render_frame_host) == validated_url ||
549 navigation_state_.GetUrl(frame_id) == validated_url || 503 (navigation_state_.GetUrl(render_frame_host) ==
550 (navigation_state_.GetUrl(frame_id) == GURL(content::kAboutSrcDocURL) && 504 GURL(content::kAboutSrcDocURL) &&
551 validated_url == GURL(url::kAboutBlankURL))) 505 validated_url == GURL(url::kAboutBlankURL)))
552 << "validated URL is " << validated_url << " but we expected " 506 << "validated URL is " << validated_url << " but we expected "
553 << navigation_state_.GetUrl(frame_id); 507 << navigation_state_.GetUrl(render_frame_host);
554 DCHECK_EQ(navigation_state_.IsMainFrame(frame_id),
555 !render_frame_host->GetParent());
556 508
557 // The load might already have finished by the time we finished parsing. For 509 // The load might already have finished by the time we finished parsing. For
558 // compatibility reasons, we artifically delay the load completed signal until 510 // compatibility reasons, we artifically delay the load completed signal until
559 // after parsing was completed. 511 // after parsing was completed.
560 if (!navigation_state_.GetParsingFinished(frame_id)) 512 if (!navigation_state_.GetParsingFinished(render_frame_host))
561 return; 513 return;
562 helpers::DispatchOnCompleted(web_contents(), 514 helpers::DispatchOnCompleted(web_contents(),
563 navigation_state_.GetUrl(frame_id), 515 render_frame_host,
564 !render_frame_host->GetParent(), 516 navigation_state_.GetUrl(render_frame_host));
565 frame_id.frame_num);
566 } 517 }
567 518
568 void WebNavigationTabObserver::DidFailLoad( 519 void WebNavigationTabObserver::DidFailLoad(
569 content::RenderFrameHost* render_frame_host, 520 content::RenderFrameHost* render_frame_host,
570 const GURL& validated_url, 521 const GURL& validated_url,
571 int error_code, 522 int error_code,
572 const base::string16& error_description) { 523 const base::string16& error_description) {
573 content::RenderViewHost* render_view_host = 524 content::RenderViewHost* render_view_host =
574 render_frame_host->GetRenderViewHost(); 525 render_frame_host->GetRenderViewHost();
575 DVLOG(2) << "DidFailLoad(" 526 DVLOG(2) << "DidFailLoad("
576 << "render_view_host=" << render_view_host 527 << "render_view_host=" << render_view_host
577 << ", frame_num=" << render_frame_host->GetRoutingID() 528 << ", frame_num=" << render_frame_host->GetRoutingID()
578 << ", url=" << validated_url << ")"; 529 << ", url=" << validated_url << ")";
579 if (render_view_host != render_view_host_) 530 if (render_view_host != render_view_host_)
580 return; 531 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 532 // When showing replacement content, we might get load signals for frames
584 // that weren't reguarly loaded. 533 // that weren't reguarly loaded.
585 if (!navigation_state_.IsValidFrame(frame_id)) 534 if (!navigation_state_.IsValidFrame(render_frame_host))
586 return; 535 return;
587 if (navigation_state_.CanSendEvents(frame_id)) { 536 if (navigation_state_.CanSendEvents(render_frame_host)) {
588 helpers::DispatchOnErrorOccurred(web_contents(), 537 helpers::DispatchOnErrorOccurred(
589 render_view_host->GetProcess()->GetID(), 538 web_contents(),
590 navigation_state_.GetUrl(frame_id), 539 render_frame_host,
591 frame_id.frame_num, 540 navigation_state_.GetUrl(render_frame_host),
592 !render_frame_host->GetParent(), 541 error_code);
593 error_code);
594 } 542 }
595 navigation_state_.SetErrorOccurredInFrame(frame_id); 543 navigation_state_.SetErrorOccurredInFrame(render_frame_host);
596 } 544 }
597 545
598 void WebNavigationTabObserver::DidGetRedirectForResourceRequest( 546 void WebNavigationTabObserver::DidGetRedirectForResourceRequest(
599 content::RenderViewHost* render_view_host, 547 content::RenderViewHost* render_view_host,
600 const content::ResourceRedirectDetails& details) { 548 const content::ResourceRedirectDetails& details) {
601 if (details.resource_type != ResourceType::MAIN_FRAME && 549 if (details.resource_type != ResourceType::MAIN_FRAME &&
602 details.resource_type != ResourceType::SUB_FRAME) { 550 details.resource_type != ResourceType::SUB_FRAME) {
603 return; 551 return;
604 } 552 }
605 FrameNavigationState::FrameID frame_id(details.render_frame_id, 553 content::RenderFrameHost* render_frame_host =
606 render_view_host); 554 content::RenderFrameHost::FromID(render_view_host->GetProcess()->GetID(),
607 navigation_state_.SetIsServerRedirected(frame_id); 555 details.render_frame_id);
556 navigation_state_.SetIsServerRedirected(render_frame_host);
608 } 557 }
609 558
610 void WebNavigationTabObserver::DidOpenRequestedURL( 559 void WebNavigationTabObserver::DidOpenRequestedURL(
611 content::WebContents* new_contents, 560 content::WebContents* new_contents,
612 const GURL& url, 561 const GURL& url,
613 const content::Referrer& referrer, 562 const content::Referrer& referrer,
614 WindowOpenDisposition disposition, 563 WindowOpenDisposition disposition,
615 content::PageTransition transition, 564 content::PageTransition transition,
616 int64 source_frame_num) { 565 int64 source_frame_num) {
617 FrameNavigationState::FrameID frame_id(source_frame_num, render_view_host_); 566 content::RenderFrameHost* render_frame_host =
618 if (!navigation_state_.CanSendEvents(frame_id)) 567 content::RenderFrameHost::FromID(render_view_host_->GetProcess()->GetID(),
568 source_frame_num);
569 if (!navigation_state_.CanSendEvents(render_frame_host))
619 return; 570 return;
620 571
621 // We only send the onCreatedNavigationTarget if we end up creating a new 572 // We only send the onCreatedNavigationTarget if we end up creating a new
622 // window. 573 // window.
623 if (disposition != SINGLETON_TAB && 574 if (disposition != SINGLETON_TAB &&
624 disposition != NEW_FOREGROUND_TAB && 575 disposition != NEW_FOREGROUND_TAB &&
625 disposition != NEW_BACKGROUND_TAB && 576 disposition != NEW_BACKGROUND_TAB &&
626 disposition != NEW_POPUP && 577 disposition != NEW_POPUP &&
627 disposition != NEW_WINDOW && 578 disposition != NEW_WINDOW &&
628 disposition != OFF_THE_RECORD) 579 disposition != OFF_THE_RECORD)
629 return; 580 return;
630 581
631 helpers::DispatchOnCreatedNavigationTarget( 582 helpers::DispatchOnCreatedNavigationTarget(web_contents(),
632 web_contents(), 583 new_contents->GetBrowserContext(),
633 new_contents->GetBrowserContext(), 584 render_frame_host,
634 source_frame_num, 585 new_contents,
635 navigation_state_.IsMainFrame(frame_id), 586 url);
636 new_contents,
637 url);
638 } 587 }
639 588
640 void WebNavigationTabObserver::FrameDetached( 589 void WebNavigationTabObserver::FrameDetached(
641 content::RenderFrameHost* render_frame_host) { 590 content::RenderFrameHost* render_frame_host) {
642 content::RenderViewHost* render_view_host = 591 content::RenderViewHost* render_view_host =
643 render_frame_host->GetRenderViewHost(); 592 render_frame_host->GetRenderViewHost();
644 if (render_view_host != render_view_host_ && 593 if (render_view_host != render_view_host_ &&
645 render_view_host != pending_render_view_host_) { 594 render_view_host != pending_render_view_host_) {
646 return; 595 return;
647 } 596 }
648 FrameNavigationState::FrameID frame_id(render_frame_host->GetRoutingID(), 597 if (navigation_state_.CanSendEvents(render_frame_host) &&
649 render_view_host); 598 !navigation_state_.GetNavigationCompleted(render_frame_host)) {
650 if (navigation_state_.CanSendEvents(frame_id) && 599 helpers::DispatchOnErrorOccurred(
651 !navigation_state_.GetNavigationCompleted(frame_id)) { 600 web_contents(),
652 helpers::DispatchOnErrorOccurred(web_contents(), 601 render_frame_host,
653 render_view_host->GetProcess()->GetID(), 602 navigation_state_.GetUrl(render_frame_host),
654 navigation_state_.GetUrl(frame_id), 603 net::ERR_ABORTED);
655 frame_id.frame_num,
656 navigation_state_.IsMainFrame(frame_id),
657 net::ERR_ABORTED);
658 } 604 }
659 navigation_state_.FrameDetached(frame_id); 605 navigation_state_.FrameDetached(render_frame_host);
660 } 606 }
661 607
662 void WebNavigationTabObserver::WebContentsDestroyed() { 608 void WebNavigationTabObserver::WebContentsDestroyed() {
663 g_tab_observer.Get().erase(web_contents()); 609 g_tab_observer.Get().erase(web_contents());
664 registrar_.RemoveAll(); 610 registrar_.RemoveAll();
665 SendErrorEvents(web_contents(), NULL, FrameNavigationState::FrameID()); 611 SendErrorEvents(web_contents(), NULL, NULL);
666 } 612 }
667 613
668 void WebNavigationTabObserver::SendErrorEvents( 614 void WebNavigationTabObserver::SendErrorEvents(
669 content::WebContents* web_contents, 615 content::WebContents* web_contents,
670 content::RenderViewHost* render_view_host, 616 content::RenderViewHost* render_view_host,
671 FrameNavigationState::FrameID id_to_skip) { 617 content::RenderFrameHost* frame_host_to_skip) {
672 for (FrameNavigationState::const_iterator frame = navigation_state_.begin(); 618 for (FrameNavigationState::const_iterator it = navigation_state_.begin();
673 frame != navigation_state_.end(); ++frame) { 619 it != navigation_state_.end();
674 if (!navigation_state_.GetNavigationCompleted(*frame) && 620 ++it) {
675 navigation_state_.CanSendEvents(*frame) && 621 if (!navigation_state_.GetNavigationCompleted(*it) &&
676 *frame != id_to_skip && 622 navigation_state_.CanSendEvents(*it) && *it != frame_host_to_skip &&
677 (!render_view_host || frame->render_view_host == render_view_host)) { 623 (!render_view_host || (*it)->GetRenderViewHost() == render_view_host)) {
678 navigation_state_.SetErrorOccurredInFrame(*frame); 624 navigation_state_.SetErrorOccurredInFrame(*it);
679 helpers::DispatchOnErrorOccurred( 625 helpers::DispatchOnErrorOccurred(
680 web_contents, 626 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 } 627 }
687 } 628 }
688 if (render_view_host) 629 if (render_view_host)
689 navigation_state_.StopTrackingFramesInRVH(render_view_host, id_to_skip); 630 navigation_state_.StopTrackingFramesInRVH(render_view_host,
631 frame_host_to_skip);
690 } 632 }
691 633
692 // See also NavigationController::IsURLInPageNavigation. 634 // See also NavigationController::IsURLInPageNavigation.
693 bool WebNavigationTabObserver::IsReferenceFragmentNavigation( 635 bool WebNavigationTabObserver::IsReferenceFragmentNavigation(
694 FrameNavigationState::FrameID frame_id, 636 content::RenderFrameHost* render_frame_host,
695 const GURL& url) { 637 const GURL& url) {
696 GURL existing_url = navigation_state_.GetUrl(frame_id); 638 GURL existing_url = navigation_state_.GetUrl(render_frame_host);
697 if (existing_url == url) 639 if (existing_url == url)
698 return false; 640 return false;
699 641
700 url::Replacements<char> replacements; 642 url::Replacements<char> replacements;
701 replacements.ClearRef(); 643 replacements.ClearRef();
702 return existing_url.ReplaceComponents(replacements) == 644 return existing_url.ReplaceComponents(replacements) ==
703 url.ReplaceComponents(replacements); 645 url.ReplaceComponents(replacements);
704 } 646 }
705 647
706 bool WebNavigationGetFrameFunction::RunSync() { 648 bool WebNavigationGetFrameFunction::RunSync() {
(...skipping 17 matching lines...) Expand all
724 return true; 666 return true;
725 } 667 }
726 668
727 WebNavigationTabObserver* observer = 669 WebNavigationTabObserver* observer =
728 WebNavigationTabObserver::Get(web_contents); 670 WebNavigationTabObserver::Get(web_contents);
729 DCHECK(observer); 671 DCHECK(observer);
730 672
731 const FrameNavigationState& frame_navigation_state = 673 const FrameNavigationState& frame_navigation_state =
732 observer->frame_navigation_state(); 674 observer->frame_navigation_state();
733 675
734 if (frame_id == 0) 676 content::RenderFrameHost* render_frame_host =
735 frame_id = frame_navigation_state.GetMainFrameID().frame_num; 677 frame_id == 0 ? frame_navigation_state.GetLastCommittedMainFrameHost()
736 678 : content::RenderFrameHost::FromID(process_id, frame_id);
737 content::RenderViewHost* render_view_host = 679 if (!frame_navigation_state.IsValidFrame(render_frame_host))
738 observer->GetRenderViewHostInProcess(process_id);
739 if (!render_view_host)
740 return true; 680 return true;
741 681
742 FrameNavigationState::FrameID internal_frame_id(frame_id, render_view_host); 682 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)) 683 if (!frame_navigation_state.IsValidUrl(frame_url))
748 return true; 684 return true;
749 685
750 GetFrame::Results::Details frame_details; 686 GetFrame::Results::Details frame_details;
751 frame_details.url = frame_url.spec(); 687 frame_details.url = frame_url.spec();
752 frame_details.error_occurred = 688 frame_details.error_occurred =
753 frame_navigation_state.GetErrorOccurredInFrame(internal_frame_id); 689 frame_navigation_state.GetErrorOccurredInFrame(render_frame_host);
754 FrameNavigationState::FrameID parent_frame_id = 690 frame_details.parent_frame_id =
755 frame_navigation_state.GetParentFrameID(internal_frame_id); 691 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); 692 results_ = GetFrame::Results::Create(frame_details);
760 return true; 693 return true;
761 } 694 }
762 695
763 bool WebNavigationGetAllFramesFunction::RunSync() { 696 bool WebNavigationGetAllFramesFunction::RunSync() {
764 scoped_ptr<GetAllFrames::Params> params(GetAllFrames::Params::Create(*args_)); 697 scoped_ptr<GetAllFrames::Params> params(GetAllFrames::Params::Create(*args_));
765 EXTENSION_FUNCTION_VALIDATE(params.get()); 698 EXTENSION_FUNCTION_VALIDATE(params.get());
766 int tab_id = params->details.tab_id; 699 int tab_id = params->details.tab_id;
767 700
768 SetResult(base::Value::CreateNullValue()); 701 SetResult(base::Value::CreateNullValue());
(...skipping 13 matching lines...) Expand all
782 WebNavigationTabObserver* observer = 715 WebNavigationTabObserver* observer =
783 WebNavigationTabObserver::Get(web_contents); 716 WebNavigationTabObserver::Get(web_contents);
784 DCHECK(observer); 717 DCHECK(observer);
785 718
786 const FrameNavigationState& navigation_state = 719 const FrameNavigationState& navigation_state =
787 observer->frame_navigation_state(); 720 observer->frame_navigation_state();
788 721
789 std::vector<linked_ptr<GetAllFrames::Results::DetailsType> > result_list; 722 std::vector<linked_ptr<GetAllFrames::Results::DetailsType> > result_list;
790 for (FrameNavigationState::const_iterator it = navigation_state.begin(); 723 for (FrameNavigationState::const_iterator it = navigation_state.begin();
791 it != navigation_state.end(); ++it) { 724 it != navigation_state.end(); ++it) {
792 FrameNavigationState::FrameID frame_id = *it; 725 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)) 726 if (!navigation_state.IsValidUrl(frame_url))
797 continue; 727 continue;
798 linked_ptr<GetAllFrames::Results::DetailsType> frame( 728 linked_ptr<GetAllFrames::Results::DetailsType> frame(
799 new GetAllFrames::Results::DetailsType()); 729 new GetAllFrames::Results::DetailsType());
800 frame->url = frame_url.spec(); 730 frame->url = frame_url.spec();
801 frame->frame_id = helpers::GetFrameId( 731 frame->frame_id = helpers::GetFrameId(*it);
802 navigation_state.IsMainFrame(frame_id), frame_id.frame_num); 732 frame->parent_frame_id = helpers::GetFrameId((*it)->GetParent());
803 frame->parent_frame_id = helpers::GetFrameId( 733 frame->process_id = (*it)->GetRenderViewHost()->GetProcess()->GetID();
804 navigation_state.IsMainFrame(parent_frame_id), 734 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); 735 result_list.push_back(frame);
809 } 736 }
810 results_ = GetAllFrames::Results::Create(result_list); 737 results_ = GetAllFrames::Results::Create(result_list);
811 return true; 738 return true;
812 } 739 }
813 740
814 WebNavigationAPI::WebNavigationAPI(content::BrowserContext* context) 741 WebNavigationAPI::WebNavigationAPI(content::BrowserContext* context)
815 : browser_context_(context) { 742 : browser_context_(context) {
816 EventRouter* event_router = EventRouter::Get(browser_context_); 743 EventRouter* event_router = EventRouter::Get(browser_context_);
817 event_router->RegisterObserver(this, 744 event_router->RegisterObserver(this,
(...skipping 30 matching lines...) Expand all
848 return g_factory.Pointer(); 775 return g_factory.Pointer();
849 } 776 }
850 777
851 void WebNavigationAPI::OnListenerAdded(const EventListenerInfo& details) { 778 void WebNavigationAPI::OnListenerAdded(const EventListenerInfo& details) {
852 web_navigation_event_router_.reset(new WebNavigationEventRouter( 779 web_navigation_event_router_.reset(new WebNavigationEventRouter(
853 Profile::FromBrowserContext(browser_context_))); 780 Profile::FromBrowserContext(browser_context_)));
854 EventRouter::Get(browser_context_)->UnregisterObserver(this); 781 EventRouter::Get(browser_context_)->UnregisterObserver(this);
855 } 782 }
856 783
857 } // namespace extensions 784 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698