Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / ppapi / proxy / plugin_globals.cc
index d361ae1..63bcb44 100644 (file)
@@ -172,7 +172,7 @@ base::TaskRunner* PluginGlobals::GetFileTaskRunner() {
     options.message_loop_type = base::MessageLoop::TYPE_IO;
     file_thread_->StartWithOptions(options);
   }
-  return file_thread_->message_loop_proxy();
+  return file_thread_->message_loop_proxy().get();
 }
 
 void PluginGlobals::MarkPluginIsActive() {
@@ -192,11 +192,13 @@ void PluginGlobals::MarkPluginIsActive() {
 }
 
 IPC::Sender* PluginGlobals::GetBrowserSender() {
-  if (!browser_sender_.get()) {
-    browser_sender_.reset(
-        new BrowserSender(plugin_proxy_delegate_->GetBrowserSender()));
-  }
-
+  // CAUTION: This function is called without the ProxyLock. See also
+  // InterfaceList::GetInterfaceForPPB.
+  //
+  // See also SetPluginProxyDelegate. That initializes browser_sender_ before
+  // the plugin can start threads, and it may be cleared after the
+  // plugin has torn down threads. So this pointer is expected to remain valid
+  // during the lifetime of the plugin.
   return browser_sender_.get();
 }
 
@@ -217,6 +219,19 @@ PP_Resource PluginGlobals::CreateBrowserFont(
       connection, instance, desc, prefs);
 }
 
+void PluginGlobals::SetPluginProxyDelegate(PluginProxyDelegate* delegate) {
+  DCHECK(delegate && !plugin_proxy_delegate_);
+  plugin_proxy_delegate_ = delegate;
+  browser_sender_.reset(
+      new BrowserSender(plugin_proxy_delegate_->GetBrowserSender()));
+}
+
+void PluginGlobals::ResetPluginProxyDelegate() {
+  DCHECK(plugin_proxy_delegate_);
+  plugin_proxy_delegate_ = NULL;
+  browser_sender_.reset();
+}
+
 MessageLoopResource* PluginGlobals::loop_for_main_thread() {
   return loop_for_main_thread_.get();
 }