Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / content / renderer / browser_plugin / browser_plugin_manager.cc
index f5bd397..16cc98e 100644 (file)
@@ -4,27 +4,21 @@
 
 #include "content/renderer/browser_plugin/browser_plugin_manager.h"
 
-#include "base/lazy_instance.h"
 #include "base/memory/scoped_ptr.h"
-#include "base/threading/thread_local.h"
-#include "base/values.h"
 #include "content/common/browser_plugin/browser_plugin_constants.h"
+#include "content/common/browser_plugin/browser_plugin_messages.h"
+#include "content/common/frame_messages.h"
+#include "content/public/renderer/browser_plugin_delegate.h"
 #include "content/public/renderer/render_thread.h"
 #include "content/renderer/browser_plugin/browser_plugin.h"
-#include "content/renderer/browser_plugin/browser_plugin_manager_factory.h"
-#include "content/renderer/browser_plugin/browser_plugin_manager_impl.h"
+#include "ipc/ipc_message_macros.h"
 
 namespace content {
 
 // static
-BrowserPluginManagerFactory* BrowserPluginManager::factory_ = NULL;
-
-// static
 BrowserPluginManager* BrowserPluginManager::Create(
     RenderViewImpl* render_view) {
-  if (factory_)
-    return factory_->CreateBrowserPluginManager(render_view);
-  return new BrowserPluginManagerImpl(render_view);
+  return new BrowserPluginManager(render_view);
 }
 
 BrowserPluginManager::BrowserPluginManager(RenderViewImpl* render_view)
@@ -77,4 +71,62 @@ void BrowserPluginManager::Attach(int browser_plugin_instance_id) {
     plugin->Attach();
 }
 
+BrowserPlugin* BrowserPluginManager::CreateBrowserPlugin(
+    RenderViewImpl* render_view,
+    blink::WebFrame* frame,
+    scoped_ptr<BrowserPluginDelegate> delegate) {
+  return new BrowserPlugin(render_view, frame, delegate.Pass());
+}
+
+void BrowserPluginManager::DidCommitCompositorFrame() {
+  IDMap<BrowserPlugin>::iterator iter(&instances_);
+  while (!iter.IsAtEnd()) {
+    iter.GetCurrentValue()->DidCommitCompositorFrame();
+    iter.Advance();
+  }
+}
+
+bool BrowserPluginManager::OnMessageReceived(
+    const IPC::Message& message) {
+  if (!BrowserPlugin::ShouldForwardToBrowserPlugin(message))
+    return false;
+
+  int browser_plugin_instance_id = browser_plugin::kInstanceIDNone;
+  // All allowed messages must have |browser_plugin_instance_id| as their
+  // first parameter.
+  PickleIterator iter(message);
+  bool success = iter.ReadInt(&browser_plugin_instance_id);
+  DCHECK(success);
+  BrowserPlugin* plugin = GetBrowserPlugin(browser_plugin_instance_id);
+  if (plugin && plugin->OnMessageReceived(message))
+    return true;
+
+  // TODO(fsamuel): This is probably forcing the compositor to continue working
+  // even on display:none. We should optimize this.
+  if (message.type() == BrowserPluginMsg_CompositorFrameSwapped::ID) {
+    OnCompositorFrameSwappedPluginUnavailable(message);
+    return true;
+  }
+
+  return false;
+}
+
+bool BrowserPluginManager::Send(IPC::Message* msg) {
+  return RenderThread::Get()->Send(msg);
+}
+
+void BrowserPluginManager::OnCompositorFrameSwappedPluginUnavailable(
+    const IPC::Message& message) {
+  BrowserPluginMsg_CompositorFrameSwapped::Param param;
+  if (!BrowserPluginMsg_CompositorFrameSwapped::Read(&message, &param))
+    return;
+
+  FrameHostMsg_CompositorFrameSwappedACK_Params params;
+  params.producing_host_id = param.b.producing_host_id;
+  params.producing_route_id = param.b.producing_route_id;
+  params.output_surface_id = param.b.output_surface_id;
+  Send(new BrowserPluginHostMsg_CompositorFrameSwappedACK(
+      routing_id(), param.a, params));
+}
+
 }  // namespace content