OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Implements the Chrome Extensions WebNavigation API. | 5 // Implements the Chrome Extensions WebNavigation API. |
6 | 6 |
7 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h" | 7 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h" |
8 | 8 |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "chrome/browser/chrome_notification_types.h" | 10 #include "chrome/browser/chrome_notification_types.h" |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 // that weren't reguarly loaded. | 313 // that weren't reguarly loaded. |
314 if (!navigation_state_.IsValidFrame(render_frame_host)) | 314 if (!navigation_state_.IsValidFrame(render_frame_host)) |
315 return; | 315 return; |
316 | 316 |
317 navigation_state_.SetDocumentLoadCompleted(render_frame_host); | 317 navigation_state_.SetDocumentLoadCompleted(render_frame_host); |
318 if (!navigation_state_.CanSendEvents(render_frame_host)) | 318 if (!navigation_state_.CanSendEvents(render_frame_host)) |
319 return; | 319 return; |
320 | 320 |
321 // A new navigation might have started before the old one completed. | 321 // A new navigation might have started before the old one completed. |
322 // Ignore the old navigation completion in that case. | 322 // Ignore the old navigation completion in that case. |
323 // srcdoc iframes will report a url of about:blank, still let it through. | 323 if (navigation_state_.GetUrl(render_frame_host) != validated_url) |
324 if (navigation_state_.GetUrl(render_frame_host) != validated_url && | |
325 (navigation_state_.GetUrl(render_frame_host) != | |
326 content::kAboutSrcDocURL || | |
327 validated_url != url::kAboutBlankURL)) { | |
328 return; | 324 return; |
329 } | |
330 | 325 |
331 // The load might already have finished by the time we finished parsing. For | 326 // The load might already have finished by the time we finished parsing. For |
332 // compatibility reasons, we artifically delay the load completed signal until | 327 // compatibility reasons, we artifically delay the load completed signal until |
333 // after parsing was completed. | 328 // after parsing was completed. |
334 if (!navigation_state_.GetParsingFinished(render_frame_host)) | 329 if (!navigation_state_.GetParsingFinished(render_frame_host)) |
335 return; | 330 return; |
336 helpers::DispatchOnCompleted(web_contents(), | 331 helpers::DispatchOnCompleted(web_contents(), |
337 render_frame_host, | 332 render_frame_host, |
338 navigation_state_.GetUrl(render_frame_host)); | 333 navigation_state_.GetUrl(render_frame_host)); |
339 } | 334 } |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
392 } | 387 } |
393 | 388 |
394 void WebNavigationTabObserver::HandleCommit( | 389 void WebNavigationTabObserver::HandleCommit( |
395 content::NavigationHandle* navigation_handle) { | 390 content::NavigationHandle* navigation_handle) { |
396 bool is_reference_fragment_navigation = IsReferenceFragmentNavigation( | 391 bool is_reference_fragment_navigation = IsReferenceFragmentNavigation( |
397 navigation_handle->GetRenderFrameHost(), navigation_handle->GetURL()); | 392 navigation_handle->GetRenderFrameHost(), navigation_handle->GetURL()); |
398 | 393 |
399 navigation_state_.StartTrackingDocumentLoad( | 394 navigation_state_.StartTrackingDocumentLoad( |
400 navigation_handle->GetRenderFrameHost(), navigation_handle->GetURL(), | 395 navigation_handle->GetRenderFrameHost(), navigation_handle->GetURL(), |
401 navigation_handle->IsSamePage(), | 396 navigation_handle->IsSamePage(), |
402 false, // is_error_page | 397 false); // is_error_page |
403 navigation_handle->IsSrcdoc()); | |
404 | 398 |
405 events::HistogramValue histogram_value = events::UNKNOWN; | 399 events::HistogramValue histogram_value = events::UNKNOWN; |
406 std::string event_name; | 400 std::string event_name; |
407 if (is_reference_fragment_navigation) { | 401 if (is_reference_fragment_navigation) { |
408 histogram_value = events::WEB_NAVIGATION_ON_REFERENCE_FRAGMENT_UPDATED; | 402 histogram_value = events::WEB_NAVIGATION_ON_REFERENCE_FRAGMENT_UPDATED; |
409 event_name = web_navigation::OnReferenceFragmentUpdated::kEventName; | 403 event_name = web_navigation::OnReferenceFragmentUpdated::kEventName; |
410 } else if (navigation_handle->IsSamePage()) { | 404 } else if (navigation_handle->IsSamePage()) { |
411 histogram_value = events::WEB_NAVIGATION_ON_HISTORY_STATE_UPDATED; | 405 histogram_value = events::WEB_NAVIGATION_ON_HISTORY_STATE_UPDATED; |
412 event_name = web_navigation::OnHistoryStateUpdated::kEventName; | 406 event_name = web_navigation::OnHistoryStateUpdated::kEventName; |
413 } else { | 407 } else { |
414 histogram_value = events::WEB_NAVIGATION_ON_COMMITTED; | 408 histogram_value = events::WEB_NAVIGATION_ON_COMMITTED; |
415 event_name = web_navigation::OnCommitted::kEventName; | 409 event_name = web_navigation::OnCommitted::kEventName; |
416 } | 410 } |
417 helpers::DispatchOnCommitted(histogram_value, event_name, navigation_handle); | 411 helpers::DispatchOnCommitted(histogram_value, event_name, navigation_handle); |
418 } | 412 } |
419 | 413 |
420 void WebNavigationTabObserver::HandleError( | 414 void WebNavigationTabObserver::HandleError( |
421 content::NavigationHandle* navigation_handle) { | 415 content::NavigationHandle* navigation_handle) { |
422 if (navigation_handle->HasCommitted()) { | 416 if (navigation_handle->HasCommitted()) { |
423 navigation_state_.StartTrackingDocumentLoad( | 417 navigation_state_.StartTrackingDocumentLoad( |
424 navigation_handle->GetRenderFrameHost(), navigation_handle->GetURL(), | 418 navigation_handle->GetRenderFrameHost(), navigation_handle->GetURL(), |
425 navigation_handle->IsSamePage(), | 419 navigation_handle->IsSamePage(), |
426 true, // is_error_page | 420 true); // is_error_page |
427 navigation_handle->IsSrcdoc()); | |
428 } | 421 } |
429 | 422 |
430 helpers::DispatchOnErrorOccurred(navigation_handle); | 423 helpers::DispatchOnErrorOccurred(navigation_handle); |
431 } | 424 } |
432 | 425 |
433 // See also NavigationController::IsURLInPageNavigation. | 426 // See also NavigationController::IsURLInPageNavigation. |
434 bool WebNavigationTabObserver::IsReferenceFragmentNavigation( | 427 bool WebNavigationTabObserver::IsReferenceFragmentNavigation( |
435 content::RenderFrameHost* render_frame_host, | 428 content::RenderFrameHost* render_frame_host, |
436 const GURL& url) { | 429 const GURL& url) { |
437 GURL existing_url = navigation_state_.GetUrl(render_frame_host); | 430 GURL existing_url = navigation_state_.GetUrl(render_frame_host); |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
560 return g_factory.Pointer(); | 553 return g_factory.Pointer(); |
561 } | 554 } |
562 | 555 |
563 void WebNavigationAPI::OnListenerAdded(const EventListenerInfo& details) { | 556 void WebNavigationAPI::OnListenerAdded(const EventListenerInfo& details) { |
564 web_navigation_event_router_.reset(new WebNavigationEventRouter( | 557 web_navigation_event_router_.reset(new WebNavigationEventRouter( |
565 Profile::FromBrowserContext(browser_context_))); | 558 Profile::FromBrowserContext(browser_context_))); |
566 EventRouter::Get(browser_context_)->UnregisterObserver(this); | 559 EventRouter::Get(browser_context_)->UnregisterObserver(this); |
567 } | 560 } |
568 | 561 |
569 } // namespace extensions | 562 } // namespace extensions |
OLD | NEW |