Chromium Code Reviews| Index: chrome/browser/ui/views/location_bar/location_bar_view.cc |
| diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc |
| index 4b2dbd2e88f0ae63b660051489ca93acfe3f9197..1ce39eb330a13daddd327761ee2ede93c67e9f78 100644 |
| --- a/chrome/browser/ui/views/location_bar/location_bar_view.cc |
| +++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc |
| @@ -190,7 +190,8 @@ LocationBarView::LocationBarView(Browser* browser, |
| is_popup_mode_(is_popup_mode), |
| show_focus_rect_(false), |
| template_url_service_(NULL), |
| - animation_offset_(0) { |
| + animation_offset_(0), |
| + weak_ptr_factory_(this) { |
| if (!views::Textfield::IsViewsTextfieldEnabled()) |
| set_id(VIEW_ID_OMNIBOX); |
| @@ -635,17 +636,6 @@ void LocationBarView::ZoomChangedForActiveTab(bool can_show_bubble) { |
| ZoomBubbleView::ShowBubble(delegate_->GetWebContents(), true); |
| } |
| -void LocationBarView::RefreshZoomView() { |
| - DCHECK(zoom_view_); |
| - WebContents* web_contents = GetWebContents(); |
| - if (!web_contents) |
| - return; |
| - |
| - ZoomController* zoom_controller = |
| - ZoomController::FromWebContents(web_contents); |
| - zoom_view_->Update(zoom_controller); |
| -} |
| - |
| gfx::Point LocationBarView::GetLocationEntryOrigin() const { |
| gfx::Point origin(location_entry_view_->bounds().origin()); |
| // If the UI layout is RTL, the coordinate system is not transformed and |
| @@ -1122,184 +1112,6 @@ const ToolbarModel* LocationBarView::GetToolbarModel() const { |
| return delegate_->GetToolbarModel(); |
| } |
| -// static |
| -int LocationBarView::GetBuiltInHorizontalPaddingForChildViews() { |
| - return (ui::GetDisplayLayout() == ui::LAYOUT_TOUCH) ? |
| - GetItemPadding() / 2 : 0; |
| -} |
| - |
| -int LocationBarView::GetHorizontalEdgeThickness() const { |
| - // In maximized popup mode, there isn't any edge. |
| - return (is_popup_mode_ && browser_ && browser_->window() && |
| - browser_->window()->IsMaximized()) ? 0 : vertical_edge_thickness(); |
| -} |
| - |
| -void LocationBarView::RefreshContentSettingViews() { |
| - for (ContentSettingViews::const_iterator i(content_setting_views_.begin()); |
| - i != content_setting_views_.end(); ++i) { |
| - (*i)->Update(GetToolbarModel()->input_in_progress() ? |
| - NULL : GetWebContents()); |
| - } |
| -} |
| - |
| -void LocationBarView::DeletePageActionViews() { |
| - for (PageActionViews::const_iterator i(page_action_views_.begin()); |
| - i != page_action_views_.end(); ++i) |
| - RemoveChildView(*i); |
| - STLDeleteElements(&page_action_views_); |
| -} |
| - |
| -void LocationBarView::RefreshPageActionViews() { |
| - if (is_popup_mode_) |
| - return; |
| - |
| - // Remember the previous visibility of the page actions so that we can |
| - // notify when this changes. |
| - std::map<ExtensionAction*, bool> old_visibility; |
| - for (PageActionViews::const_iterator i(page_action_views_.begin()); |
| - i != page_action_views_.end(); ++i) { |
| - old_visibility[(*i)->image_view()->page_action()] = (*i)->visible(); |
| - } |
| - |
| - std::vector<ExtensionAction*> new_page_actions; |
| - |
| - WebContents* contents = delegate_->GetWebContents(); |
| - if (contents) { |
| - extensions::TabHelper* extensions_tab_helper = |
| - extensions::TabHelper::FromWebContents(contents); |
| - extensions::LocationBarController* controller = |
| - extensions_tab_helper->location_bar_controller(); |
| - new_page_actions = controller->GetCurrentActions(); |
| - } |
| - |
| - // On startup we sometimes haven't loaded any extensions. This makes sure |
| - // we catch up when the extensions (and any page actions) load. |
| - if (page_actions_ != new_page_actions) { |
| - page_actions_.swap(new_page_actions); |
| - DeletePageActionViews(); // Delete the old views (if any). |
| - |
| - page_action_views_.resize(page_actions_.size()); |
| - View* right_anchor = open_pdf_in_reader_view_; |
| - if (!right_anchor) |
| - right_anchor = star_view_; |
| - if (!right_anchor) |
| - right_anchor = script_bubble_icon_view_; |
| - DCHECK(right_anchor); |
| - |
| - // Add the page actions in reverse order, so that the child views are |
| - // inserted in left-to-right order for accessibility. |
| - for (int i = page_actions_.size() - 1; i >= 0; --i) { |
| - page_action_views_[i] = new PageActionWithBadgeView( |
| - delegate_->CreatePageActionImageView(this, page_actions_[i])); |
| - page_action_views_[i]->SetVisible(false); |
| - AddChildViewAt(page_action_views_[i], GetIndexOf(right_anchor)); |
| - } |
| - } |
| - |
| - if (!page_action_views_.empty() && contents) { |
| - Browser* browser = chrome::FindBrowserWithWebContents(contents); |
| - GURL url = browser->tab_strip_model()->GetActiveWebContents()->GetURL(); |
| - |
| - for (PageActionViews::const_iterator i(page_action_views_.begin()); |
| - i != page_action_views_.end(); ++i) { |
| - (*i)->UpdateVisibility( |
| - GetToolbarModel()->input_in_progress() ? NULL : contents, url); |
| - |
| - // Check if the visibility of the action changed and notify if it did. |
| - ExtensionAction* action = (*i)->image_view()->page_action(); |
| - if (old_visibility.find(action) == old_visibility.end() || |
| - old_visibility[action] != (*i)->visible()) { |
| - content::NotificationService::current()->Notify( |
| - chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_VISIBILITY_CHANGED, |
| - content::Source<ExtensionAction>(action), |
| - content::Details<WebContents>(contents)); |
| - } |
| - } |
| - } |
| -} |
| - |
| -size_t LocationBarView::ScriptBubbleScriptsRunning() { |
| - WebContents* contents = delegate_->GetWebContents(); |
| - if (!contents) |
| - return false; |
| - extensions::TabHelper* extensions_tab_helper = |
| - extensions::TabHelper::FromWebContents(contents); |
| - if (!extensions_tab_helper) |
| - return false; |
| - extensions::ScriptBubbleController* script_bubble_controller = |
| - extensions_tab_helper->script_bubble_controller(); |
| - if (!script_bubble_controller) |
| - return false; |
| - size_t script_count = |
| - script_bubble_controller->extensions_running_scripts().size(); |
| - return script_count; |
| -} |
| - |
| -void LocationBarView::RefreshScriptBubble() { |
| - if (!script_bubble_icon_view_) |
| - return; |
| - size_t script_count = ScriptBubbleScriptsRunning(); |
| - script_bubble_icon_view_->SetVisible(script_count > 0); |
| - if (script_count > 0) |
| - script_bubble_icon_view_->SetScriptCount(script_count); |
| -} |
| - |
| -#if defined(OS_WIN) && !defined(USE_AURA) |
| -void LocationBarView::OnMouseEvent(const ui::MouseEvent& event, UINT msg) { |
| - OmniboxViewWin* omnibox_win = GetOmniboxViewWin(location_entry_.get()); |
| - if (omnibox_win) { |
| - UINT flags = event.native_event().wParam; |
| - gfx::Point screen_point(event.location()); |
| - ConvertPointToScreen(this, &screen_point); |
| - omnibox_win->HandleExternalMsg(msg, flags, screen_point.ToPOINT()); |
| - } |
| -} |
| -#endif |
| - |
| -void LocationBarView::ShowFirstRunBubbleInternal() { |
| -#if !defined(OS_CHROMEOS) |
| - // First run bubble doesn't make sense for Chrome OS. |
| - Browser* browser = GetBrowserFromDelegate(delegate_); |
| - if (!browser) |
| - return; // Possible when browser is shutting down. |
| - |
| - FirstRunBubble::ShowBubble(browser, location_icon_view_); |
| -#endif |
| -} |
| - |
| -void LocationBarView::PaintPageActionBackgrounds(gfx::Canvas* canvas) { |
| - WebContents* web_contents = GetWebContents(); |
| - // web_contents may be NULL while the browser is shutting down. |
| - if (!web_contents) |
| - return; |
| - |
| - const int32 tab_id = SessionID::IdForTab(web_contents); |
| - const ToolbarModel::SecurityLevel security_level = |
| - GetToolbarModel()->GetSecurityLevel(false); |
| - const SkColor text_color = GetColor(security_level, TEXT); |
| - const SkColor background_color = GetColor(security_level, BACKGROUND); |
| - |
| - for (PageActionViews::const_iterator |
| - page_action_view = page_action_views_.begin(); |
| - page_action_view != page_action_views_.end(); |
| - ++page_action_view) { |
| - gfx::Rect bounds = (*page_action_view)->bounds(); |
| - int horizontal_padding = |
| - GetItemPadding() - GetBuiltInHorizontalPaddingForChildViews(); |
| - // Make the bounding rectangle include the whole vertical range of the |
| - // location bar, and the mid-point pixels between adjacent page actions. |
| - // |
| - // For odd horizontal_paddings, "horizontal_padding + 1" includes the |
| - // mid-point between two page actions in the bounding rectangle. For even |
| - // paddings, the +1 is dropped, which is right since there is no pixel at |
| - // the mid-point. |
| - bounds.Inset(-(horizontal_padding + 1) / 2, 0); |
| - location_bar_util::PaintExtensionActionBackground( |
| - *(*page_action_view)->image_view()->page_action(), |
| - tab_id, canvas, bounds, text_color, background_color); |
| - } |
| -} |
| - |
| const char* LocationBarView::GetClassName() const { |
| return kViewClassName; |
| } |
| @@ -1332,6 +1144,9 @@ bool LocationBarView::SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) { |
| } |
| void LocationBarView::GetAccessibleState(ui::AccessibleViewState* state) { |
| + if (!location_entry_) |
| + return; |
| + |
| state->role = ui::AccessibilityTypes::ROLE_LOCATION_BAR; |
| state->name = l10n_util::GetStringUTF16(IDS_ACCNAME_LOCATION); |
| state->value = location_entry_->GetText(); |
| @@ -1341,6 +1156,14 @@ void LocationBarView::GetAccessibleState(ui::AccessibleViewState* state) { |
| location_entry_->GetSelectionBounds(&entry_start, &entry_end); |
| state->selection_start = entry_start; |
| state->selection_end = entry_end; |
| + |
| + if (is_popup_mode_) { |
| + state->state |= ui::AccessibilityTypes::STATE_READONLY; |
| + } else { |
| + state->set_value_callback = |
| + base::Bind(&LocationBarView::AccessibilitySetValue, |
| + weak_ptr_factory_.GetWeakPtr()); |
| + } |
| } |
| bool LocationBarView::HasFocus() const { |
| @@ -1556,7 +1379,204 @@ int LocationBarView::GetInternalHeight(bool use_preferred_size) { |
| return std::max(total_height - (vertical_edge_thickness() * 2), 0); |
| } |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// LocationBarView, private: |
| +////// |
|
msw
2013/09/04 20:18:20
nit: finish the slash comment art or remove it.
dmazzoni
2013/09/04 22:01:09
Done.
|
| + |
| +// static |
| +int LocationBarView::GetBuiltInHorizontalPaddingForChildViews() { |
| + return (ui::GetDisplayLayout() == ui::LAYOUT_TOUCH) ? |
| + GetItemPadding() / 2 : 0; |
| +} |
| + |
| +int LocationBarView::GetHorizontalEdgeThickness() const { |
| + // In maximized popup mode, there isn't any edge. |
| + return (is_popup_mode_ && browser_ && browser_->window() && |
| + browser_->window()->IsMaximized()) ? 0 : vertical_edge_thickness(); |
| +} |
| + |
| +void LocationBarView::RefreshContentSettingViews() { |
| + for (ContentSettingViews::const_iterator i(content_setting_views_.begin()); |
| + i != content_setting_views_.end(); ++i) { |
| + (*i)->Update(GetToolbarModel()->input_in_progress() ? |
| + NULL : GetWebContents()); |
| + } |
| +} |
| + |
| +void LocationBarView::DeletePageActionViews() { |
| + for (PageActionViews::const_iterator i(page_action_views_.begin()); |
| + i != page_action_views_.end(); ++i) |
| + RemoveChildView(*i); |
| + STLDeleteElements(&page_action_views_); |
| +} |
| + |
| +void LocationBarView::RefreshPageActionViews() { |
| + if (is_popup_mode_) |
| + return; |
| + |
| + // Remember the previous visibility of the page actions so that we can |
| + // notify when this changes. |
| + std::map<ExtensionAction*, bool> old_visibility; |
| + for (PageActionViews::const_iterator i(page_action_views_.begin()); |
| + i != page_action_views_.end(); ++i) { |
| + old_visibility[(*i)->image_view()->page_action()] = (*i)->visible(); |
| + } |
| + |
| + std::vector<ExtensionAction*> new_page_actions; |
| + |
| + WebContents* contents = delegate_->GetWebContents(); |
| + if (contents) { |
| + extensions::TabHelper* extensions_tab_helper = |
| + extensions::TabHelper::FromWebContents(contents); |
| + extensions::LocationBarController* controller = |
| + extensions_tab_helper->location_bar_controller(); |
| + new_page_actions = controller->GetCurrentActions(); |
| + } |
| + |
| + // On startup we sometimes haven't loaded any extensions. This makes sure |
| + // we catch up when the extensions (and any page actions) load. |
| + if (page_actions_ != new_page_actions) { |
| + page_actions_.swap(new_page_actions); |
| + DeletePageActionViews(); // Delete the old views (if any). |
| + |
| + page_action_views_.resize(page_actions_.size()); |
| + View* right_anchor = open_pdf_in_reader_view_; |
| + if (!right_anchor) |
| + right_anchor = star_view_; |
| + if (!right_anchor) |
| + right_anchor = script_bubble_icon_view_; |
| + DCHECK(right_anchor); |
| + |
| + // Add the page actions in reverse order, so that the child views are |
| + // inserted in left-to-right order for accessibility. |
| + for (int i = page_actions_.size() - 1; i >= 0; --i) { |
| + page_action_views_[i] = new PageActionWithBadgeView( |
| + delegate_->CreatePageActionImageView(this, page_actions_[i])); |
| + page_action_views_[i]->SetVisible(false); |
| + AddChildViewAt(page_action_views_[i], GetIndexOf(right_anchor)); |
| + } |
| + } |
| + |
| + if (!page_action_views_.empty() && contents) { |
| + Browser* browser = chrome::FindBrowserWithWebContents(contents); |
| + GURL url = browser->tab_strip_model()->GetActiveWebContents()->GetURL(); |
| + |
| + for (PageActionViews::const_iterator i(page_action_views_.begin()); |
| + i != page_action_views_.end(); ++i) { |
| + (*i)->UpdateVisibility( |
| + GetToolbarModel()->input_in_progress() ? NULL : contents, url); |
| + |
| + // Check if the visibility of the action changed and notify if it did. |
| + ExtensionAction* action = (*i)->image_view()->page_action(); |
| + if (old_visibility.find(action) == old_visibility.end() || |
| + old_visibility[action] != (*i)->visible()) { |
| + content::NotificationService::current()->Notify( |
| + chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_VISIBILITY_CHANGED, |
| + content::Source<ExtensionAction>(action), |
| + content::Details<WebContents>(contents)); |
| + } |
| + } |
| + } |
| +} |
| + |
| +size_t LocationBarView::ScriptBubbleScriptsRunning() { |
| + WebContents* contents = delegate_->GetWebContents(); |
| + if (!contents) |
| + return false; |
| + extensions::TabHelper* extensions_tab_helper = |
| + extensions::TabHelper::FromWebContents(contents); |
| + if (!extensions_tab_helper) |
| + return false; |
| + extensions::ScriptBubbleController* script_bubble_controller = |
| + extensions_tab_helper->script_bubble_controller(); |
| + if (!script_bubble_controller) |
| + return false; |
| + size_t script_count = |
| + script_bubble_controller->extensions_running_scripts().size(); |
| + return script_count; |
| +} |
| + |
| +void LocationBarView::RefreshScriptBubble() { |
| + if (!script_bubble_icon_view_) |
| + return; |
| + size_t script_count = ScriptBubbleScriptsRunning(); |
| + script_bubble_icon_view_->SetVisible(script_count > 0); |
| + if (script_count > 0) |
| + script_bubble_icon_view_->SetScriptCount(script_count); |
| +} |
| + |
| +void LocationBarView::RefreshZoomView() { |
| + DCHECK(zoom_view_); |
| + WebContents* web_contents = GetWebContents(); |
| + if (!web_contents) |
| + return; |
| + |
| + ZoomController* zoom_controller = |
| + ZoomController::FromWebContents(web_contents); |
| + zoom_view_->Update(zoom_controller); |
| +} |
| + |
| +#if defined(OS_WIN) && !defined(USE_AURA) |
| +void LocationBarView::OnMouseEvent(const ui::MouseEvent& event, UINT msg) { |
| + OmniboxViewWin* omnibox_win = GetOmniboxViewWin(location_entry_.get()); |
| + if (omnibox_win) { |
| + UINT flags = event.native_event().wParam; |
| + gfx::Point screen_point(event.location()); |
| + ConvertPointToScreen(this, &screen_point); |
| + omnibox_win->HandleExternalMsg(msg, flags, screen_point.ToPOINT()); |
| + } |
| +} |
| +#endif |
| + |
| bool LocationBarView::HasValidSuggestText() const { |
| return suggested_text_view_->visible() && |
| !suggested_text_view_->size().IsEmpty(); |
| } |
| + |
| +void LocationBarView::ShowFirstRunBubbleInternal() { |
| +#if !defined(OS_CHROMEOS) |
| + // First run bubble doesn't make sense for Chrome OS. |
| + Browser* browser = GetBrowserFromDelegate(delegate_); |
| + if (!browser) |
| + return; // Possible when browser is shutting down. |
| + |
| + FirstRunBubble::ShowBubble(browser, location_icon_view_); |
| +#endif |
| +} |
| + |
| +void LocationBarView::PaintPageActionBackgrounds(gfx::Canvas* canvas) { |
| + WebContents* web_contents = GetWebContents(); |
| + // web_contents may be NULL while the browser is shutting down. |
| + if (!web_contents) |
| + return; |
| + |
| + const int32 tab_id = SessionID::IdForTab(web_contents); |
| + const ToolbarModel::SecurityLevel security_level = |
| + GetToolbarModel()->GetSecurityLevel(false); |
| + const SkColor text_color = GetColor(security_level, TEXT); |
| + const SkColor background_color = GetColor(security_level, BACKGROUND); |
| + |
| + for (PageActionViews::const_iterator |
| + page_action_view = page_action_views_.begin(); |
| + page_action_view != page_action_views_.end(); |
| + ++page_action_view) { |
| + gfx::Rect bounds = (*page_action_view)->bounds(); |
| + int horizontal_padding = |
| + GetItemPadding() - GetBuiltInHorizontalPaddingForChildViews(); |
| + // Make the bounding rectangle include the whole vertical range of the |
| + // location bar, and the mid-point pixels between adjacent page actions. |
| + // |
| + // For odd horizontal_paddings, "horizontal_padding + 1" includes the |
| + // mid-point between two page actions in the bounding rectangle. For even |
| + // paddings, the +1 is dropped, which is right since there is no pixel at |
| + // the mid-point. |
| + bounds.Inset(-(horizontal_padding + 1) / 2, 0); |
| + location_bar_util::PaintExtensionActionBackground( |
| + *(*page_action_view)->image_view()->page_action(), |
| + tab_id, canvas, bounds, text_color, background_color); |
| + } |
| +} |
| + |
| +void LocationBarView::AccessibilitySetValue(const string16& new_value) { |
| + location_entry_->SetUserText(new_value); |
| +} |