#include "base/strings/string_util.h"
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
-#include "chrome/app/chrome_command_ids.h"
#import "chrome/browser/app_controller_mac.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/command_updater.h"
#include "chrome/browser/extensions/api/omnibox/omnibox_api.h"
#include "chrome/browser/extensions/api/tabs/tabs_api.h"
#include "chrome/browser/extensions/extension_action.h"
+#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/location_bar_controller.h"
#include "chrome/browser/extensions/tab_helper.h"
-#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/search/instant_service.h"
+#include "chrome/browser/search/instant_service_factory.h"
+#include "chrome/browser/search/search.h"
#include "chrome/browser/search_engines/template_url.h"
#include "chrome/browser/search_engines/template_url_service.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
#import "chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_cell.h"
#import "chrome/browser/ui/cocoa/location_bar/content_setting_decoration.h"
#import "chrome/browser/ui/cocoa/location_bar/ev_bubble_decoration.h"
+#import "chrome/browser/ui/cocoa/location_bar/generated_credit_card_decoration.h"
#import "chrome/browser/ui/cocoa/location_bar/keyword_hint_decoration.h"
#import "chrome/browser/ui/cocoa/location_bar/location_icon_decoration.h"
#import "chrome/browser/ui/cocoa/location_bar/mic_search_decoration.h"
#import "chrome/browser/ui/cocoa/location_bar/page_action_decoration.h"
+#import "chrome/browser/ui/cocoa/location_bar/search_button_decoration.h"
#import "chrome/browser/ui/cocoa/location_bar/selected_keyword_decoration.h"
#import "chrome/browser/ui/cocoa/location_bar/star_decoration.h"
#import "chrome/browser/ui/cocoa/location_bar/zoom_decoration.h"
#include "chrome/browser/ui/omnibox/location_bar_util.h"
#import "chrome/browser/ui/omnibox/omnibox_popup_model.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/toolbar/toolbar_model.h"
#include "chrome/browser/ui/zoom/zoom_controller.h"
#include "chrome/common/chrome_switches.h"
-#include "chrome/common/extensions/extension.h"
-#include "chrome/common/extensions/feature_switch.h"
#include "chrome/common/pref_names.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/web_contents.h"
+#include "extensions/browser/extension_system.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/permissions/permissions_data.h"
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
#include "net/base/net_util.h"
// bubble arrow point.
const static int kFirstRunBubbleYOffset = 1;
+// Functor for moving BookmarkManagerPrivate page actions to the right via
+// stable_partition.
+class IsPageActionViewRightAligned {
+ public:
+ explicit IsPageActionViewRightAligned(ExtensionService* extension_service)
+ : extension_service_(extension_service) {}
+
+ bool operator()(PageActionDecoration* page_action_decoration) {
+ return extensions::PermissionsData::HasAPIPermission(
+ extension_service_->GetExtensionById(
+ page_action_decoration->page_action()->extension_id(),
+ false),
+ extensions::APIPermission::kBookmarkManagerPrivate);
+ }
+
+ private:
+ ExtensionService* extension_service_;
+
+ // NOTE: Can't DISALLOW_COPY_AND_ASSIGN as we pass this object by value to
+ // std::stable_partition().
+};
+
}
// TODO(shess): This code is mostly copied from the gtk
CommandUpdater* command_updater,
Profile* profile,
Browser* browser)
- : OmniboxEditController(command_updater),
+ : LocationBar(profile),
+ OmniboxEditController(command_updater),
omnibox_view_(new OmniboxViewMac(this, profile, command_updater, field)),
field_(field),
location_icon_decoration_(new LocationIconDecoration(this)),
zoom_decoration_(new ZoomDecoration(this)),
keyword_hint_decoration_(new KeywordHintDecoration()),
mic_search_decoration_(new MicSearchDecoration(command_updater)),
- profile_(profile),
+ generated_credit_card_decoration_(
+ new GeneratedCreditCardDecoration(this)),
+ search_button_decoration_(new SearchButtonDecoration(this)),
browser_(browser),
weak_ptr_factory_(this) {
DCHECK_EQ(i, content_setting_decorations_.size());
ContentSettingsType type = static_cast<ContentSettingsType>(i);
content_setting_decorations_.push_back(
- new ContentSettingDecoration(type, this, profile_));
+ new ContentSettingDecoration(type, this, profile));
}
- registrar_.Add(this,
- chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_VISIBILITY_CHANGED,
+ registrar_.Add(
+ this, chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_VISIBILITY_CHANGED,
content::NotificationService::AllSources());
- registrar_.Add(this,
- chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED,
- content::Source<Profile>(browser_->profile()));
+ content::Source<Profile> profile_source = content::Source<Profile>(profile);
+ registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED,
+ profile_source);
+ registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, profile_source);
+ registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, profile_source);
edit_bookmarks_enabled_.Init(
- prefs::kEditBookmarksEnabled,
- profile_->GetPrefs(),
+ prefs::kEditBookmarksEnabled, profile->GetPrefs(),
base::Bind(&LocationBarViewMac::OnEditBookmarksEnabledChanged,
base::Unretained(this)));
void LocationBarViewMac::ShowFirstRunBubble() {
// We need the browser window to be shown before we can show the bubble, but
// we get called before that's happened.
- base::MessageLoop::current()->PostTask(FROM_HERE,
- base::Bind(&LocationBarViewMac::ShowFirstRunBubbleInternal,
- weak_ptr_factory_.GetWeakPtr()));
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(&LocationBarViewMac::ShowFirstRunBubbleInternal,
+ weak_ptr_factory_.GetWeakPtr()));
}
GURL LocationBarViewMac::GetDestinationURL() const {
void LocationBarViewMac::UpdateContentSettingsIcons() {
if (RefreshContentSettingsDecorations())
OnDecorationsChanged();
- PopUpContentSettingIfNeeded();
}
void LocationBarViewMac::UpdatePageActions() {
}
void LocationBarViewMac::UpdateGeneratedCreditCardView() {
- // TODO(dbeam): encourage groby@ to implement via prodding or chocolate.
- NOTIMPLEMENTED();
+ generated_credit_card_decoration_->Update();
}
void LocationBarViewMac::SaveStateToContents(WebContents* contents) {
omnibox_view_->RevertAll();
}
-const OmniboxView* LocationBarViewMac::GetLocationEntry() const {
+const OmniboxView* LocationBarViewMac::GetOmniboxView() const {
return omnibox_view_.get();
}
-OmniboxView* LocationBarViewMac::GetLocationEntry() {
+OmniboxView* LocationBarViewMac::GetOmniboxView() {
return omnibox_view_.get();
}
zoom_decoration_->ShowBubble(YES);
}
+bool LocationBarViewMac::IsStarEnabled() const {
+ return browser_defaults::bookmarks_enabled &&
+ [field_ isEditable] &&
+ !GetToolbarModel()->input_in_progress() &&
+ edit_bookmarks_enabled_.GetValue() &&
+ !IsBookmarkStarHiddenByExtension();
+}
+
NSPoint LocationBarViewMac::GetBookmarkBubblePoint() const {
+ DCHECK(IsStarEnabled());
+
AutocompleteTextFieldCell* cell = [field_ cell];
const NSRect frame = [cell frameForDecoration:star_decoration_.get()
inFrame:[field_ bounds]];
}
}
+NSPoint LocationBarViewMac::GetGeneratedCreditCardBubblePoint() const {
+ AutocompleteTextFieldCell* cell = [field_ cell];
+ const NSRect frame =
+ [cell frameForDecoration:generated_credit_card_decoration_.get()
+ inFrame:[field_ bounds]];
+ const NSPoint point =
+ generated_credit_card_decoration_->GetBubblePointInFrame(frame);
+ return [field_ convertPoint:point toView:nil];
+}
+
void LocationBarViewMac::OnDecorationsChanged() {
// TODO(shess): The field-editor frame and cursor rects should not
// change, here.
[cell addLeftDecoration:location_icon_decoration_.get()];
[cell addLeftDecoration:selected_keyword_decoration_.get()];
[cell addLeftDecoration:ev_bubble_decoration_.get()];
+ [cell addRightDecoration:search_button_decoration_.get()];
[cell addRightDecoration:star_decoration_.get()];
[cell addRightDecoration:zoom_decoration_.get()];
+ [cell addRightDecoration:generated_credit_card_decoration_.get()];
// Note that display order is right to left.
for (size_t i = 0; i < page_action_decorations_.size(); ++i) {
[cell addRightDecoration:page_action_decorations_[i]];
}
- // Iterate through |content_setting_decorations_| in reverse order so that
- // the order in which the decorations are drawn matches the Views code.
for (ScopedVector<ContentSettingDecoration>::iterator i =
content_setting_decorations_.begin();
i != content_setting_decorations_.end(); ++i) {
keyword_hint_decoration_->SetVisible(false);
// Get the keyword to use for keyword-search and hinting.
- const string16 keyword = omnibox_view_->model()->keyword();
- string16 short_name;
+ const base::string16 keyword = omnibox_view_->model()->keyword();
+ base::string16 short_name;
bool is_extension_keyword = false;
if (!keyword.empty()) {
- short_name = TemplateURLServiceFactory::GetForProfile(profile_)->
+ short_name = TemplateURLServiceFactory::GetForProfile(profile())->
GetKeywordShortName(keyword, &is_extension_keyword);
}
location_icon_decoration_->SetVisible(false);
ev_bubble_decoration_->SetVisible(true);
- string16 label(GetToolbarModel()->GetEVCertName());
+ base::string16 label(GetToolbarModel()->GetEVCertName());
ev_bubble_decoration_->SetFullLabel(base::SysUTF16ToNSString(label));
} else if (!keyword.empty() && is_keyword_hint) {
keyword_hint_decoration_->SetKeyword(short_name,
}
void LocationBarViewMac::Update(const WebContents* contents) {
- command_updater()->UpdateCommandEnabled(IDC_BOOKMARK_PAGE, IsStarEnabled());
- command_updater()->UpdateCommandEnabled(IDC_BOOKMARK_PAGE_FROM_STAR,
- IsStarEnabled());
UpdateStarDecorationVisibility();
UpdateZoomDecoration();
RefreshPageActionDecorations();
RefreshContentSettingsDecorations();
UpdateMicSearchDecorationVisibility();
+ UpdateGeneratedCreditCardView();
if (contents)
omnibox_view_->OnTabChanged(contents);
else
NSImage* image = OmniboxViewMac::ImageForResource(resource_id);
location_icon_decoration_->SetImage(image);
ev_bubble_decoration_->SetImage(image);
+
+ ToolbarModel* toolbar_model = GetToolbarModel();
+ const chrome::DisplaySearchButtonConditions conditions =
+ chrome::GetDisplaySearchButtonConditions();
+ const bool meets_conditions =
+ (conditions == chrome::DISPLAY_SEARCH_BUTTON_ALWAYS) ||
+ ((conditions != chrome::DISPLAY_SEARCH_BUTTON_NEVER) &&
+ (toolbar_model->WouldPerformSearchTermReplacement(true) ||
+ ((conditions == chrome::DISPLAY_SEARCH_BUTTON_FOR_STR_OR_IIP) &&
+ toolbar_model->input_in_progress())));
+ search_button_decoration_->SetVisible(
+ ![[field_ cell] isPopupMode] && meets_conditions);
+ search_button_decoration_->SetIcon(
+ (resource_id == IDR_OMNIBOX_SEARCH) ?
+ IDR_OMNIBOX_SEARCH_BUTTON_LOUPE : IDR_OMNIBOX_SEARCH_BUTTON_ARROW);
+
Layout();
- if (browser_->instant_controller()) {
- browser_->instant_controller()->SetOmniboxBounds(
- gfx::Rect(NSRectToCGRect([field_ frame])));
+ InstantService* instant_service =
+ InstantServiceFactory::GetForProfile(profile());
+ if (instant_service) {
+ gfx::Rect bounds(NSRectToCGRect([field_ frame]));
+ instant_service->OnOmniboxStartMarginChanged(bounds.x());
}
}
return browser_->toolbar_model();
}
-NSImage* LocationBarViewMac::GetKeywordImage(const string16& keyword) {
+NSImage* LocationBarViewMac::GetKeywordImage(const base::string16& keyword) {
const TemplateURL* template_url = TemplateURLServiceFactory::GetForProfile(
- profile_)->GetTemplateURLForKeyword(keyword);
+ profile())->GetTemplateURLForKeyword(keyword);
if (template_url &&
(template_url->GetType() == TemplateURL::OMNIBOX_API_EXTENSION)) {
- return extensions::OmniboxAPI::Get(profile_)->
+ return extensions::OmniboxAPI::Get(profile())->
GetOmniboxIcon(template_url->GetExtensionId()).AsNSImage();
}
break;
}
+ case chrome::NOTIFICATION_EXTENSION_LOADED:
+ case chrome::NOTIFICATION_EXTENSION_UNLOADED:
+ Update(NULL);
+ break;
+
default:
NOTREACHED() << "Unexpected notification";
break;
return NULL;
}
-void LocationBarViewMac::PopUpContentSettingIfNeeded() {
- AutocompleteTextFieldCell* cell = [field_ cell];
- const NSRect bounds = [field_ bounds];
- for (size_t i = 0; i < content_setting_decorations_.size(); ++i) {
- const NSRect frame =
- [cell frameForDecoration:content_setting_decorations_[i]
- inFrame:bounds];
- content_setting_decorations_[i]->PopUpIfNeeded(frame);
- }
-}
void LocationBarViewMac::DeletePageActionDecorations() {
// TODO(shess): Deleting these decorations could result in the cell
page_action_decorations_.push_back(
new PageActionDecoration(this, browser_, page_actions_[i]));
}
+
+ // Move rightmost extensions to the start.
+ std::stable_partition(
+ page_action_decorations_.begin(),
+ page_action_decorations_.end(),
+ IsPageActionViewRightAligned(
+ extensions::ExtensionSystem::Get(profile())->extension_service()));
}
GURL url = GetToolbarModel()->GetURL();
[FirstRunBubbleController showForView:field_
offset:kOffset
browser:browser_
- profile:profile_];
-}
-
-bool LocationBarViewMac::IsStarEnabled() {
- return [field_ isEditable] &&
- browser_defaults::bookmarks_enabled &&
- !GetToolbarModel()->input_in_progress() &&
- edit_bookmarks_enabled_.GetValue();
+ profile:profile()];
}
void LocationBarViewMac::UpdateZoomDecoration() {