Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / guest_view / guest_view_internal_api.cc
index 41d1191..caaadbb 100644 (file)
@@ -4,37 +4,89 @@
 
 #include "chrome/browser/extensions/api/guest_view/guest_view_internal_api.h"
 
-#include "chrome/browser/guest_view/guest_view_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/extensions/api/guest_view_internal.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_view_host.h"
+#include "extensions/browser/guest_view/guest_view_base.h"
+#include "extensions/browser/guest_view/guest_view_manager.h"
 #include "extensions/common/permissions/permissions_data.h"
 
-namespace {
-const char* kWebViewPermissionRequiredError =
-    "\"webview\" permission is required for allocating instance ID.";
-}  // namespace
+namespace guest_view_internal = extensions::api::guest_view_internal;
 
 namespace extensions {
 
-GuestViewInternalAllocateInstanceIdFunction::
-    GuestViewInternalAllocateInstanceIdFunction() {
+GuestViewInternalCreateGuestFunction::
+    GuestViewInternalCreateGuestFunction() {
 }
 
-bool GuestViewInternalAllocateInstanceIdFunction::RunAsync() {
-  EXTENSION_FUNCTION_VALIDATE(!args_->GetSize());
+bool GuestViewInternalCreateGuestFunction::RunAsync() {
+  std::string view_type;
+  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &view_type));
 
+  base::DictionaryValue* create_params;
+  EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &create_params));
 
-  if (!GetExtension()->permissions_data()->HasAPIPermission(
-          APIPermission::kWebView)) {
-    LOG(ERROR) << kWebViewPermissionRequiredError;
-    error_ = kWebViewPermissionRequiredError;
-    SendResponse(false);
+  GuestViewManager* guest_view_manager =
+      GuestViewManager::FromBrowserContext(browser_context());
+
+  GuestViewManager::WebContentsCreatedCallback callback =
+      base::Bind(&GuestViewInternalCreateGuestFunction::CreateGuestCallback,
+                 this);
+
+  content::WebContents* embedder_web_contents =
+      content::WebContents::FromRenderViewHost(render_view_host());
+  if (!embedder_web_contents) {
+    error_ = "Guest views can only be embedded in web content";
     return false;
   }
+  // If the guest is an <extensionoptions> to be embedded in a WebUI, then
+  // there is no extension, and extension() will be null. Use an empty string
+  // instead.
+  std::string embedder_extension_id;
+  if (extension())
+    embedder_extension_id = extension_id();
+
+  guest_view_manager->CreateGuest(view_type,
+                                  embedder_extension_id,
+                                  embedder_web_contents,
+                                  *create_params,
+                                  callback);
+  return true;
+}
+
+void GuestViewInternalCreateGuestFunction::CreateGuestCallback(
+    content::WebContents* guest_web_contents) {
+  int guest_instance_id = 0;
+  if (guest_web_contents) {
+    GuestViewBase* guest = GuestViewBase::FromWebContents(guest_web_contents);
+    guest_instance_id = guest->GetGuestInstanceID();
+  }
+  SetResult(new base::FundamentalValue(guest_instance_id));
+  SendResponse(true);
+}
+
+GuestViewInternalSetAutoSizeFunction::
+    GuestViewInternalSetAutoSizeFunction() {
+}
 
-  int instanceId = GuestViewManager::FromBrowserContext(browser_context())
-                       ->GetNextInstanceID();
-  SetResult(base::Value::CreateIntegerValue(instanceId));
+GuestViewInternalSetAutoSizeFunction::
+    ~GuestViewInternalSetAutoSizeFunction() {
+}
+
+bool GuestViewInternalSetAutoSizeFunction::RunAsync() {
+  scoped_ptr<guest_view_internal::SetAutoSize::Params> params(
+      guest_view_internal::SetAutoSize::Params::Create(*args_));
+  EXTENSION_FUNCTION_VALIDATE(params.get());
+  GuestViewBase* guest = GuestViewBase::From(
+      render_view_host()->GetProcess()->GetID(), params->instance_id);
+  if (!guest)
+    return false;
+  guest->SetAutoSize(params->params.enable_auto_size,
+                     gfx::Size(params->params.min.width,
+                               params->params.min.height),
+                     gfx::Size(params->params.max.width,
+                               params->params.max.height));
   SendResponse(true);
   return true;
 }