• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 "chrome/browser/ui/gtk/infobars/extension_infobar_gtk.h"
6 
7 #include "chrome/browser/extensions/extension_host.h"
8 #include "chrome/common/extensions/extension.h"
9 #include "chrome/common/extensions/extension_icon_set.h"
10 #include "chrome/common/extensions/extension_resource.h"
11 #include "content/browser/renderer_host/render_view_host.h"
12 #include "content/browser/renderer_host/render_widget_host_view.h"
13 #include "grit/theme_resources.h"
14 #include "ui/base/resource/resource_bundle.h"
15 #include "ui/gfx/gtk_util.h"
16 
ExtensionInfoBarGtk(ExtensionInfoBarDelegate * delegate)17 ExtensionInfoBarGtk::ExtensionInfoBarGtk(ExtensionInfoBarDelegate* delegate)
18     : InfoBar(delegate),
19       tracker_(this),
20       delegate_(delegate),
21       view_(NULL) {
22   delegate_->extension_host()->view()->SetContainer(this);
23   BuildWidgets();
24 }
25 
~ExtensionInfoBarGtk()26 ExtensionInfoBarGtk::~ExtensionInfoBarGtk() {
27   // This view is not owned by us, so unparent.
28   gtk_widget_unparent(view_->native_view());
29 }
30 
OnImageLoaded(SkBitmap * image,const ExtensionResource & resource,int index)31 void ExtensionInfoBarGtk::OnImageLoaded(
32     SkBitmap* image, const ExtensionResource& resource, int index) {
33   if (!delegate_)
34     return;  // The delegate can go away while we asynchronously load images.
35 
36   // ResourceBundle& rb = ResourceBundle::GetSharedInstance();
37   //
38   // SkBitmap* icon;
39   // if (!image || image->empty())
40   //  icon = rb.GetBitmapNamed(IDR_EXTENSIONS_SECTION);
41   // else
42   //  icon = image;
43   // TODO(finnur): Use the above code.
44   // We now have the icon for the menu button, show the menu button and layout.
45 }
46 
BuildWidgets()47 void ExtensionInfoBarGtk::BuildWidgets() {
48   // Start loading the image for the menu button.
49   const Extension* extension = delegate_->extension_host()->extension();
50   ExtensionResource icon_resource = extension->GetIconResource(
51       Extension::EXTENSION_ICON_BITTY, ExtensionIconSet::MATCH_EXACTLY);
52   if (!icon_resource.relative_path().empty()) {
53     // Create a tracker to load the image. It will report back on OnImageLoaded.
54     tracker_.LoadImage(extension, icon_resource,
55                        gfx::Size(Extension::EXTENSION_ICON_BITTY,
56                                  Extension::EXTENSION_ICON_BITTY),
57                        ImageLoadingTracker::DONT_CACHE);
58   } else {
59     OnImageLoaded(NULL, icon_resource, 0);  // |image|, |index|.
60   }
61 
62   ExtensionHost* extension_host = delegate_->extension_host();
63   view_ = extension_host->view();
64   if (gtk_widget_get_parent(view_->native_view())) {
65     gtk_widget_reparent(view_->native_view(), hbox_);
66     gtk_box_set_child_packing(GTK_BOX(hbox_), view_->native_view(),
67                               TRUE, TRUE, 0, GTK_PACK_START);
68   } else {
69     gtk_box_pack_start(GTK_BOX(hbox_), view_->native_view(), TRUE, TRUE, 0);
70   }
71 
72   g_signal_connect(view_->native_view(), "size_allocate",
73                    G_CALLBACK(&OnSizeAllocateThunk), this);
74 }
75 
OnSizeAllocate(GtkWidget * widget,GtkAllocation * allocation)76 void ExtensionInfoBarGtk::OnSizeAllocate(GtkWidget* widget,
77                                          GtkAllocation* allocation) {
78   gfx::Size new_size(allocation->width, allocation->height);
79 
80   delegate_->extension_host()->view()->render_view_host()->view()
81       ->SetSize(new_size);
82 }
83 
OnExtensionPreferredSizeChanged(ExtensionViewGtk * view,const gfx::Size & new_size)84 void ExtensionInfoBarGtk::OnExtensionPreferredSizeChanged(
85     ExtensionViewGtk* view,
86     const gfx::Size& new_size) {
87   // TODO(rafaelw) - Size the InfobarGtk vertically based on the preferred size
88   // of the content.
89 }
90 
CreateInfoBar()91 InfoBar* ExtensionInfoBarDelegate::CreateInfoBar() {
92   return new ExtensionInfoBarGtk(this);
93 }
94