Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(243)

Unified Diff: ppapi/proxy/plugin_globals.cc

Issue 11299147: Pepper proxy: make the browser sender handle the proxy lock properly. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ppapi/proxy/plugin_globals.cc
diff --git a/ppapi/proxy/plugin_globals.cc b/ppapi/proxy/plugin_globals.cc
index 75369d0c88f49cc29d23be4df9db08e898e08b08..232adbbbf0adb9703d5e39c883fd08a5d1af0939 100644
--- a/ppapi/proxy/plugin_globals.cc
+++ b/ppapi/proxy/plugin_globals.cc
@@ -4,14 +4,46 @@
#include "ppapi/proxy/plugin_globals.h"
+#include "ipc/ipc_message.h"
+#include "ipc/ipc_sender.h"
#include "ppapi/proxy/plugin_dispatcher.h"
#include "ppapi/proxy/plugin_proxy_delegate.h"
#include "ppapi/proxy/ppb_message_loop_proxy.h"
+#include "ppapi/shared_impl/proxy_lock.h"
#include "ppapi/thunk/enter.h"
namespace ppapi {
namespace proxy {
+// It performs necessary locking/unlocking of the proxy lock, and forwards all
+// messages to the underlying sender.
+class PluginGlobals::BrowserSender : public IPC::Sender {
+ public:
+ // |underlying_sender| must outlive this object.
+ explicit BrowserSender(IPC::Sender* underlying_sender)
+ : underlying_sender_(underlying_sender) {
+ }
+
+ virtual ~BrowserSender() {}
+
+ // IPC::Sender implementation.
+ virtual bool Send(IPC::Message* msg) OVERRIDE {
+ if (msg->is_sync()) {
+ // Synchronous messages might be re-entrant, so we need to drop the lock.
+ ProxyAutoUnlock unlock;
+ return underlying_sender_->Send(msg);
+ }
+
+ return underlying_sender_->Send(msg);
+ }
+
+ private:
+ // Non-owning pointer.
+ IPC::Sender* underlying_sender_;
+
+ DISALLOW_COPY_AND_ASSIGN(BrowserSender);
+};
+
PluginGlobals* PluginGlobals::plugin_globals_ = NULL;
PluginGlobals::PluginGlobals()
@@ -76,6 +108,7 @@ std::string PluginGlobals::GetCmdLine() {
}
void PluginGlobals::PreCacheFontForFlash(const void* logfontw) {
+ ProxyAutoUnlock unlock;
yzshen1 2012/11/22 00:42:29 This is a little ugly, because unlocking here impl
plugin_proxy_delegate_->PreCacheFont(logfontw);
}
@@ -109,6 +142,23 @@ MessageLoopShared* PluginGlobals::GetCurrentMessageLoop() {
return MessageLoopResource::GetCurrent();
}
+IPC::Sender* PluginGlobals::GetBrowserSender() {
+ if (!browser_sender_.get()) {
+ browser_sender_.reset(
+ new BrowserSender(plugin_proxy_delegate_->GetBrowserSender()));
+ }
+
+ return browser_sender_.get();
+}
+
+std::string PluginGlobals::GetUILanguage() {
+ return plugin_proxy_delegate_->GetUILanguage();
+}
+
+void PluginGlobals::SetActiveURL(const std::string& url) {
+ plugin_proxy_delegate_->SetActiveURL(url);
+}
+
MessageLoopResource* PluginGlobals::loop_for_main_thread() {
return loop_for_main_thread_.get();
}

Powered by Google App Engine
This is Rietveld 408576698