Index: content/renderer/introducer_dispatcher.cc |
=================================================================== |
--- content/renderer/introducer_dispatcher.cc (revision 0) |
+++ content/renderer/introducer_dispatcher.cc (revision 0) |
@@ -0,0 +1,221 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/renderer/introducer_dispatcher.h" |
+ |
+#include "base/id_map.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "content/common/introducer_messages.h" |
+#include "content/common/webmessageportchannel_impl.h" |
+#include "content/renderer/render_view_observer.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebDOMStringList.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebIntroducer.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebIntroducerAcceptCallback.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebIntroducerCallback.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebIntroducerConnectCallback.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebIntroducerInstallCallback.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebURL.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h" |
+ |
+class ConnectCallback : public WebKit::WebIntroducerCallback { |
+public: |
+ ConnectCallback(WebKit::WebMessagePortChannel* service, |
+ const WebKit::WebElement& anchor, |
+ WebKit::WebIntroducerConnectCallback* callback) : |
+ service_(service), |
+ anchor_(anchor), |
+ callback_(callback), |
+ navigated_(false) {} |
+ virtual ~ConnectCallback() {} |
+ |
+ void handleEvent(const WebKit::WebDOMStringList& agreed) { |
+ if (0 == agreed.length()) { |
+ service_->destroy(); |
+ service_ = NULL; |
+ } |
+ callback_->handleEvent(service_, agreed, navigated_); |
+ } |
+ |
+ void navigate(const GURL& src) { |
+ WebKit::WebFrame* frame = WebKit::WebFrame::fromFrameOwnerElement(anchor_); |
+ if (frame) { |
+ frame->loadRequest(WebKit::WebURLRequest(src)); |
+ navigated_ = true; |
+ } |
+ } |
+ |
+private: |
+ WebKit::WebMessagePortChannel* service_; |
+ WebKit::WebElement anchor_; |
+ scoped_ptr<WebKit::WebIntroducerConnectCallback> callback_; |
+ bool navigated_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ConnectCallback); |
+}; |
+ |
+class AcceptCallback : public WebKit::WebIntroducerCallback { |
+public: |
+ AcceptCallback(WebKit::WebMessagePortChannel* customer, |
+ WebKit::WebIntroducerAcceptCallback* callback) : |
+ customer_(customer), |
+ callback_(callback) {} |
+ virtual ~AcceptCallback() {} |
+ |
+ void handleEvent(const WebKit::WebString& origin, |
+ const WebKit::WebDOMStringList& wanted) { |
+ if (0 == wanted.length()) { |
+ customer_->destroy(); |
+ customer_ = NULL; |
+ } else { |
+ callback_->handleEvent(customer_, origin, wanted); |
+ } |
+ } |
+ |
+private: |
+ WebKit::WebMessagePortChannel* customer_; |
+ scoped_ptr<WebKit::WebIntroducerAcceptCallback> callback_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(AcceptCallback); |
+}; |
+ |
+class IntroducerDispatcher : public RenderViewObserver, |
+ public WebKit::WebIntroducer { |
+ public: |
+ explicit IntroducerDispatcher(RenderView* render_view) |
+ : RenderViewObserver(render_view) {} |
+ virtual ~IntroducerDispatcher() {} |
+ |
+ virtual void install(const WebKit::WebSecurityOrigin& origin, |
+ const WebKit::WebURL& icon, |
+ const WebKit::WebString& name, |
+ const WebKit::WebURL& home, |
+ WebKit::WebIntroducerInstallCallback* callback) { |
+ Send(new IntroducerHostMsg_Install(routing_id(), pending_.Add(callback), |
+ origin.toString().utf8(), |
+ icon, name, home)); |
+ } |
+ void OnInstallReturn(int request_id, bool done) { |
+ WebKit::WebIntroducerCallback* cb = pending_.Lookup(request_id); |
+ if (cb) { |
+ static_cast<WebKit::WebIntroducerInstallCallback*>(cb)->handleEvent(done); |
+ } |
+ pending_.Remove(request_id); |
+ } |
+ virtual void uninstall(const WebKit::WebSecurityOrigin& origin) { |
+ Send(new IntroducerHostMsg_Uninstall(routing_id(), pending_.Add(NULL), |
+ origin.toString().utf8())); |
+ } |
+ virtual void offer(const WebKit::WebSecurityOrigin& origin, |
+ const WebKit::WebString& id, |
+ const WebKit::WebString& label, |
+ const WebKit::WebDOMStringList& supports, |
+ const WebKit::WebURL& window, |
+ const WebKit::WebURL& frame) { |
+ IntroducerHostMsg_Offer_Params args; |
+ args.id = id.utf8(); |
+ args.label = label; |
+ args.supports.reserve(supports.length()); |
+ for (unsigned i = 0, end = supports.length(); i != end; ++i) { |
+ args.supports.push_back(supports.item(i).utf8()); |
+ } |
+ args.window = window; |
+ args.frame = frame; |
+ Send(new IntroducerHostMsg_Offer(routing_id(), pending_.Add(NULL), |
+ origin.toString().utf8(), args)); |
+ } |
+ virtual void rescind(const WebKit::WebSecurityOrigin& origin, |
+ const WebKit::WebString& id) { |
+ Send(new IntroducerHostMsg_Rescind(routing_id(), pending_.Add(NULL), |
+ origin.toString().utf8(), id.utf8())); |
+ } |
+ virtual void connect(const WebKit::WebSecurityOrigin& origin, |
+ const WebKit::WebElement& anchor, |
+ const WebKit::WebDOMStringList& wanted, |
+ WebKit::WebIntroducerConnectCallback* callback) { |
+ std::vector<std::string> wanted_arg; |
+ wanted_arg.reserve(wanted.length()); |
+ for (unsigned i = 0, end = wanted.length(); i != end; ++i) { |
+ wanted_arg.push_back(wanted.item(i).utf8()); |
+ } |
+ WebMessagePortChannelImpl* service = new WebMessagePortChannelImpl(); |
+ WebKit::WebFrame* frame = WebKit::WebFrame::fromFrameOwnerElement(anchor); |
+ Send(new IntroducerHostMsg_Connect(routing_id(), |
+ pending_.Add(new ConnectCallback(service, anchor, callback)), |
+ origin.toString().utf8(), |
+ frame ? frame->identifier() : 0, |
+ wanted_arg, |
+ service->message_port_id())); |
+ } |
+ void OnConnectNavigation(int request_id, const GURL& src) { |
+ WebKit::WebIntroducerCallback* cb = pending_.Lookup(request_id); |
+ if (cb) { |
+ static_cast<ConnectCallback*>(cb)->navigate(src); |
+ } |
+ } |
+ void OnConnectReturn(int request_id, const std::vector<std::string>& agreed) { |
+ WebKit::WebIntroducerCallback* cb = pending_.Lookup(request_id); |
+ if (cb) { |
+ WebKit::WebDOMStringList web_agreed; |
+ for (std::vector<std::string>::const_iterator i = agreed.begin(), |
+ end = agreed.end(); |
+ i != end; ++i) { |
+ web_agreed.append(WebKit::WebString::fromUTF8(*i)); |
+ } |
+ static_cast<ConnectCallback*>(cb)->handleEvent(web_agreed); |
+ } |
+ pending_.Remove(request_id); |
+ } |
+ virtual void accept(const WebKit::WebSecurityOrigin& origin, |
+ const WebKit::WebString& registrant, |
+ WebKit::WebIntroducerAcceptCallback* callback) { |
+ WebMessagePortChannelImpl* customer = new WebMessagePortChannelImpl(); |
+ WebKit::WebFrame* frame = WebKit::WebFrame::frameForCurrentContext(); |
+ Send(new IntroducerHostMsg_Accept(routing_id(), |
+ pending_.Add(new AcceptCallback(customer, callback)), |
+ frame->parent() ? frame->identifier() : 0, |
+ registrant.utf8(), |
+ customer->message_port_id())); |
+ } |
+ void OnAcceptReturn(int request_id, |
+ const std::string& origin, |
+ const std::vector<std::string>& wanted) { |
+ WebKit::WebIntroducerCallback* cb = pending_.Lookup(request_id); |
+ if (cb) { |
+ WebKit::WebDOMStringList web_wanted; |
+ for (std::vector<std::string>::const_iterator i = wanted.begin(), |
+ end = wanted.end(); |
+ i != end; ++i) { |
+ web_wanted.append(WebKit::WebString::fromUTF8(*i)); |
+ } |
+ static_cast<AcceptCallback*>(cb)->handleEvent( |
+ WebKit::WebString::fromUTF8(origin), web_wanted); |
+ } |
+ pending_.Remove(request_id); |
+ } |
+ |
+ virtual bool OnMessageReceived(const IPC::Message& message) { |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(IntroducerDispatcher, message) |
+ IPC_MESSAGE_HANDLER(IntroducerMsg_AcceptReturn, OnAcceptReturn); |
+ IPC_MESSAGE_HANDLER(IntroducerMsg_ConnectNavigation, OnConnectNavigation); |
+ IPC_MESSAGE_HANDLER(IntroducerMsg_ConnectReturn, OnConnectReturn); |
+ IPC_MESSAGE_HANDLER(IntroducerMsg_InstallReturn, OnInstallReturn); |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ return handled; |
+ } |
+ |
+ private: |
+ IDMap<WebKit::WebIntroducerCallback,IDMapOwnPointer> pending_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(IntroducerDispatcher); |
+}; |
+ |
+WebKit::WebIntroducer* makeIntroducerDispatcher(RenderView* render_view) { |
+ return new IntroducerDispatcher(render_view); |
+} |
Property changes on: content/renderer/introducer_dispatcher.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |