Index: chrome/browser/guest_view/web_view/web_view_guest.cc |
diff --git a/chrome/browser/guest_view/web_view/web_view_guest.cc b/chrome/browser/guest_view/web_view/web_view_guest.cc |
index 465495e7a3c9cfd107f733072dbdaa9218b49dcd..f32dec1f1edfc058fc0e32d468fdc4da66855b8e 100644 |
--- a/chrome/browser/guest_view/web_view/web_view_guest.cc |
+++ b/chrome/browser/guest_view/web_view/web_view_guest.cc |
@@ -23,6 +23,7 @@ |
#include "chrome/browser/renderer_context_menu/context_menu_delegate.h" |
#include "chrome/browser/renderer_context_menu/render_view_context_menu.h" |
#include "chrome/common/chrome_version_info.h" |
+#include "chrome/common/render_messages.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/child_process_security_policy.h" |
#include "content/public/browser/geolocation_permission_context.h" |
@@ -45,6 +46,7 @@ |
#include "content/public/common/stop_find_action.h" |
#include "content/public/common/url_constants.h" |
#include "extensions/common/constants.h" |
+#include "ipc/ipc_message_macros.h" |
#include "net/base/net_errors.h" |
#include "third_party/WebKit/public/web/WebFindOptions.h" |
#include "ui/base/models/simple_menu_model.h" |
@@ -67,6 +69,7 @@ |
#endif |
using base::UserMetricsAction; |
+using content::RenderFrameHost; |
using content::WebContents; |
namespace { |
@@ -310,6 +313,15 @@ scoped_ptr<base::ListValue> WebViewGuest::MenuModelToValue( |
void WebViewGuest::Attach(WebContents* embedder_web_contents, |
const base::DictionaryValue& args) { |
+ std::string name; |
+ args.GetString(webview::kName, &name); |
+ // If the guest window's name is empty, then the WebView tag's name is |
+ // assigned. Otherwise, the guest window's name takes precedence over the |
+ // WebView tag's name. |
+ if (name_.empty()) |
+ name_ = name; |
+ ReportFrameNameChange(name_); |
+ |
std::string user_agent_override; |
if (args.GetString(webview::kParameterUserAgentOverride, |
&user_agent_override)) { |
@@ -467,6 +479,17 @@ void WebViewGuest::LoadAbort(bool is_top_level, |
new GuestViewBase::Event(webview::kEventLoadAbort, args.Pass())); |
} |
+void WebViewGuest::OnUpdateFrameName(bool is_top_level, |
+ const std::string& name) { |
+ if (!is_top_level) |
+ return; |
+ |
+ if (name_ == name) |
+ return; |
+ |
+ ReportFrameNameChange(name); |
+} |
+ |
WebViewGuest* WebViewGuest::CreateNewGuestWindow( |
const content::OpenURLParams& params) { |
@@ -839,6 +862,16 @@ void WebViewGuest::DidStopLoading(content::RenderViewHost* render_view_host) { |
DispatchEvent(new GuestViewBase::Event(webview::kEventLoadStop, args.Pass())); |
} |
+bool WebViewGuest::OnMessageReceived(const IPC::Message& message, |
+ RenderFrameHost* render_frame_host) { |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(WebViewGuest, message) |
+ IPC_MESSAGE_HANDLER(ChromeViewHostMsg_UpdateFrameName, OnUpdateFrameName) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ return handled; |
+} |
+ |
void WebViewGuest::WebContentsDestroyed() { |
// Clean up custom context menu items for this guest. |
extensions::MenuManager* menu_manager = extensions::MenuManager::Get( |
@@ -865,6 +898,18 @@ void WebViewGuest::UserAgentOverrideSet(const std::string& user_agent) { |
guest_web_contents()->GetController().Reload(false); |
} |
+void WebViewGuest::RenderViewReady() { |
+ Send(new ChromeViewMsg_SetName(guest_web_contents()->GetRoutingID(), name_)); |
+} |
+ |
+void WebViewGuest::ReportFrameNameChange(const std::string& name) { |
+ name_ = name; |
+ scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); |
+ args->SetString(webview::kName, name); |
+ DispatchEvent( |
+ new GuestViewBase::Event(webview::kEventFrameNameChanged, args.Pass())); |
+} |
+ |
void WebViewGuest::LoadHandlerCalled() { |
scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); |
DispatchEvent( |
@@ -1205,6 +1250,14 @@ void WebViewGuest::ShowContextMenu(int request_id, |
menu_delegate->ShowMenu(pending_menu_.Pass()); |
} |
+void WebViewGuest::SetName(const std::string& name) { |
+ if (name_ == name) |
+ return; |
+ name_ = name; |
+ |
+ Send(new ChromeViewMsg_SetName(guest_web_contents()->GetRoutingID(), name_)); |
jam
2014/05/21 22:49:53
s/guest_web_contents()->GetRoutingID()/routing_id(
Fady Samuel
2014/05/22 13:36:04
Done.
|
+} |
+ |
void WebViewGuest::Destroy() { |
if (!attached() && GetOpener()) |
GetOpener()->pending_new_windows_.erase(this); |
@@ -1263,6 +1316,7 @@ void WebViewGuest::WebContentsCreated(WebContents* source_contents, |
CHECK(guest); |
guest->SetOpener(this); |
std::string guest_name = base::UTF16ToUTF8(frame_name); |
+ guest->name_ = guest_name; |
pending_new_windows_.insert( |
std::make_pair(guest, NewWindowInfo(target_url, guest_name))); |
} |