| Index: chrome/browser/views/location_bar_view.cc
|
| diff --git a/chrome/browser/views/location_bar_view.cc b/chrome/browser/views/location_bar_view.cc
|
| index 95d29155bacd498b7a98e0a8886d53aea478af4b..cbe8dd6f96e0ef8613291faf60ffde1f7ff17ef6 100644
|
| --- a/chrome/browser/views/location_bar_view.cc
|
| +++ b/chrome/browser/views/location_bar_view.cc
|
| @@ -108,13 +108,13 @@ void LocationBarView::PageActionWithBadgeView::Layout() {
|
| void LocationBarView::PageActionWithBadgeView::PaintChildren(
|
| gfx::Canvas* canvas) {
|
| View::PaintChildren(canvas);
|
| - const ExtensionActionState* state = image_view_->GetPageActionState();
|
| - if (state) {
|
| - ExtensionActionState::PaintBadge(canvas, gfx::Rect(width(), height()),
|
| - state->badge_text(),
|
| - state->badge_text_color(),
|
| - state->badge_background_color());
|
| - }
|
| +
|
| + ExtensionAction2* action = image_view_->page_action();
|
| + int tab_id = image_view_->current_tab_id();
|
| + if (tab_id < 0)
|
| + return;
|
| +
|
| + action->PaintBadge(canvas, gfx::Rect(width(), height()), tab_id);
|
| }
|
|
|
| void LocationBarView::PageActionWithBadgeView::UpdateVisibility(
|
| @@ -684,17 +684,14 @@ void LocationBarView::DeletePageActionViews() {
|
| }
|
|
|
| void LocationBarView::RefreshPageActionViews() {
|
| - std::vector<ExtensionAction*> page_actions;
|
| - if (profile_->GetExtensionsService())
|
| - page_actions = profile_->GetExtensionsService()->GetPageActions();
|
| -
|
| - // Page actions can be created without an icon, so make sure we count only
|
| - // those that have been given an icon.
|
| - for (size_t i = 0; i < page_actions.size();) {
|
| - if (page_actions[i]->icon_paths().empty())
|
| - page_actions.erase(page_actions.begin() + i);
|
| - else
|
| - ++i;
|
| + std::vector<ExtensionAction2*> page_actions;
|
| + ExtensionsService* service = profile_->GetExtensionsService();
|
| + if (!service)
|
| + return;
|
| +
|
| + for (size_t i = 0; i < service->extensions()->size(); ++i) {
|
| + if (service->extensions()->at(i)->page_action())
|
| + page_actions.push_back(service->extensions()->at(i)->page_action());
|
| }
|
|
|
| // On startup we sometimes haven't loaded any extensions. This makes sure
|
| @@ -1228,48 +1225,30 @@ void LocationBarView::SecurityImageView::ShowInfoBubble() {
|
| SECURITY_INFO_BUBBLE_TEXT));
|
| }
|
|
|
| -void LocationBarView::PageActionImageView::Paint(gfx::Canvas* canvas) {
|
| - LocationBarImageView::Paint(canvas);
|
| -
|
| - TabContents* contents = owner_->delegate_->GetTabContents();
|
| - if (!contents)
|
| - return;
|
| -
|
| - const ExtensionActionState* state =
|
| - contents->GetPageActionState(page_action_);
|
| - if (state) {
|
| - ExtensionActionState::PaintBadge(canvas, gfx::Rect(width(), height()),
|
| - state->badge_text(),
|
| - state->badge_text_color(),
|
| - state->badge_background_color());
|
| - }
|
| -}
|
| -
|
| // PageActionImageView----------------------------------------------------------
|
|
|
| LocationBarView::PageActionImageView::PageActionImageView(
|
| LocationBarView* owner,
|
| Profile* profile,
|
| - const ExtensionAction* page_action,
|
| + ExtensionAction2* page_action,
|
| const BubblePositioner* bubble_positioner)
|
| : LocationBarImageView(bubble_positioner),
|
| owner_(owner),
|
| profile_(profile),
|
| page_action_(page_action),
|
| - current_tab_id_(-1),
|
| - tooltip_(page_action_->title()) {
|
| + current_tab_id_(-1) {
|
| Extension* extension = profile->GetExtensionsService()->GetExtensionById(
|
| page_action->extension_id());
|
| DCHECK(extension);
|
|
|
| - // Load the images this view needs asynchronously on the file thread. We'll
|
| - // get a call back into OnImageLoaded if the image loads successfully. If not,
|
| - // the ImageView will have no image and will not appear in the Omnibox.
|
| - DCHECK(!page_action->icon_paths().empty());
|
| - const std::vector<std::string>& icon_paths = page_action->icon_paths();
|
| - page_action_icons_.resize(icon_paths.size());
|
| + // Load all the icons declared in the manifest. This is the contents of the
|
| + // icons array, plus the default_icon property, if any.
|
| + std::vector<std::string> icon_paths(*page_action->icon_paths());
|
| + if (!page_action_->default_icon_path().empty())
|
| + icon_paths.push_back(page_action_->default_icon_path());
|
| +
|
| tracker_ = new ImageLoadingTracker(this, icon_paths.size());
|
| - for (std::vector<std::string>::const_iterator iter = icon_paths.begin();
|
| + for (std::vector<std::string>::iterator iter = icon_paths.begin();
|
| iter != icon_paths.end(); ++iter) {
|
| tracker_->PostLoadImageTask(
|
| extension->GetResource(*iter),
|
| @@ -1299,26 +1278,32 @@ bool LocationBarView::PageActionImageView::OnMousePressed(
|
| return true;
|
| }
|
|
|
| -const ExtensionActionState*
|
| - LocationBarView::PageActionImageView::GetPageActionState() {
|
| - TabContents* contents = owner_->delegate_->GetTabContents();
|
| - if (!contents)
|
| - return NULL;
|
| -
|
| - return contents->GetPageActionState(page_action_);
|
| -}
|
| -
|
| void LocationBarView::PageActionImageView::ShowInfoBubble() {
|
| ShowInfoBubbleImpl(ASCIIToWide(tooltip_), GetColor(false, TEXT));
|
| }
|
|
|
| void LocationBarView::PageActionImageView::OnImageLoaded(SkBitmap* image,
|
| size_t index) {
|
| - DCHECK(index < page_action_icons_.size());
|
| - if (index == page_action_icons_.size() - 1)
|
| - tracker_ = NULL; // The tracker object will delete itself when we return.
|
| - if (image)
|
| - page_action_icons_[index] = *image;
|
| + // We loaded icons()->size() icons, plus one extra if the page action had
|
| + // a default icon.
|
| + int total_icons = page_action_->icon_paths()->size();
|
| + if (!page_action_->default_icon_path().empty())
|
| + total_icons++;
|
| + DCHECK(static_cast<int>(index) < total_icons);
|
| +
|
| + // Map the index of the loaded image back to its name. If we ever get an
|
| + // index greater than the number of icons, it must be the default icon.
|
| + if (image) {
|
| + if (index < page_action_->icon_paths()->size())
|
| + page_action_icons_[page_action_->icon_paths()->at(index)] = *image;
|
| + else
|
| + page_action_icons_[page_action_->default_icon_path()] = *image;
|
| + }
|
| +
|
| + // If we are done, release the tracker.
|
| + if (static_cast<int>(index) == (total_icons - 1))
|
| + tracker_ = NULL;
|
| +
|
| owner_->UpdatePageActions();
|
| }
|
|
|
| @@ -1329,26 +1314,39 @@ void LocationBarView::PageActionImageView::UpdateVisibility(
|
| current_tab_id_ = ExtensionTabUtil::GetTabId(contents);
|
| current_url_ = url;
|
|
|
| - const ExtensionActionState* state =
|
| - contents->GetPageActionState(page_action_);
|
| - bool visible = state && !state->hidden();
|
| + bool visible = page_action_->GetIsVisible(current_tab_id_);
|
| if (visible) {
|
| // Set the tooltip.
|
| - if (state->title().empty())
|
| - tooltip_ = page_action_->title();
|
| - else
|
| - tooltip_ = state->title();
|
| + tooltip_ = page_action_->GetTitle(current_tab_id_);
|
|
|
| // Set the image.
|
| - SkBitmap* icon = state->icon();
|
| - if (!icon) {
|
| - int index = state->icon_index();
|
| - // The image index (if not within bounds) will be set to the first image.
|
| - if (index < 0 || index >= static_cast<int>(page_action_icons_.size()))
|
| - index = 0;
|
| - icon = &page_action_icons_[index];
|
| + // It can come from three places. In descending order of priority:
|
| + // - The developer can set it dynamically by path or bitmap. It will be in
|
| + // page_action_->GetIcon().
|
| + // - The developer can set it dynamically by index. It will be in
|
| + // page_action_->GetIconIndex().
|
| + // - It can be set in the manifest by path. It will be in page_action_->
|
| + // default_icon_path().
|
| +
|
| + // First look for a dynamically set bitmap.
|
| + SkBitmap icon = page_action_->GetIcon(current_tab_id_);
|
| + if (icon.isNull()) {
|
| + int icon_index = page_action_->GetIconIndex(current_tab_id_);
|
| + std::string icon_path;
|
| + if (icon_index >= 0)
|
| + icon_path = page_action_->icon_paths()->at(icon_index);
|
| + else
|
| + icon_path = page_action_->default_icon_path();
|
| +
|
| + if (!icon_path.empty()) {
|
| + PageActionMap::iterator iter = page_action_icons_.find(icon_path);
|
| + if (iter != page_action_icons_.end())
|
| + icon = iter->second;
|
| + }
|
| }
|
| - ImageView::SetImage(icon);
|
| +
|
| + if (!icon.isNull())
|
| + ImageView::SetImage(&icon);
|
| }
|
| SetVisible(visible);
|
| }
|
|
|