Implement support for <extensionoptions> embedding in WebUI
[chromium-blink-merge.git] / chrome / browser / extensions / api / guest_view / guest_view_internal_api.cc
blobcaaadbb798610b4a457a2be7d6004529b91645ac
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.
5 #include "chrome/browser/extensions/api/guest_view/guest_view_internal_api.h"
7 #include "chrome/browser/profiles/profile.h"
8 #include "chrome/common/extensions/api/guest_view_internal.h"
9 #include "content/public/browser/render_process_host.h"
10 #include "content/public/browser/render_view_host.h"
11 #include "extensions/browser/guest_view/guest_view_base.h"
12 #include "extensions/browser/guest_view/guest_view_manager.h"
13 #include "extensions/common/permissions/permissions_data.h"
15 namespace guest_view_internal = extensions::api::guest_view_internal;
17 namespace extensions {
19 GuestViewInternalCreateGuestFunction::
20 GuestViewInternalCreateGuestFunction() {
23 bool GuestViewInternalCreateGuestFunction::RunAsync() {
24 std::string view_type;
25 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &view_type));
27 base::DictionaryValue* create_params;
28 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &create_params));
30 GuestViewManager* guest_view_manager =
31 GuestViewManager::FromBrowserContext(browser_context());
33 GuestViewManager::WebContentsCreatedCallback callback =
34 base::Bind(&GuestViewInternalCreateGuestFunction::CreateGuestCallback,
35 this);
37 content::WebContents* embedder_web_contents =
38 content::WebContents::FromRenderViewHost(render_view_host());
39 if (!embedder_web_contents) {
40 error_ = "Guest views can only be embedded in web content";
41 return false;
43 // If the guest is an <extensionoptions> to be embedded in a WebUI, then
44 // there is no extension, and extension() will be null. Use an empty string
45 // instead.
46 std::string embedder_extension_id;
47 if (extension())
48 embedder_extension_id = extension_id();
50 guest_view_manager->CreateGuest(view_type,
51 embedder_extension_id,
52 embedder_web_contents,
53 *create_params,
54 callback);
55 return true;
58 void GuestViewInternalCreateGuestFunction::CreateGuestCallback(
59 content::WebContents* guest_web_contents) {
60 int guest_instance_id = 0;
61 if (guest_web_contents) {
62 GuestViewBase* guest = GuestViewBase::FromWebContents(guest_web_contents);
63 guest_instance_id = guest->GetGuestInstanceID();
65 SetResult(new base::FundamentalValue(guest_instance_id));
66 SendResponse(true);
69 GuestViewInternalSetAutoSizeFunction::
70 GuestViewInternalSetAutoSizeFunction() {
73 GuestViewInternalSetAutoSizeFunction::
74 ~GuestViewInternalSetAutoSizeFunction() {
77 bool GuestViewInternalSetAutoSizeFunction::RunAsync() {
78 scoped_ptr<guest_view_internal::SetAutoSize::Params> params(
79 guest_view_internal::SetAutoSize::Params::Create(*args_));
80 EXTENSION_FUNCTION_VALIDATE(params.get());
81 GuestViewBase* guest = GuestViewBase::From(
82 render_view_host()->GetProcess()->GetID(), params->instance_id);
83 if (!guest)
84 return false;
85 guest->SetAutoSize(params->params.enable_auto_size,
86 gfx::Size(params->params.min.width,
87 params->params.min.height),
88 gfx::Size(params->params.max.width,
89 params->params.max.height));
90 SendResponse(true);
91 return true;
94 } // namespace extensions