Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / extensions / browser / api / guest_view / guest_view_internal_api.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "extensions/browser/api/guest_view/guest_view_internal_api.h"
6
7 #include "content/public/browser/render_process_host.h"
8 #include "content/public/browser/render_view_host.h"
9 #include "extensions/browser/guest_view/guest_view_base.h"
10 #include "extensions/browser/guest_view/guest_view_manager.h"
11 #include "extensions/common/api/guest_view_internal.h"
12 #include "extensions/common/permissions/permissions_data.h"
13
14 namespace guest_view_internal = extensions::core_api::guest_view_internal;
15
16 namespace extensions {
17
18 GuestViewInternalCreateGuestFunction::
19     GuestViewInternalCreateGuestFunction() {
20 }
21
22 bool GuestViewInternalCreateGuestFunction::RunAsync() {
23   std::string view_type;
24   EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &view_type));
25
26   base::DictionaryValue* create_params;
27   EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &create_params));
28
29   GuestViewManager* guest_view_manager =
30       GuestViewManager::FromBrowserContext(browser_context());
31
32   GuestViewManager::WebContentsCreatedCallback callback =
33       base::Bind(&GuestViewInternalCreateGuestFunction::CreateGuestCallback,
34                  this);
35
36   content::WebContents* embedder_web_contents =
37       content::WebContents::FromRenderViewHost(render_view_host());
38   if (!embedder_web_contents) {
39     error_ = "Guest views can only be embedded in web content";
40     return false;
41   }
42   // If the guest is an <extensionoptions> to be embedded in a WebUI, then
43   // there is no extension, and extension() will be null. Use an empty string
44   // instead.
45   std::string embedder_extension_id;
46   if (extension())
47     embedder_extension_id = extension_id();
48
49   guest_view_manager->CreateGuest(view_type,
50                                   embedder_extension_id,
51                                   embedder_web_contents,
52                                   *create_params,
53                                   callback);
54   return true;
55 }
56
57 void GuestViewInternalCreateGuestFunction::CreateGuestCallback(
58     content::WebContents* guest_web_contents) {
59   int guest_instance_id = 0;
60   if (guest_web_contents) {
61     GuestViewBase* guest = GuestViewBase::FromWebContents(guest_web_contents);
62     guest_instance_id = guest->guest_instance_id();
63   }
64   SetResult(new base::FundamentalValue(guest_instance_id));
65   SendResponse(true);
66 }
67
68 GuestViewInternalSetAutoSizeFunction::
69     GuestViewInternalSetAutoSizeFunction() {
70 }
71
72 GuestViewInternalSetAutoSizeFunction::
73     ~GuestViewInternalSetAutoSizeFunction() {
74 }
75
76 bool GuestViewInternalSetAutoSizeFunction::RunAsync() {
77   scoped_ptr<guest_view_internal::SetAutoSize::Params> params(
78       guest_view_internal::SetAutoSize::Params::Create(*args_));
79   EXTENSION_FUNCTION_VALIDATE(params.get());
80   GuestViewBase* guest = GuestViewBase::From(
81       render_view_host()->GetProcess()->GetID(), params->instance_id);
82   if (!guest)
83     return false;
84   guest->SetAutoSize(params->params.enable_auto_size,
85                      gfx::Size(params->params.min.width,
86                                params->params.min.height),
87                      gfx::Size(params->params.max.width,
88                                params->params.max.height));
89   SendResponse(true);
90   return true;
91 }
92
93 }  // namespace extensions