| Index: chrome/browser/tab_contents/tab_contents.cc
|
| ===================================================================
|
| --- chrome/browser/tab_contents/tab_contents.cc (revision 70223)
|
| +++ chrome/browser/tab_contents/tab_contents.cc (working copy)
|
| @@ -10,6 +10,7 @@
|
| #include "app/resource_bundle.h"
|
| #include "base/auto_reset.h"
|
| #include "base/metrics/histogram.h"
|
| +#include "base/metrics/stats_counters.h"
|
| #include "base/string16.h"
|
| #include "base/string_util.h"
|
| #include "base/time.h"
|
| @@ -21,6 +22,7 @@
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/browser_shutdown.h"
|
| #include "chrome/browser/character_encoding.h"
|
| +#include "chrome/browser/child_process_security_policy.h"
|
| #include "chrome/browser/content_settings/content_settings_details.h"
|
| #include "chrome/browser/content_settings/host_content_settings_map.h"
|
| #include "chrome/browser/debugger/devtools_manager.h"
|
| @@ -44,6 +46,7 @@
|
| #include "chrome/browser/load_from_memory_cache_details.h"
|
| #include "chrome/browser/load_notification_details.h"
|
| #include "chrome/browser/metrics/metric_event_duration_details.h"
|
| +#include "chrome/browser/metrics/user_metrics.h"
|
| #include "chrome/browser/modal_html_dialog_delegate.h"
|
| #include "chrome/browser/omnibox_search_hint.h"
|
| #include "chrome/browser/platform_util.h"
|
| @@ -548,6 +551,36 @@
|
| IDS_STATIC_ENCODING_LIST);
|
| }
|
|
|
| +bool TabContents::OnMessageReceived(const IPC::Message& message) {
|
| + bool handled = true;
|
| + bool message_is_ok = true;
|
| + IPC_BEGIN_MESSAGE_MAP_EX(TabContents, message, message_is_ok)
|
| + IPC_MESSAGE_HANDLER(ViewHostMsg_DidStartProvisionalLoadForFrame,
|
| + OnDidStartProvisionalLoadForFrame)
|
| + IPC_MESSAGE_HANDLER(ViewHostMsg_DidRedirectProvisionalLoad,
|
| + OnDidRedirectProvisionalLoad)
|
| + IPC_MESSAGE_HANDLER(ViewHostMsg_DidFailProvisionalLoadWithError,
|
| + OnDidFailProvisionalLoadWithError)
|
| + IPC_MESSAGE_HANDLER(ViewHostMsg_DidLoadResourceFromMemoryCache,
|
| + OnDidLoadResourceFromMemoryCache)
|
| + IPC_MESSAGE_HANDLER(ViewHostMsg_DidDisplayInsecureContent,
|
| + OnDidDisplayInsecureContent)
|
| + IPC_MESSAGE_HANDLER(ViewHostMsg_DidRunInsecureContent,
|
| + OnDidRunInsecureContent)
|
| + IPC_MESSAGE_HANDLER(ViewHostMsg_DocumentLoadedInFrame,
|
| + OnDocumentLoadedInFrame)
|
| + IPC_MESSAGE_HANDLER(ViewHostMsg_DidFinishLoad, OnDidFinishLoad)
|
| + IPC_MESSAGE_UNHANDLED(handled = false)
|
| + IPC_END_MESSAGE_MAP_EX()
|
| +
|
| + if (!message_is_ok) {
|
| + UserMetrics::RecordAction(UserMetricsAction("BadMessageTerminate_RVD"));
|
| + GetRenderProcessHost()->ReceivedBadMessage();
|
| + }
|
| +
|
| + return handled;
|
| +}
|
| +
|
| // Returns true if contains content rendered by an extension.
|
| bool TabContents::HostsExtension() const {
|
| return GetURL().SchemeIs(chrome::kExtensionScheme);
|
| @@ -1555,6 +1588,159 @@
|
| delegate_->ViewSourceForTab(this, active_entry->url());
|
| }
|
|
|
| +void TabContents::OnDidStartProvisionalLoadForFrame(int64 frame_id,
|
| + bool is_main_frame,
|
| + const GURL& url) {
|
| + bool is_error_page = (url.spec() == chrome::kUnreachableWebDataURL);
|
| + GURL validated_url(url);
|
| + render_view_host()->FilterURL(ChildProcessSecurityPolicy::GetInstance(),
|
| + GetRenderProcessHost()->id(), &validated_url);
|
| +
|
| + ProvisionalLoadDetails details(
|
| + is_main_frame,
|
| + controller_.IsURLInPageNavigation(validated_url),
|
| + validated_url, std::string(), false, is_error_page, frame_id);
|
| + NotificationService::current()->Notify(
|
| + NotificationType::FRAME_PROVISIONAL_LOAD_START,
|
| + Source<NavigationController>(&controller_),
|
| + Details<ProvisionalLoadDetails>(&details));
|
| + if (is_main_frame) {
|
| + // If we're displaying a network error page do not reset the content
|
| + // settings delegate's cookies so the user has a chance to modify cookie
|
| + // settings.
|
| + if (!is_error_page)
|
| + content_settings_delegate_->ClearCookieSpecificContentSettings();
|
| + content_settings_delegate_->ClearGeolocationContentSettings();
|
| + }
|
| +}
|
| +
|
| +void TabContents::OnDidRedirectProvisionalLoad(int32 page_id,
|
| + const GURL& source_url,
|
| + const GURL& target_url) {
|
| + NavigationEntry* entry;
|
| + if (page_id == -1)
|
| + entry = controller_.pending_entry();
|
| + else
|
| + entry = controller_.GetEntryWithPageID(GetSiteInstance(), page_id);
|
| + if (!entry || entry->url() != source_url)
|
| + return;
|
| + entry->set_url(target_url);
|
| +}
|
| +
|
| +void TabContents::OnDidFailProvisionalLoadWithError(
|
| + int64 frame_id,
|
| + bool is_main_frame,
|
| + int error_code,
|
| + const GURL& url,
|
| + bool showing_repost_interstitial) {
|
| + VLOG(1) << "Failed Provisional Load: " << url.possibly_invalid_spec()
|
| + << ", error_code: " << error_code
|
| + << " is_main_frame: " << is_main_frame
|
| + << " showing_repost_interstitial: " << showing_repost_interstitial
|
| + << " frame_id: " << frame_id;
|
| + GURL validated_url(url);
|
| + render_view_host()->FilterURL(ChildProcessSecurityPolicy::GetInstance(),
|
| + GetRenderProcessHost()->id(), &validated_url);
|
| +
|
| + if (net::ERR_ABORTED == error_code) {
|
| + // EVIL HACK ALERT! Ignore failed loads when we're showing interstitials.
|
| + // This means that the interstitial won't be torn down properly, which is
|
| + // bad. But if we have an interstitial, go back to another tab type, and
|
| + // then load the same interstitial again, we could end up getting the first
|
| + // interstitial's "failed" message (as a result of the cancel) when we're on
|
| + // the second one.
|
| + //
|
| + // We can't tell this apart, so we think we're tearing down the current page
|
| + // which will cause a crash later one. There is also some code in
|
| + // RenderViewHostManager::RendererAbortedProvisionalLoad that is commented
|
| + // out because of this problem.
|
| + //
|
| + // http://code.google.com/p/chromium/issues/detail?id=2855
|
| + // Because this will not tear down the interstitial properly, if "back" is
|
| + // back to another tab type, the interstitial will still be somewhat alive
|
| + // in the previous tab type. If you navigate somewhere that activates the
|
| + // tab with the interstitial again, you'll see a flash before the new load
|
| + // commits of the interstitial page.
|
| + if (showing_interstitial_page()) {
|
| + LOG(WARNING) << "Discarding message during interstitial.";
|
| + return;
|
| + }
|
| +
|
| + // This will discard our pending entry if we cancelled the load (e.g., if we
|
| + // decided to download the file instead of load it). Only discard the
|
| + // pending entry if the URLs match, otherwise the user initiated a navigate
|
| + // before the page loaded so that the discard would discard the wrong entry.
|
| + NavigationEntry* pending_entry = controller_.pending_entry();
|
| + if (pending_entry && pending_entry->url() == validated_url) {
|
| + controller_.DiscardNonCommittedEntries();
|
| + // Update the URL display.
|
| + NotifyNavigationStateChanged(TabContents::INVALIDATE_URL);
|
| + }
|
| +
|
| + render_manager_.RendererAbortedProvisionalLoad(render_view_host());
|
| + }
|
| +
|
| + // Send out a notification that we failed a provisional load with an error.
|
| + ProvisionalLoadDetails details(
|
| + is_main_frame, controller_.IsURLInPageNavigation(validated_url),
|
| + validated_url, std::string(), false, false, frame_id);
|
| + details.set_error_code(error_code);
|
| +
|
| + NotificationService::current()->Notify(
|
| + NotificationType::FAIL_PROVISIONAL_LOAD_WITH_ERROR,
|
| + Source<NavigationController>(&controller_),
|
| + Details<ProvisionalLoadDetails>(&details));
|
| +}
|
| +
|
| +void TabContents::OnDidLoadResourceFromMemoryCache(
|
| + const GURL& url,
|
| + const std::string& frame_origin,
|
| + const std::string& main_frame_origin,
|
| + const std::string& security_info) {
|
| + static base::StatsCounter cache("WebKit.CacheHit");
|
| + cache.Increment();
|
| +
|
| + // Send out a notification that we loaded a resource from our memory cache.
|
| + int cert_id = 0, cert_status = 0, security_bits = -1, connection_status = 0;
|
| + SSLManager::DeserializeSecurityInfo(security_info,
|
| + &cert_id, &cert_status,
|
| + &security_bits,
|
| + &connection_status);
|
| + LoadFromMemoryCacheDetails details(url, frame_origin, main_frame_origin,
|
| + GetRenderProcessHost()->id(), cert_id,
|
| + cert_status);
|
| +
|
| + NotificationService::current()->Notify(
|
| + NotificationType::LOAD_FROM_MEMORY_CACHE,
|
| + Source<NavigationController>(&controller_),
|
| + Details<LoadFromMemoryCacheDetails>(&details));
|
| +}
|
| +
|
| +void TabContents::OnDidDisplayInsecureContent() {
|
| + displayed_insecure_content_ = true;
|
| + SSLManager::NotifySSLInternalStateChanged();
|
| +}
|
| +
|
| +void TabContents::OnDidRunInsecureContent(
|
| + const std::string& security_origin) {
|
| + controller_.ssl_manager()->DidRunInsecureContent(security_origin);
|
| +}
|
| +
|
| +void TabContents::OnDocumentLoadedInFrame(int64 frame_id) {
|
| + controller_.DocumentLoadedInFrame();
|
| + NotificationService::current()->Notify(
|
| + NotificationType::FRAME_DOM_CONTENT_LOADED,
|
| + Source<NavigationController>(&controller_),
|
| + Details<int64>(&frame_id));
|
| +}
|
| +
|
| +void TabContents::OnDidFinishLoad(int64 frame_id) {
|
| + NotificationService::current()->Notify(
|
| + NotificationType::FRAME_DID_FINISH_LOAD,
|
| + Source<NavigationController>(&controller_),
|
| + Details<int64>(&frame_id));
|
| +}
|
| +
|
| // Notifies the RenderWidgetHost instance about the fact that the page is
|
| // loading, or done loading and calls the base implementation.
|
| void TabContents::SetIsLoading(bool is_loading,
|
| @@ -2189,148 +2375,6 @@
|
| delegate()->OnInstantSupportDetermined(page_id, result);
|
| }
|
|
|
| -void TabContents::DidStartProvisionalLoadForFrame(
|
| - RenderViewHost* render_view_host,
|
| - int64 frame_id,
|
| - bool is_main_frame,
|
| - bool is_error_page,
|
| - const GURL& url) {
|
| - ProvisionalLoadDetails details(is_main_frame,
|
| - controller_.IsURLInPageNavigation(url),
|
| - url, std::string(), false,
|
| - is_error_page, frame_id);
|
| - NotificationService::current()->Notify(
|
| - NotificationType::FRAME_PROVISIONAL_LOAD_START,
|
| - Source<NavigationController>(&controller_),
|
| - Details<ProvisionalLoadDetails>(&details));
|
| - if (is_main_frame) {
|
| - // If we're displaying a network error page do not reset the content
|
| - // settings delegate's cookies so the user has a chance to modify cookie
|
| - // settings.
|
| - if (!is_error_page)
|
| - content_settings_delegate_->ClearCookieSpecificContentSettings();
|
| - content_settings_delegate_->ClearGeolocationContentSettings();
|
| - }
|
| -}
|
| -
|
| -void TabContents::DidStartReceivingResourceResponse(
|
| - const ResourceRequestDetails& details) {
|
| - NotificationService::current()->Notify(
|
| - NotificationType::RESOURCE_RESPONSE_STARTED,
|
| - Source<NavigationController>(&controller()),
|
| - Details<const ResourceRequestDetails>(&details));
|
| -}
|
| -
|
| -void TabContents::DidRedirectResource(
|
| - const ResourceRedirectDetails& details) {
|
| - NotificationService::current()->Notify(
|
| - NotificationType::RESOURCE_RECEIVED_REDIRECT,
|
| - Source<NavigationController>(&controller()),
|
| - Details<const ResourceRequestDetails>(&details));
|
| -}
|
| -
|
| -void TabContents::DidLoadResourceFromMemoryCache(
|
| - const GURL& url,
|
| - const std::string& frame_origin,
|
| - const std::string& main_frame_origin,
|
| - const std::string& security_info) {
|
| - // Send out a notification that we loaded a resource from our memory cache.
|
| - int cert_id = 0, cert_status = 0, security_bits = -1, connection_status = 0;
|
| - SSLManager::DeserializeSecurityInfo(security_info,
|
| - &cert_id, &cert_status,
|
| - &security_bits,
|
| - &connection_status);
|
| - LoadFromMemoryCacheDetails details(url, frame_origin, main_frame_origin,
|
| - GetRenderProcessHost()->id(), cert_id,
|
| - cert_status);
|
| -
|
| - NotificationService::current()->Notify(
|
| - NotificationType::LOAD_FROM_MEMORY_CACHE,
|
| - Source<NavigationController>(&controller_),
|
| - Details<LoadFromMemoryCacheDetails>(&details));
|
| -}
|
| -
|
| -void TabContents::DidDisplayInsecureContent() {
|
| - displayed_insecure_content_ = true;
|
| - SSLManager::NotifySSLInternalStateChanged();
|
| -}
|
| -
|
| -void TabContents::DidRunInsecureContent(const std::string& security_origin) {
|
| - controller_.ssl_manager()->DidRunInsecureContent(security_origin);
|
| -}
|
| -
|
| -void TabContents::DidFailProvisionalLoadWithError(
|
| - RenderViewHost* render_view_host,
|
| - int64 frame_id,
|
| - bool is_main_frame,
|
| - int error_code,
|
| - const GURL& url,
|
| - bool showing_repost_interstitial) {
|
| - if (net::ERR_ABORTED == error_code) {
|
| - // EVIL HACK ALERT! Ignore failed loads when we're showing interstitials.
|
| - // This means that the interstitial won't be torn down properly, which is
|
| - // bad. But if we have an interstitial, go back to another tab type, and
|
| - // then load the same interstitial again, we could end up getting the first
|
| - // interstitial's "failed" message (as a result of the cancel) when we're on
|
| - // the second one.
|
| - //
|
| - // We can't tell this apart, so we think we're tearing down the current page
|
| - // which will cause a crash later one. There is also some code in
|
| - // RenderViewHostManager::RendererAbortedProvisionalLoad that is commented
|
| - // out because of this problem.
|
| - //
|
| - // http://code.google.com/p/chromium/issues/detail?id=2855
|
| - // Because this will not tear down the interstitial properly, if "back" is
|
| - // back to another tab type, the interstitial will still be somewhat alive
|
| - // in the previous tab type. If you navigate somewhere that activates the
|
| - // tab with the interstitial again, you'll see a flash before the new load
|
| - // commits of the interstitial page.
|
| - if (showing_interstitial_page()) {
|
| - LOG(WARNING) << "Discarding message during interstitial.";
|
| - return;
|
| - }
|
| -
|
| - // This will discard our pending entry if we cancelled the load (e.g., if we
|
| - // decided to download the file instead of load it). Only discard the
|
| - // pending entry if the URLs match, otherwise the user initiated a navigate
|
| - // before the page loaded so that the discard would discard the wrong entry.
|
| - NavigationEntry* pending_entry = controller_.pending_entry();
|
| - if (pending_entry && pending_entry->url() == url) {
|
| - controller_.DiscardNonCommittedEntries();
|
| - // Update the URL display.
|
| - NotifyNavigationStateChanged(TabContents::INVALIDATE_URL);
|
| - }
|
| -
|
| - render_manager_.RendererAbortedProvisionalLoad(render_view_host);
|
| - }
|
| -
|
| - // Send out a notification that we failed a provisional load with an error.
|
| - ProvisionalLoadDetails details(is_main_frame,
|
| - controller_.IsURLInPageNavigation(url),
|
| - url, std::string(), false, false, frame_id);
|
| - details.set_error_code(error_code);
|
| -
|
| - NotificationService::current()->Notify(
|
| - NotificationType::FAIL_PROVISIONAL_LOAD_WITH_ERROR,
|
| - Source<NavigationController>(&controller_),
|
| - Details<ProvisionalLoadDetails>(&details));
|
| -}
|
| -
|
| -void TabContents::DocumentLoadedInFrame(int64 frame_id) {
|
| - controller_.DocumentLoadedInFrame();
|
| - NotificationService::current()->Notify(
|
| - NotificationType::FRAME_DOM_CONTENT_LOADED,
|
| - Source<NavigationController>(&controller_),
|
| - Details<int64>(&frame_id));
|
| -}
|
| -
|
| -void TabContents::DidFinishLoad(int64 frame_id) {
|
| - NotificationService::current()->Notify(
|
| - NotificationType::FRAME_DID_FINISH_LOAD,
|
| - Source<NavigationController>(&controller_),
|
| - Details<int64>(&frame_id));
|
| -}
|
| -
|
| void TabContents::OnContentSettingsAccessed(bool content_was_blocked) {
|
| if (delegate_)
|
| delegate_->OnContentSettingsChange(this);
|
| @@ -2350,10 +2394,6 @@
|
| return this;
|
| }
|
|
|
| -RenderViewHostDelegate::Resource* TabContents::GetResourceDelegate() {
|
| - return this;
|
| -}
|
| -
|
| RenderViewHostDelegate::ContentSettings*
|
| TabContents::GetContentSettingsDelegate() {
|
| return content_settings_delegate_.get();
|
| @@ -2773,19 +2813,6 @@
|
| Details<int>(&page_id));
|
| }
|
|
|
| -void TabContents::DidRedirectProvisionalLoad(int32 page_id,
|
| - const GURL& source_url,
|
| - const GURL& target_url) {
|
| - NavigationEntry* entry;
|
| - if (page_id == -1)
|
| - entry = controller_.pending_entry();
|
| - else
|
| - entry = controller_.GetEntryWithPageID(GetSiteInstance(), page_id);
|
| - if (!entry || entry->url() != source_url)
|
| - return;
|
| - entry->set_url(target_url);
|
| -}
|
| -
|
| void TabContents::RequestOpenURL(const GURL& url, const GURL& referrer,
|
| WindowOpenDisposition disposition) {
|
| if (render_manager_.dom_ui()) {
|
|
|