Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(333)

Side by Side Diff: chrome/browser/views/location_bar_view.cc

Issue 332021: Move page actions over to ExtensionAction2 (Closed)
Patch Set: Review feedback Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/views/location_bar_view.h" 5 #include "chrome/browser/views/location_bar_view.h"
6 6
7 #if defined(OS_LINUX) 7 #if defined(OS_LINUX)
8 #include <gtk/gtk.h> 8 #include <gtk/gtk.h>
9 #endif 9 #endif
10 10
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 AddChildView(image_view_); 101 AddChildView(image_view_);
102 } 102 }
103 103
104 void LocationBarView::PageActionWithBadgeView::Layout() { 104 void LocationBarView::PageActionWithBadgeView::Layout() {
105 image_view_->SetBounds(0, 0, width(), height()); 105 image_view_->SetBounds(0, 0, width(), height());
106 } 106 }
107 107
108 void LocationBarView::PageActionWithBadgeView::PaintChildren( 108 void LocationBarView::PageActionWithBadgeView::PaintChildren(
109 gfx::Canvas* canvas) { 109 gfx::Canvas* canvas) {
110 View::PaintChildren(canvas); 110 View::PaintChildren(canvas);
111 const ExtensionActionState* state = image_view_->GetPageActionState(); 111
112 if (state) { 112 ExtensionAction2* action = image_view_->page_action();
113 ExtensionActionState::PaintBadge(canvas, gfx::Rect(width(), height()), 113 int tab_id = image_view_->current_tab_id();
114 state->badge_text(), 114 if (tab_id < 0)
115 state->badge_text_color(), 115 return;
116 state->badge_background_color()); 116
117 } 117 action->PaintBadge(canvas, gfx::Rect(width(), height()), tab_id);
118 } 118 }
119 119
120 void LocationBarView::PageActionWithBadgeView::UpdateVisibility( 120 void LocationBarView::PageActionWithBadgeView::UpdateVisibility(
121 TabContents* contents, const GURL& url) { 121 TabContents* contents, const GURL& url) {
122 image_view_->UpdateVisibility(contents, url); 122 image_view_->UpdateVisibility(contents, url);
123 SetVisible(image_view_->IsVisible()); 123 SetVisible(image_view_->IsVisible());
124 } 124 }
125 125
126 126
127 // LocationBarView ----------------------------------------------------------- 127 // LocationBarView -----------------------------------------------------------
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after
677 if (!page_action_views_.empty()) { 677 if (!page_action_views_.empty()) {
678 for (size_t i = 0; i < page_action_views_.size(); ++i) 678 for (size_t i = 0; i < page_action_views_.size(); ++i)
679 RemoveChildView(page_action_views_[i]); 679 RemoveChildView(page_action_views_[i]);
680 STLDeleteContainerPointers(page_action_views_.begin(), 680 STLDeleteContainerPointers(page_action_views_.begin(),
681 page_action_views_.end()); 681 page_action_views_.end());
682 page_action_views_.clear(); 682 page_action_views_.clear();
683 } 683 }
684 } 684 }
685 685
686 void LocationBarView::RefreshPageActionViews() { 686 void LocationBarView::RefreshPageActionViews() {
687 std::vector<ExtensionAction*> page_actions; 687 std::vector<ExtensionAction2*> page_actions;
688 if (profile_->GetExtensionsService()) 688 ExtensionsService* service = profile_->GetExtensionsService();
689 page_actions = profile_->GetExtensionsService()->GetPageActions(); 689 if (!service)
690 return;
690 691
691 // Page actions can be created without an icon, so make sure we count only 692 for (size_t i = 0; i < service->extensions()->size(); ++i) {
692 // those that have been given an icon. 693 if (service->extensions()->at(i)->page_action())
693 for (size_t i = 0; i < page_actions.size();) { 694 page_actions.push_back(service->extensions()->at(i)->page_action());
694 if (page_actions[i]->icon_paths().empty())
695 page_actions.erase(page_actions.begin() + i);
696 else
697 ++i;
698 } 695 }
699 696
700 // On startup we sometimes haven't loaded any extensions. This makes sure 697 // On startup we sometimes haven't loaded any extensions. This makes sure
701 // we catch up when the extensions (and any page actions) load. 698 // we catch up when the extensions (and any page actions) load.
702 if (page_actions.size() != page_action_views_.size()) { 699 if (page_actions.size() != page_action_views_.size()) {
703 DeletePageActionViews(); // Delete the old views (if any). 700 DeletePageActionViews(); // Delete the old views (if any).
704 701
705 page_action_views_.resize(page_actions.size()); 702 page_action_views_.resize(page_actions.size());
706 703
707 for (size_t i = 0; i < page_actions.size(); ++i) { 704 for (size_t i = 0; i < page_actions.size(); ++i) {
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after
1221 } 1218 }
1222 1219
1223 void LocationBarView::SecurityImageView::ShowInfoBubble() { 1220 void LocationBarView::SecurityImageView::ShowInfoBubble() {
1224 std::wstring text; 1221 std::wstring text;
1225 model_->GetIconHoverText(&text); 1222 model_->GetIconHoverText(&text);
1226 ShowInfoBubbleImpl(text, GetColor( 1223 ShowInfoBubbleImpl(text, GetColor(
1227 model_->GetSecurityLevel() == ToolbarModel::SECURE, 1224 model_->GetSecurityLevel() == ToolbarModel::SECURE,
1228 SECURITY_INFO_BUBBLE_TEXT)); 1225 SECURITY_INFO_BUBBLE_TEXT));
1229 } 1226 }
1230 1227
1231 void LocationBarView::PageActionImageView::Paint(gfx::Canvas* canvas) {
1232 LocationBarImageView::Paint(canvas);
1233
1234 TabContents* contents = owner_->delegate_->GetTabContents();
1235 if (!contents)
1236 return;
1237
1238 const ExtensionActionState* state =
1239 contents->GetPageActionState(page_action_);
1240 if (state) {
1241 ExtensionActionState::PaintBadge(canvas, gfx::Rect(width(), height()),
1242 state->badge_text(),
1243 state->badge_text_color(),
1244 state->badge_background_color());
1245 }
1246 }
1247
1248 // PageActionImageView---------------------------------------------------------- 1228 // PageActionImageView----------------------------------------------------------
1249 1229
1250 LocationBarView::PageActionImageView::PageActionImageView( 1230 LocationBarView::PageActionImageView::PageActionImageView(
1251 LocationBarView* owner, 1231 LocationBarView* owner,
1252 Profile* profile, 1232 Profile* profile,
1253 const ExtensionAction* page_action, 1233 ExtensionAction2* page_action,
1254 const BubblePositioner* bubble_positioner) 1234 const BubblePositioner* bubble_positioner)
1255 : LocationBarImageView(bubble_positioner), 1235 : LocationBarImageView(bubble_positioner),
1256 owner_(owner), 1236 owner_(owner),
1257 profile_(profile), 1237 profile_(profile),
1258 page_action_(page_action), 1238 page_action_(page_action),
1259 current_tab_id_(-1), 1239 current_tab_id_(-1) {
1260 tooltip_(page_action_->title()) {
1261 Extension* extension = profile->GetExtensionsService()->GetExtensionById( 1240 Extension* extension = profile->GetExtensionsService()->GetExtensionById(
1262 page_action->extension_id()); 1241 page_action->extension_id());
1263 DCHECK(extension); 1242 DCHECK(extension);
1264 1243
1265 // Load the images this view needs asynchronously on the file thread. We'll 1244 // Load all the icons declared in the manifest. This is the contents of the
1266 // get a call back into OnImageLoaded if the image loads successfully. If not, 1245 // icons array, plus the default_icon property, if any.
1267 // the ImageView will have no image and will not appear in the Omnibox. 1246 std::vector<std::string> icon_paths(*page_action->icon_paths());
1268 DCHECK(!page_action->icon_paths().empty()); 1247 if (!page_action_->default_icon_path().empty())
1269 const std::vector<std::string>& icon_paths = page_action->icon_paths(); 1248 icon_paths.push_back(page_action_->default_icon_path());
1270 page_action_icons_.resize(icon_paths.size()); 1249
1271 tracker_ = new ImageLoadingTracker(this, icon_paths.size()); 1250 tracker_ = new ImageLoadingTracker(this, icon_paths.size());
1272 for (std::vector<std::string>::const_iterator iter = icon_paths.begin(); 1251 for (std::vector<std::string>::iterator iter = icon_paths.begin();
1273 iter != icon_paths.end(); ++iter) { 1252 iter != icon_paths.end(); ++iter) {
1274 tracker_->PostLoadImageTask( 1253 tracker_->PostLoadImageTask(
1275 extension->GetResource(*iter), 1254 extension->GetResource(*iter),
1276 gfx::Size(Extension::kPageActionIconMaxSize, 1255 gfx::Size(Extension::kPageActionIconMaxSize,
1277 Extension::kPageActionIconMaxSize)); 1256 Extension::kPageActionIconMaxSize));
1278 } 1257 }
1279 } 1258 }
1280 1259
1281 LocationBarView::PageActionImageView::~PageActionImageView() { 1260 LocationBarView::PageActionImageView::~PageActionImageView() {
1282 if (tracker_) 1261 if (tracker_)
1283 tracker_->StopTrackingImageLoad(); 1262 tracker_->StopTrackingImageLoad();
1284 } 1263 }
1285 1264
1286 bool LocationBarView::PageActionImageView::OnMousePressed( 1265 bool LocationBarView::PageActionImageView::OnMousePressed(
1287 const views::MouseEvent& event) { 1266 const views::MouseEvent& event) {
1288 int button = -1; 1267 int button = -1;
1289 if (event.IsLeftMouseButton()) 1268 if (event.IsLeftMouseButton())
1290 button = 1; 1269 button = 1;
1291 else if (event.IsMiddleMouseButton()) 1270 else if (event.IsMiddleMouseButton())
1292 button = 2; 1271 button = 2;
1293 else if (event.IsRightMouseButton()) 1272 else if (event.IsRightMouseButton())
1294 button = 3; 1273 button = 3;
1295 // Our PageAction icon was clicked on, notify proper authorities. 1274 // Our PageAction icon was clicked on, notify proper authorities.
1296 ExtensionBrowserEventRouter::GetInstance()->PageActionExecuted( 1275 ExtensionBrowserEventRouter::GetInstance()->PageActionExecuted(
1297 profile_, page_action_->extension_id(), page_action_->id(), 1276 profile_, page_action_->extension_id(), page_action_->id(),
1298 current_tab_id_, current_url_.spec(), button); 1277 current_tab_id_, current_url_.spec(), button);
1299 return true; 1278 return true;
1300 } 1279 }
1301 1280
1302 const ExtensionActionState*
1303 LocationBarView::PageActionImageView::GetPageActionState() {
1304 TabContents* contents = owner_->delegate_->GetTabContents();
1305 if (!contents)
1306 return NULL;
1307
1308 return contents->GetPageActionState(page_action_);
1309 }
1310
1311 void LocationBarView::PageActionImageView::ShowInfoBubble() { 1281 void LocationBarView::PageActionImageView::ShowInfoBubble() {
1312 ShowInfoBubbleImpl(ASCIIToWide(tooltip_), GetColor(false, TEXT)); 1282 ShowInfoBubbleImpl(ASCIIToWide(tooltip_), GetColor(false, TEXT));
1313 } 1283 }
1314 1284
1315 void LocationBarView::PageActionImageView::OnImageLoaded(SkBitmap* image, 1285 void LocationBarView::PageActionImageView::OnImageLoaded(SkBitmap* image,
1316 size_t index) { 1286 size_t index) {
1317 DCHECK(index < page_action_icons_.size()); 1287 // We loaded icons()->size() icons, plus one extra if the page action had
1318 if (index == page_action_icons_.size() - 1) 1288 // a default icon.
1319 tracker_ = NULL; // The tracker object will delete itself when we return. 1289 int total_icons = page_action_->icon_paths()->size();
1320 if (image) 1290 if (!page_action_->default_icon_path().empty())
1321 page_action_icons_[index] = *image; 1291 total_icons++;
1292 DCHECK(static_cast<int>(index) < total_icons);
1293
1294 // Map the index of the loaded image back to its name. If we ever get an
1295 // index greater than the number of icons, it must be the default icon.
1296 if (image) {
1297 if (index < page_action_->icon_paths()->size())
1298 page_action_icons_[page_action_->icon_paths()->at(index)] = *image;
1299 else
1300 page_action_icons_[page_action_->default_icon_path()] = *image;
1301 }
1302
1303 // If we are done, release the tracker.
1304 if (static_cast<int>(index) == (total_icons - 1))
1305 tracker_ = NULL;
1306
1322 owner_->UpdatePageActions(); 1307 owner_->UpdatePageActions();
1323 } 1308 }
1324 1309
1325 void LocationBarView::PageActionImageView::UpdateVisibility( 1310 void LocationBarView::PageActionImageView::UpdateVisibility(
1326 TabContents* contents, const GURL& url) { 1311 TabContents* contents, const GURL& url) {
1327 // Save this off so we can pass it back to the extension when the action gets 1312 // Save this off so we can pass it back to the extension when the action gets
1328 // executed. See PageActionImageView::OnMousePressed. 1313 // executed. See PageActionImageView::OnMousePressed.
1329 current_tab_id_ = ExtensionTabUtil::GetTabId(contents); 1314 current_tab_id_ = ExtensionTabUtil::GetTabId(contents);
1330 current_url_ = url; 1315 current_url_ = url;
1331 1316
1332 const ExtensionActionState* state = 1317 bool visible = page_action_->GetIsVisible(current_tab_id_);
1333 contents->GetPageActionState(page_action_);
1334 bool visible = state && !state->hidden();
1335 if (visible) { 1318 if (visible) {
1336 // Set the tooltip. 1319 // Set the tooltip.
1337 if (state->title().empty()) 1320 tooltip_ = page_action_->GetTitle(current_tab_id_);
1338 tooltip_ = page_action_->title();
1339 else
1340 tooltip_ = state->title();
1341 1321
1342 // Set the image. 1322 // Set the image.
1343 SkBitmap* icon = state->icon(); 1323 // It can come from three places. In descending order of priority:
1344 if (!icon) { 1324 // - The developer can set it dynamically by path or bitmap. It will be in
1345 int index = state->icon_index(); 1325 // page_action_->GetIcon().
1346 // The image index (if not within bounds) will be set to the first image. 1326 // - The developer can set it dynamically by index. It will be in
1347 if (index < 0 || index >= static_cast<int>(page_action_icons_.size())) 1327 // page_action_->GetIconIndex().
1348 index = 0; 1328 // - It can be set in the manifest by path. It will be in page_action_->
1349 icon = &page_action_icons_[index]; 1329 // default_icon_path().
1330
1331 // First look for a dynamically set bitmap.
1332 SkBitmap icon = page_action_->GetIcon(current_tab_id_);
1333 if (icon.isNull()) {
1334 int icon_index = page_action_->GetIconIndex(current_tab_id_);
1335 std::string icon_path;
1336 if (icon_index >= 0)
1337 icon_path = page_action_->icon_paths()->at(icon_index);
1338 else
1339 icon_path = page_action_->default_icon_path();
1340
1341 if (!icon_path.empty()) {
1342 PageActionMap::iterator iter = page_action_icons_.find(icon_path);
1343 if (iter != page_action_icons_.end())
1344 icon = iter->second;
1345 }
1350 } 1346 }
1351 ImageView::SetImage(icon); 1347
1348 if (!icon.isNull())
1349 ImageView::SetImage(&icon);
1352 } 1350 }
1353 SetVisible(visible); 1351 SetVisible(visible);
1354 } 1352 }
1355 1353
1356 //////////////////////////////////////////////////////////////////////////////// 1354 ////////////////////////////////////////////////////////////////////////////////
1357 // LocationBarView, LocationBar implementation: 1355 // LocationBarView, LocationBar implementation:
1358 1356
1359 void LocationBarView::ShowFirstRunBubble(bool use_OEM_bubble) { 1357 void LocationBarView::ShowFirstRunBubble(bool use_OEM_bubble) {
1360 // We wait 30 milliseconds to open. It allows less flicker. 1358 // We wait 30 milliseconds to open. It allows less flicker.
1361 Task* task = first_run_bubble_.NewRunnableMethod( 1359 Task* task = first_run_bubble_.NewRunnableMethod(
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1402 } 1400 }
1403 1401
1404 int LocationBarView::PageActionVisibleCount() { 1402 int LocationBarView::PageActionVisibleCount() {
1405 int result = 0; 1403 int result = 0;
1406 for (size_t i = 0; i < page_action_views_.size(); i++) { 1404 for (size_t i = 0; i < page_action_views_.size(); i++) {
1407 if (page_action_views_[i]->IsVisible()) 1405 if (page_action_views_[i]->IsVisible())
1408 ++result; 1406 ++result;
1409 } 1407 }
1410 return result; 1408 return result;
1411 } 1409 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698