Index: content/browser/browser_plugin/browser_plugin_guest.cc |
diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc |
index 716801735cdce5efdc43cda24884a5fad9e2872a..7d05750e55f26a61fd723538d1c45e1149e90566 100644 |
--- a/content/browser/browser_plugin/browser_plugin_guest.cc |
+++ b/content/browser/browser_plugin/browser_plugin_guest.cc |
@@ -14,13 +14,17 @@ |
#include "content/browser/web_contents/web_contents_impl.h" |
#include "content/common/browser_plugin_messages.h" |
#include "content/common/view_messages.h" |
+#include "content/public/browser/notification_service.h" |
+#include "content/public/browser/notification_types.h" |
#include "content/public/browser/render_process_host.h" |
#include "content/public/browser/render_widget_host_view.h" |
+#include "content/public/browser/resource_request_details.h" |
#include "content/public/browser/user_metrics.h" |
#include "content/public/common/result_codes.h" |
#include "content/browser/browser_plugin/browser_plugin_host_factory.h" |
#include "net/base/net_errors.h" |
#include "ui/surface/transport_dib.h" |
+#include "webkit/glue/resource_type.h" |
namespace content { |
@@ -47,6 +51,10 @@ BrowserPluginGuest::BrowserPluginGuest(int instance_id, |
DCHECK(web_contents); |
// |render_view_host| manages the ownership of this BrowserPluginGuestHelper. |
new BrowserPluginGuestHelper(this, render_view_host); |
+ |
+ notification_registrar_.Add( |
+ this, content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, |
+ content::Source<content::WebContents>(web_contents)); |
} |
BrowserPluginGuest::~BrowserPluginGuest() { |
@@ -66,6 +74,27 @@ BrowserPluginGuest* BrowserPluginGuest::Create( |
return new BrowserPluginGuest(instance_id, web_contents, render_view_host); |
} |
+void BrowserPluginGuest::Observe(int type, |
+ const NotificationSource& source, |
+ const NotificationDetails& details) { |
+ switch (type) { |
+ case NOTIFICATION_RESOURCE_RECEIVED_REDIRECT: { |
+ DCHECK_EQ(Source<WebContents>(source).ptr(), web_contents()); |
+ ResourceRedirectDetails* resource_redirect_details = |
+ Details<ResourceRedirectDetails>(details).ptr(); |
+ bool is_top_level = |
+ resource_redirect_details->resource_type == ResourceType::MAIN_FRAME; |
+ LoadRedirect(resource_redirect_details->url, |
+ resource_redirect_details->new_url, |
+ is_top_level); |
+ break; |
+ } |
+ default: |
+ NOTREACHED() << "Unexpected notification sent."; |
+ break; |
+ } |
+} |
+ |
bool BrowserPluginGuest::ViewTakeFocus(bool reverse) { |
SendMessageToEmbedder( |
new BrowserPluginMsg_AdvanceFocus(instance_id(), reverse)); |
@@ -321,6 +350,15 @@ void BrowserPluginGuest::DidFailProvisionalLoad( |
error_type)); |
} |
+void BrowserPluginGuest::LoadRedirect( |
+ const GURL& old_url, |
+ const GURL& new_url, |
+ bool is_top_level) { |
+ SendMessageToEmbedder( |
+ new BrowserPluginMsg_LoadRedirect( |
+ instance_id(), old_url, new_url, is_top_level)); |
+} |
+ |
void BrowserPluginGuest::DidCommitProvisionalLoadForFrame( |
int64 frame_id, |
bool is_main_frame, |