content_setting_bubble_contents.h revision 116680a4aac90f2aa7413d9095a592090648e557
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#ifndef CHROME_BROWSER_UI_VIEWS_CONTENT_SETTING_BUBBLE_CONTENTS_H_
6#define CHROME_BROWSER_UI_VIEWS_CONTENT_SETTING_BUBBLE_CONTENTS_H_
7
8#include <map>
9
10#include "base/basictypes.h"
11#include "base/compiler_specific.h"
12#include "chrome/common/content_settings_types.h"
13#include "content/public/browser/web_contents_observer.h"
14#include "content/public/common/media_stream_request.h"
15#include "ui/views/bubble/bubble_delegate.h"
16#include "ui/views/controls/button/button.h"
17#include "ui/views/controls/button/menu_button_listener.h"
18#include "ui/views/controls/link_listener.h"
19
20class ContentSettingBubbleModel;
21class ContentSettingMediaMenuModel;
22class Profile;
23
24namespace ui {
25class SimpleMenuModel;
26}
27
28namespace views {
29class LabelButton;
30class MenuButton;
31class MenuRunner;
32class RadioButton;
33}
34
35// ContentSettingBubbleContents is used when the user turns on different kinds
36// of content blocking (e.g. "block images").  When viewing a page with blocked
37// content, icons appear in the omnibox corresponding to the content types that
38// were blocked, and the user can click one to get a bubble hosting a few
39// controls.  This class provides the content of that bubble.  In general,
40// these bubbles typically have a title, a pair of radio buttons for toggling
41// the blocking settings for the current site, a close button, and a link to
42// get to a more comprehensive settings management dialog.  A few types have
43// more or fewer controls than this.
44class ContentSettingBubbleContents : public content::WebContentsObserver,
45                                     public views::BubbleDelegateView,
46                                     public views::ButtonListener,
47                                     public views::LinkListener,
48                                     public views::MenuButtonListener {
49 public:
50  ContentSettingBubbleContents(
51      ContentSettingBubbleModel* content_setting_bubble_model,
52      content::WebContents* web_contents,
53      views::View* anchor_view,
54      views::BubbleBorder::Arrow arrow);
55  virtual ~ContentSettingBubbleContents();
56
57  virtual gfx::Size GetPreferredSize() const OVERRIDE;
58
59  // Callback to allow ContentSettingMediaMenuModel to update the menu label.
60  void UpdateMenuLabel(content::MediaStreamType type,
61                       const std::string& label);
62
63 protected:
64  // views::BubbleDelegateView:
65  virtual void Init() OVERRIDE;
66
67 private:
68  class Favicon;
69  struct MediaMenuParts;
70
71  typedef std::map<views::Link*, int> PopupLinks;
72  typedef std::map<views::MenuButton*, MediaMenuParts*> MediaMenuPartsMap;
73
74  // content::WebContentsObserver:
75  virtual void DidNavigateMainFrame(
76      const content::LoadCommittedDetails& details,
77      const content::FrameNavigateParams& params) OVERRIDE;
78
79  // views::View:
80  virtual void OnNativeThemeChanged(const ui::NativeTheme* theme) OVERRIDE;
81
82  // views::ButtonListener:
83  virtual void ButtonPressed(views::Button* sender,
84                             const ui::Event& event) OVERRIDE;
85
86  // views::LinkListener:
87  virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE;
88
89  // views::MenuButtonListener:
90  virtual void OnMenuButtonClicked(views::View* source,
91                                   const gfx::Point& point) OVERRIDE;
92
93  // Helper to get the preferred width of the media menu.
94  void UpdateMenuButtonSizes(const ui::NativeTheme* theme);
95
96  // Provides data for this bubble.
97  scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model_;
98
99  // Some of our controls, so we can tell what's been clicked when we get a
100  // message.
101  PopupLinks popup_links_;
102  typedef std::vector<views::RadioButton*> RadioGroup;
103  RadioGroup radio_group_;
104  views::Link* custom_link_;
105  views::Link* manage_link_;
106  views::Link* learn_more_link_;
107  views::LabelButton* close_button_;
108  scoped_ptr<views::MenuRunner> menu_runner_;
109  MediaMenuPartsMap media_menus_;
110
111  DISALLOW_IMPLICIT_CONSTRUCTORS(ContentSettingBubbleContents);
112};
113
114#endif  // CHROME_BROWSER_UI_VIEWS_CONTENT_SETTING_BUBBLE_CONTENTS_H_
115