OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/ui/gtk/location_bar_view_gtk.h" | 5 #include "chrome/browser/ui/gtk/location_bar_view_gtk.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 20 matching lines...) Expand all Loading... |
31 #include "chrome/browser/search_engines/template_url.h" | 31 #include "chrome/browser/search_engines/template_url.h" |
32 #include "chrome/browser/search_engines/template_url_service.h" | 32 #include "chrome/browser/search_engines/template_url_service.h" |
33 #include "chrome/browser/search_engines/template_url_service_factory.h" | 33 #include "chrome/browser/search_engines/template_url_service_factory.h" |
34 #include "chrome/browser/ui/browser.h" | 34 #include "chrome/browser/ui/browser.h" |
35 #include "chrome/browser/ui/browser_content_setting_bubble_model_delegate.h" | 35 #include "chrome/browser/ui/browser_content_setting_bubble_model_delegate.h" |
36 #include "chrome/browser/ui/browser_list.h" | 36 #include "chrome/browser/ui/browser_list.h" |
37 #include "chrome/browser/ui/content_settings/content_setting_bubble_model.h" | 37 #include "chrome/browser/ui/content_settings/content_setting_bubble_model.h" |
38 #include "chrome/browser/ui/content_settings/content_setting_image_model.h" | 38 #include "chrome/browser/ui/content_settings/content_setting_image_model.h" |
39 #include "chrome/browser/ui/gtk/bookmarks/bookmark_bubble_gtk.h" | 39 #include "chrome/browser/ui/gtk/bookmarks/bookmark_bubble_gtk.h" |
40 #include "chrome/browser/ui/gtk/bookmarks/bookmark_utils_gtk.h" | 40 #include "chrome/browser/ui/gtk/bookmarks/bookmark_utils_gtk.h" |
41 #include "chrome/browser/ui/gtk/browser_window_gtk.h" | |
42 #include "chrome/browser/ui/gtk/content_setting_bubble_gtk.h" | 41 #include "chrome/browser/ui/gtk/content_setting_bubble_gtk.h" |
43 #include "chrome/browser/ui/gtk/extensions/extension_popup_gtk.h" | 42 #include "chrome/browser/ui/gtk/extensions/extension_popup_gtk.h" |
44 #include "chrome/browser/ui/gtk/first_run_bubble.h" | 43 #include "chrome/browser/ui/gtk/first_run_bubble.h" |
45 #include "chrome/browser/ui/gtk/gtk_util.h" | 44 #include "chrome/browser/ui/gtk/gtk_util.h" |
46 #include "chrome/browser/ui/gtk/nine_box.h" | 45 #include "chrome/browser/ui/gtk/nine_box.h" |
47 #include "chrome/browser/ui/gtk/omnibox/omnibox_view_gtk.h" | 46 #include "chrome/browser/ui/gtk/omnibox/omnibox_view_gtk.h" |
48 #include "chrome/browser/ui/gtk/rounded_window.h" | 47 #include "chrome/browser/ui/gtk/rounded_window.h" |
49 #include "chrome/browser/ui/gtk/theme_service_gtk.h" | 48 #include "chrome/browser/ui/gtk/theme_service_gtk.h" |
50 #include "chrome/browser/ui/gtk/view_id_util.h" | 49 #include "chrome/browser/ui/gtk/view_id_util.h" |
51 #include "chrome/browser/ui/omnibox/location_bar_util.h" | 50 #include "chrome/browser/ui/omnibox/location_bar_util.h" |
52 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 51 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
53 #include "chrome/common/chrome_notification_types.h" | 52 #include "chrome/common/chrome_notification_types.h" |
54 #include "chrome/common/extensions/extension.h" | 53 #include "chrome/common/extensions/extension.h" |
55 #include "chrome/common/extensions/extension_action.h" | 54 #include "chrome/common/extensions/extension_action.h" |
56 #include "chrome/common/extensions/extension_resource.h" | 55 #include "chrome/common/extensions/extension_resource.h" |
57 #include "chrome/common/pref_names.h" | 56 #include "chrome/common/pref_names.h" |
58 #include "content/public/browser/navigation_entry.h" | 57 #include "content/public/browser/navigation_entry.h" |
59 #include "content/public/browser/notification_service.h" | 58 #include "content/public/browser/notification_service.h" |
60 #include "content/public/browser/web_contents.h" | 59 #include "content/public/browser/web_contents.h" |
61 #include "grit/generated_resources.h" | 60 #include "grit/generated_resources.h" |
62 #include "grit/theme_resources.h" | 61 #include "grit/theme_resources.h" |
63 #include "grit/theme_resources_standard.h" | 62 #include "grit/theme_resources_standard.h" |
64 #include "net/base/net_util.h" | 63 #include "net/base/net_util.h" |
65 #include "ui/base/accelerators/accelerator_gtk.h" | |
66 #include "ui/base/dragdrop/gtk_dnd_util.h" | 64 #include "ui/base/dragdrop/gtk_dnd_util.h" |
67 #include "ui/base/gtk/gtk_hig_constants.h" | 65 #include "ui/base/gtk/gtk_hig_constants.h" |
68 #include "ui/base/l10n/l10n_util.h" | 66 #include "ui/base/l10n/l10n_util.h" |
69 #include "ui/base/resource/resource_bundle.h" | 67 #include "ui/base/resource/resource_bundle.h" |
70 #include "ui/gfx/canvas_skia_paint.h" | 68 #include "ui/gfx/canvas_skia_paint.h" |
71 #include "ui/gfx/font.h" | 69 #include "ui/gfx/font.h" |
72 #include "ui/gfx/gtk_util.h" | 70 #include "ui/gfx/gtk_util.h" |
73 #include "ui/gfx/image/image.h" | 71 #include "ui/gfx/image/image.h" |
74 #include "webkit/glue/window_open_disposition.h" | 72 #include "webkit/glue/window_open_disposition.h" |
75 | 73 |
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
667 page_action_views_[i]->widget(), FALSE, FALSE, 0); | 665 page_action_views_[i]->widget(), FALSE, FALSE, 0); |
668 } | 666 } |
669 content::NotificationService::current()->Notify( | 667 content::NotificationService::current()->Notify( |
670 chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_COUNT_CHANGED, | 668 chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_COUNT_CHANGED, |
671 content::Source<LocationBar>(this), | 669 content::Source<LocationBar>(this), |
672 content::NotificationService::NoDetails()); | 670 content::NotificationService::NoDetails()); |
673 } | 671 } |
674 | 672 |
675 WebContents* contents = GetWebContents(); | 673 WebContents* contents = GetWebContents(); |
676 if (!page_action_views_.empty() && contents) { | 674 if (!page_action_views_.empty() && contents) { |
677 GURL url = browser()->GetSelectedWebContents()->GetURL(); | 675 GURL url = GURL(toolbar_model_->GetText()); |
678 | 676 |
679 for (size_t i = 0; i < page_action_views_.size(); i++) { | 677 for (size_t i = 0; i < page_action_views_.size(); i++) { |
680 page_action_views_[i]->UpdateVisibility( | 678 page_action_views_[i]->UpdateVisibility( |
681 toolbar_model_->input_in_progress() ? NULL : contents, url); | 679 toolbar_model_->input_in_progress() ? NULL : contents, url); |
682 } | 680 } |
683 } | 681 } |
684 | 682 |
685 // If there are no visible page actions, hide the hbox too, so that it does | 683 // If there are no visible page actions, hide the hbox too, so that it does |
686 // not affect the padding in the location bar. | 684 // not affect the padding in the location bar. |
687 gtk_widget_set_visible(page_action_hbox_.get(), | 685 gtk_widget_set_visible(page_action_hbox_.get(), |
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1431 //////////////////////////////////////////////////////////////////////////////// | 1429 //////////////////////////////////////////////////////////////////////////////// |
1432 // LocationBarViewGtk::PageActionViewGtk | 1430 // LocationBarViewGtk::PageActionViewGtk |
1433 | 1431 |
1434 LocationBarViewGtk::PageActionViewGtk::PageActionViewGtk( | 1432 LocationBarViewGtk::PageActionViewGtk::PageActionViewGtk( |
1435 LocationBarViewGtk* owner, | 1433 LocationBarViewGtk* owner, |
1436 ExtensionAction* page_action) | 1434 ExtensionAction* page_action) |
1437 : owner_(NULL), | 1435 : owner_(NULL), |
1438 page_action_(page_action), | 1436 page_action_(page_action), |
1439 last_icon_pixbuf_(NULL), | 1437 last_icon_pixbuf_(NULL), |
1440 tracker_(this), | 1438 tracker_(this), |
1441 current_tab_id_(-1), | |
1442 window_(NULL), | |
1443 accel_group_(NULL), | |
1444 preview_enabled_(false) { | 1439 preview_enabled_(false) { |
1445 event_box_.Own(gtk_event_box_new()); | 1440 event_box_.Own(gtk_event_box_new()); |
1446 gtk_widget_set_size_request(event_box_.get(), | 1441 gtk_widget_set_size_request(event_box_.get(), |
1447 Extension::kPageActionIconMaxSize, | 1442 Extension::kPageActionIconMaxSize, |
1448 Extension::kPageActionIconMaxSize); | 1443 Extension::kPageActionIconMaxSize); |
1449 | 1444 |
1450 // Make the event box not visible so it does not paint a background. | 1445 // Make the event box not visible so it does not paint a background. |
1451 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()), FALSE); | 1446 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()), FALSE); |
1452 g_signal_connect(event_box_.get(), "button-press-event", | 1447 g_signal_connect(event_box_.get(), "button-press-event", |
1453 G_CALLBACK(&OnButtonPressedThunk), this); | 1448 G_CALLBACK(&OnButtonPressedThunk), this); |
1454 g_signal_connect_after(event_box_.get(), "expose-event", | 1449 g_signal_connect_after(event_box_.get(), "expose-event", |
1455 G_CALLBACK(OnExposeEventThunk), this); | 1450 G_CALLBACK(OnExposeEventThunk), this); |
1456 g_signal_connect(event_box_.get(), "realize", | |
1457 G_CALLBACK(OnRealizeThunk), this); | |
1458 | 1451 |
1459 image_.Own(gtk_image_new()); | 1452 image_.Own(gtk_image_new()); |
1460 gtk_container_add(GTK_CONTAINER(event_box_.get()), image_.get()); | 1453 gtk_container_add(GTK_CONTAINER(event_box_.get()), image_.get()); |
1461 | 1454 |
1462 const Extension* extension = owner->browser()->profile()-> | 1455 const Extension* extension = owner->browser()->profile()-> |
1463 GetExtensionService()->GetExtensionById(page_action->extension_id(), | 1456 GetExtensionService()->GetExtensionById(page_action->extension_id(), |
1464 false); | 1457 false); |
1465 DCHECK(extension); | 1458 DCHECK(extension); |
1466 | 1459 |
1467 // Load all the icons declared in the manifest. This is the contents of the | 1460 // Load all the icons declared in the manifest. This is the contents of the |
1468 // icons array, plus the default_icon property, if any. | 1461 // icons array, plus the default_icon property, if any. |
1469 std::vector<std::string> icon_paths(*page_action->icon_paths()); | 1462 std::vector<std::string> icon_paths(*page_action->icon_paths()); |
1470 if (!page_action_->default_icon_path().empty()) | 1463 if (!page_action_->default_icon_path().empty()) |
1471 icon_paths.push_back(page_action_->default_icon_path()); | 1464 icon_paths.push_back(page_action_->default_icon_path()); |
1472 | 1465 |
1473 for (std::vector<std::string>::iterator iter = icon_paths.begin(); | 1466 for (std::vector<std::string>::iterator iter = icon_paths.begin(); |
1474 iter != icon_paths.end(); ++iter) { | 1467 iter != icon_paths.end(); ++iter) { |
1475 tracker_.LoadImage(extension, extension->GetResource(*iter), | 1468 tracker_.LoadImage(extension, extension->GetResource(*iter), |
1476 gfx::Size(Extension::kPageActionIconMaxSize, | 1469 gfx::Size(Extension::kPageActionIconMaxSize, |
1477 Extension::kPageActionIconMaxSize), | 1470 Extension::kPageActionIconMaxSize), |
1478 ImageLoadingTracker::DONT_CACHE); | 1471 ImageLoadingTracker::DONT_CACHE); |
1479 } | 1472 } |
1480 | 1473 |
1481 // We set the owner last of all so that we can determine whether we are in | 1474 // We set the owner last of all so that we can determine whether we are in |
1482 // the process of initializing this class or not. | 1475 // the process of initializing this class or not. |
1483 owner_ = owner; | 1476 owner_ = owner; |
1484 } | 1477 } |
1485 | 1478 |
1486 LocationBarViewGtk::PageActionViewGtk::~PageActionViewGtk() { | 1479 LocationBarViewGtk::PageActionViewGtk::~PageActionViewGtk() { |
1487 DisconnectPageActionAccelerator(); | |
1488 | |
1489 image_.Destroy(); | 1480 image_.Destroy(); |
1490 event_box_.Destroy(); | 1481 event_box_.Destroy(); |
1491 for (PixbufMap::iterator iter = pixbufs_.begin(); iter != pixbufs_.end(); | 1482 for (PixbufMap::iterator iter = pixbufs_.begin(); iter != pixbufs_.end(); |
1492 ++iter) { | 1483 ++iter) { |
1493 g_object_unref(iter->second); | 1484 g_object_unref(iter->second); |
1494 } | 1485 } |
1495 if (last_icon_pixbuf_) | 1486 if (last_icon_pixbuf_) |
1496 g_object_unref(last_icon_pixbuf_); | 1487 g_object_unref(last_icon_pixbuf_); |
1497 } | 1488 } |
1498 | 1489 |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1595 if (owner_) | 1586 if (owner_) |
1596 owner_->UpdatePageActions(); | 1587 owner_->UpdatePageActions(); |
1597 } | 1588 } |
1598 | 1589 |
1599 void LocationBarViewGtk::PageActionViewGtk::TestActivatePageAction() { | 1590 void LocationBarViewGtk::PageActionViewGtk::TestActivatePageAction() { |
1600 GdkEventButton event = {}; | 1591 GdkEventButton event = {}; |
1601 event.button = 1; | 1592 event.button = 1; |
1602 OnButtonPressed(widget(), &event); | 1593 OnButtonPressed(widget(), &event); |
1603 } | 1594 } |
1604 | 1595 |
1605 void LocationBarViewGtk::PageActionViewGtk::Observe( | |
1606 int type, | |
1607 const content::NotificationSource& source, | |
1608 const content::NotificationDetails& details) { | |
1609 DCHECK(type == chrome::NOTIFICATION_WINDOW_CLOSED); | |
1610 DisconnectPageActionAccelerator(); | |
1611 } | |
1612 | |
1613 void LocationBarViewGtk::PageActionViewGtk::InspectPopup( | 1596 void LocationBarViewGtk::PageActionViewGtk::InspectPopup( |
1614 ExtensionAction* action) { | 1597 ExtensionAction* action) { |
1615 ShowPopup(true); | 1598 ShowPopup(true); |
1616 } | 1599 } |
1617 | 1600 |
1618 bool LocationBarViewGtk::PageActionViewGtk::ShowPopup(bool devtools) { | 1601 bool LocationBarViewGtk::PageActionViewGtk::ShowPopup(bool devtools) { |
1619 if (!page_action_->HasPopup(current_tab_id_)) | 1602 if (!page_action_->HasPopup(current_tab_id_)) |
1620 return false; | 1603 return false; |
1621 | 1604 |
1622 ExtensionPopupGtk::Show( | 1605 ExtensionPopupGtk::Show( |
1623 page_action_->GetPopupUrl(current_tab_id_), | 1606 page_action_->GetPopupUrl(current_tab_id_), |
1624 owner_->browser_, | 1607 owner_->browser_, |
1625 event_box_.get(), | 1608 event_box_.get(), |
1626 devtools); | 1609 devtools); |
1627 return true; | 1610 return true; |
1628 } | 1611 } |
1629 | 1612 |
1630 void LocationBarViewGtk::PageActionViewGtk::ConnectPageActionAccelerator() { | |
1631 const ExtensionSet* extensions = owner_->browser()->profile()-> | |
1632 GetExtensionService()->extensions(); | |
1633 const Extension* extension = | |
1634 extensions->GetByID(page_action_->extension_id()); | |
1635 window_ = owner_->browser()->window()->GetNativeHandle(); | |
1636 | |
1637 // Iterate through all the keybindings and see if one is assigned to the | |
1638 // pageAction. | |
1639 const std::vector<Extension::ExtensionKeybinding>& commands = | |
1640 extension->keybindings(); | |
1641 for (size_t i = 0; i < commands.size(); ++i) { | |
1642 if (commands[i].command_name() != | |
1643 extension_manifest_values::kPageActionKeybindingEvent) | |
1644 continue; | |
1645 | |
1646 // Found the browser action shortcut command, register it. | |
1647 keybinding_.reset(new ui::AcceleratorGtk( | |
1648 commands[i].accelerator().key_code(), | |
1649 commands[i].accelerator().IsShiftDown(), | |
1650 commands[i].accelerator().IsCtrlDown(), | |
1651 commands[i].accelerator().IsAltDown())); | |
1652 | |
1653 accel_group_ = gtk_accel_group_new(); | |
1654 gtk_window_add_accel_group(window_, accel_group_); | |
1655 | |
1656 gtk_accel_group_connect( | |
1657 accel_group_, | |
1658 keybinding_->GetGdkKeyCode(), | |
1659 keybinding_->gdk_modifier_type(), | |
1660 GtkAccelFlags(0), | |
1661 g_cclosure_new(G_CALLBACK(OnGtkAccelerator), this, NULL)); | |
1662 | |
1663 // Since we've added an accelerator, we'll need to unregister it before | |
1664 // the window is closed, so we listen for the window being closed. | |
1665 registrar_.Add(this, | |
1666 chrome::NOTIFICATION_WINDOW_CLOSED, | |
1667 content::Source<GtkWindow>(window_)); | |
1668 break; | |
1669 } | |
1670 } | |
1671 | |
1672 void LocationBarViewGtk::PageActionViewGtk::DisconnectPageActionAccelerator() { | |
1673 if (accel_group_) { | |
1674 gtk_accel_group_disconnect_key( | |
1675 accel_group_, | |
1676 keybinding_.get()->GetGdkKeyCode(), | |
1677 static_cast<GdkModifierType>(keybinding_.get()->modifiers())); | |
1678 gtk_window_remove_accel_group(window_, accel_group_); | |
1679 g_object_unref(accel_group_); | |
1680 accel_group_ = NULL; | |
1681 keybinding_.reset(NULL); | |
1682 } | |
1683 } | |
1684 | |
1685 gboolean LocationBarViewGtk::PageActionViewGtk::OnButtonPressed( | 1613 gboolean LocationBarViewGtk::PageActionViewGtk::OnButtonPressed( |
1686 GtkWidget* sender, | 1614 GtkWidget* sender, |
1687 GdkEventButton* event) { | 1615 GdkEventButton* event) { |
1688 Profile* profile = owner_->browser()->profile(); | 1616 Profile* profile = owner_->browser()->profile(); |
1689 if (event->button != 3) { | 1617 if (event->button != 3) { |
1690 if (!ShowPopup(false)) { | 1618 if (!ShowPopup(false)) { |
1691 ExtensionService* service = profile->GetExtensionService(); | 1619 ExtensionService* service = profile->GetExtensionService(); |
1692 service->browser_event_router()->PageActionExecuted(profile, | 1620 service->browser_event_router()->PageActionExecuted(profile, |
1693 page_action_->extension_id(), page_action_->id(), current_tab_id_, | 1621 page_action_->extension_id(), page_action_->id(), current_tab_id_, |
1694 current_url_.spec(), event->button); | 1622 current_url_.spec(), event->button); |
(...skipping 29 matching lines...) Expand all Loading... |
1724 std::string badge_text = page_action_->GetBadgeText(tab_id); | 1652 std::string badge_text = page_action_->GetBadgeText(tab_id); |
1725 if (badge_text.empty()) | 1653 if (badge_text.empty()) |
1726 return FALSE; | 1654 return FALSE; |
1727 | 1655 |
1728 gfx::CanvasSkiaPaint canvas(event, false); | 1656 gfx::CanvasSkiaPaint canvas(event, false); |
1729 GtkAllocation allocation; | 1657 GtkAllocation allocation; |
1730 gtk_widget_get_allocation(widget, &allocation); | 1658 gtk_widget_get_allocation(widget, &allocation); |
1731 page_action_->PaintBadge(&canvas, gfx::Rect(allocation), tab_id); | 1659 page_action_->PaintBadge(&canvas, gfx::Rect(allocation), tab_id); |
1732 return FALSE; | 1660 return FALSE; |
1733 } | 1661 } |
1734 | |
1735 void LocationBarViewGtk::PageActionViewGtk::OnRealize(GtkWidget* widget) { | |
1736 ConnectPageActionAccelerator(); | |
1737 } | |
1738 | |
1739 // static | |
1740 gboolean LocationBarViewGtk::PageActionViewGtk::OnGtkAccelerator( | |
1741 GtkAccelGroup* accel_group, | |
1742 GObject* acceleratable, | |
1743 guint keyval, | |
1744 GdkModifierType modifier, | |
1745 void* user_data) { | |
1746 PageActionViewGtk* view = static_cast<PageActionViewGtk*>(user_data); | |
1747 if (!gtk_widget_get_visible(view->widget())) | |
1748 return FALSE; | |
1749 | |
1750 GdkEventButton event = {}; | |
1751 event.button = 1; | |
1752 return view->OnButtonPressed(view->widget(), &event); | |
1753 } | |
OLD | NEW |