// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_CONTENT_SETTING_BUBBLE_MODEL_H_
#define CHROME_BROWSER_CONTENT_SETTING_BUBBLE_MODEL_H_
#pragma once
#include <set>
#include <string>
#include <vector>
#include "chrome/common/content_settings.h"
#include "content/common/notification_observer.h"
#include "content/common/notification_registrar.h"
#include "googleurl/src/gurl.h"
#include "third_party/skia/include/core/SkBitmap.h"
class Profile;
class SkBitmap;
class TabContents;
// This model provides data for ContentSettingBubble, and also controls
// the action triggered when the allow / block radio buttons are triggered.
class ContentSettingBubbleModel : public NotificationObserver {
public:
virtual ~ContentSettingBubbleModel();
static ContentSettingBubbleModel* CreateContentSettingBubbleModel(
TabContents* tab_contents,
Profile* profile,
ContentSettingsType content_type);
ContentSettingsType content_type() const { return content_type_; }
struct PopupItem {
SkBitmap bitmap;
std::string title;
TabContents* tab_contents;
};
typedef std::vector<PopupItem> PopupItems;
typedef std::vector<std::string> RadioItems;
struct RadioGroup {
RadioGroup();
~RadioGroup();
GURL url;
std::string title;
RadioItems radio_items;
int default_item;
};
struct DomainList {
DomainList();
~DomainList();
std::string title;
std::set<std::string> hosts;
};
struct BubbleContent {
BubbleContent();
~BubbleContent();
std::string title;
PopupItems popup_items;
RadioGroup radio_group;
std::vector<DomainList> domain_lists;
std::set<std::string> resource_identifiers;
std::string custom_link;
bool custom_link_enabled;
std::string manage_link;
private:
DISALLOW_COPY_AND_ASSIGN(BubbleContent);
};
const BubbleContent& bubble_content() const { return bubble_content_; }
// NotificationObserver:
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
virtual void OnRadioClicked(int radio_index) {}
virtual void OnPopupClicked(int index) {}
virtual void OnCustomLinkClicked() {}
virtual void OnManageLinkClicked() {}
protected:
ContentSettingBubbleModel(TabContents* tab_contents, Profile* profile,
ContentSettingsType content_type);
TabContents* tab_contents() const { return tab_contents_; }
Profile* profile() const { return profile_; }
void set_title(const std::string& title) { bubble_content_.title = title; }
void add_popup(const PopupItem& popup) {
bubble_content_.popup_items.push_back(popup);
}
void set_radio_group(const RadioGroup& radio_group) {
bubble_content_.radio_group = radio_group;
}
void add_domain_list(const DomainList& domain_list) {
bubble_content_.domain_lists.push_back(domain_list);
}
void set_custom_link(const std::string& link) {
bubble_content_.custom_link = link;
}
void set_custom_link_enabled(bool enabled) {
bubble_content_.custom_link_enabled = enabled;
}
void set_manage_link(const std::string& link) {
bubble_content_.manage_link = link;
}
void AddBlockedResource(const std::string& resource_identifier);
private:
TabContents* tab_contents_;
Profile* profile_;
ContentSettingsType content_type_;
BubbleContent bubble_content_;
// A registrar for listening for TAB_CONTENTS_DESTROYED notifications.
NotificationRegistrar registrar_;
};
#endif // CHROME_BROWSER_CONTENT_SETTING_BUBBLE_MODEL_H_