1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
|
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_COCOA_LOCATION_BAR_VIEW_MAC_H_
#define CHROME_BROWSER_COCOA_LOCATION_BAR_VIEW_MAC_H_
#include <string>
#include <map>
#include <vector>
#import <Cocoa/Cocoa.h>
#include "base/scoped_nsobject.h"
#include "base/scoped_ptr.h"
#include "chrome/browser/autocomplete/autocomplete_edit.h"
#include "chrome/browser/autocomplete/autocomplete_edit_view_mac.h"
#include "chrome/browser/extensions/image_loading_tracker.h"
#include "chrome/browser/location_bar.h"
#include "chrome/browser/toolbar_model.h"
@class AutocompleteTextField;
class BubblePositioner;
class CommandUpdater;
class Profile;
class ToolbarModel;
// A C++ bridge class that represents the location bar UI element to
// the portable code. Wires up an AutocompleteEditViewMac instance to
// the location bar text field, which handles most of the work.
class LocationBarViewMac : public AutocompleteEditController,
public LocationBar,
public LocationBarTesting {
public:
LocationBarViewMac(AutocompleteTextField* field,
const BubblePositioner* bubble_positioner,
CommandUpdater* command_updater,
ToolbarModel* toolbar_model,
Profile* profile);
virtual ~LocationBarViewMac();
// Overridden from LocationBar:
virtual void ShowFirstRunBubble(bool use_OEM_bubble) { NOTIMPLEMENTED(); }
virtual std::wstring GetInputString() const;
virtual WindowOpenDisposition GetWindowOpenDisposition() const;
virtual PageTransition::Type GetPageTransition() const;
virtual void AcceptInput();
virtual void AcceptInputWithDisposition(WindowOpenDisposition disposition);
virtual void FocusLocation();
virtual void FocusSearch();
virtual void UpdatePageActions();
virtual void InvalidatePageActions();
virtual void SaveStateToContents(TabContents* contents);
virtual void Revert();
virtual AutocompleteEditView* location_entry() {
return edit_view_.get();
}
virtual LocationBarTesting* GetLocationBarForTesting() { return this; }
// Overriden from LocationBarTesting:
virtual int PageActionCount();
virtual int PageActionVisibleCount();
virtual ExtensionAction* GetPageAction(size_t index);
virtual ExtensionAction* GetVisiblePageAction(size_t index);
virtual void TestPageActionPressed(size_t index);
// Updates the location bar. Resets the bar's permanent text and
// security style, and if |should_restore_state| is true, restores
// saved state from the tab (for tab switching).
void Update(const TabContents* tab, bool should_restore_state);
virtual void OnAutocompleteAccept(const GURL& url,
WindowOpenDisposition disposition,
PageTransition::Type transition,
const GURL& alternate_nav_url);
virtual void OnChanged();
virtual void OnInputInProgress(bool in_progress);
virtual void OnKillFocus();
virtual void OnSetFocus();
virtual SkBitmap GetFavIcon() const;
virtual std::wstring GetTitle() const;
NSImage* GetTabButtonImage();
// Internals of OnChanged(), pulled out for purposes of unit
// testing. Sets up |field| based on the parameters, which are
// pulled from edit_view->model().
static void OnChangedImpl(AutocompleteTextField* field,
const std::wstring& keyword,
const std::wstring& short_name,
const bool is_keyword_hint,
const bool show_search_hint,
NSImage* image);
// Used to display a clickable icon in the location bar.
class LocationBarImageView {
public:
explicit LocationBarImageView() : image_(nil),
label_(nil),
visible_(false) {}
virtual ~LocationBarImageView() {}
// Sets the image.
void SetImage(NSImage* image);
void SetImage(SkBitmap* image);
// Sets the label text, font, and color. |text| may be nil; |color| and
// |font| are ignored if |text| is nil.
void SetLabel(NSString* text, NSFont* baseFont, NSColor* color);
// Sets the visibility. SetImage() should be called with a valid image
// before the visibility is set to |true|.
void SetVisible(bool visible);
const NSImage* GetImage() const { return image_; }
const NSAttributedString* GetLabel() const { return label_; }
bool IsVisible() const { return visible_; }
private:
scoped_nsobject<NSImage> image_;
// The label shown next to the icon, or nil if none.
scoped_nsobject<NSAttributedString> label_;
bool visible_;
DISALLOW_COPY_AND_ASSIGN(LocationBarImageView);
};
// SecurityImageView is used to display the lock or warning icon when the
// current URL's scheme is https.
class SecurityImageView : public LocationBarImageView {
public:
enum Image {
LOCK = 0,
WARNING
};
SecurityImageView(Profile* profile, ToolbarModel* model);
virtual ~SecurityImageView();
// Sets the image to the appropriate icon.
void SetImageShown(Image image);
// Shows the page info dialog. Virtual so it can be overridden for testing.
virtual bool OnMousePressed();
private:
// The lock icon shown when using HTTPS. Loaded lazily, the first time it's
// needed.
scoped_nsobject<NSImage> lock_icon_;
// The warning icon shown when HTTPS is broken. Loaded lazily, the first
// time it's needed.
scoped_nsobject<NSImage> warning_icon_;
Profile* profile_;
ToolbarModel* model_;
DISALLOW_COPY_AND_ASSIGN(SecurityImageView);
};
// PageActionImageView is used to display the icon for a given Page Action
// and notify the extension when the icon is clicked.
class PageActionImageView : public LocationBarImageView,
public ImageLoadingTracker::Observer,
public NotificationObserver {
public:
PageActionImageView(LocationBarViewMac* owner,
Profile* profile,
ExtensionAction* page_action);
virtual ~PageActionImageView();
ExtensionAction* page_action() { return page_action_; }
int current_tab_id() { return current_tab_id_; }
void set_preview_enabled(bool preview_enabled) {
preview_enabled_ = preview_enabled;
}
// Either notify listeners or show a popup depending on the Page Action.
// Virtual so it can be overridden for testing.
virtual bool OnMousePressed(NSRect bounds);
// Overridden from ImageLoadingTracker.
virtual void OnImageLoaded(SkBitmap* image, size_t index);
// Called to notify the Page Action that it should determine whether to be
// visible or hidden. |contents| is the TabContents that is active, |url|
// is the current page URL.
void UpdateVisibility(TabContents* contents, const GURL& url);
private:
// Overridden from NotificationObserver:
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
// The location bar view that owns us.
LocationBarViewMac* owner_;
// The current profile (not owned by us).
Profile* profile_;
// The Page Action that this view represents. The Page Action is not owned
// by us, it resides in the extension of this particular profile.
ExtensionAction* page_action_;
// A cache of images the Page Actions might need to show, mapped by path.
typedef std::map<std::string, SkBitmap> PageActionMap;
PageActionMap page_action_icons_;
// The object that is waiting for the image loading to complete
// asynchronously.
ImageLoadingTracker* tracker_;
// The tab id we are currently showing the icon for.
int current_tab_id_;
// The URL we are currently showing the icon for.
GURL current_url_;
// The string to show for a tooltip.
std::string tooltip_;
// This is used for post-install visual feedback. The page_action icon
// is briefly shown even if it hasn't been enabled by it's extension.
bool preview_enabled_;
// Used to register for notifications received by NotificationObserver.
NotificationRegistrar registrar_;
DISALLOW_COPY_AND_ASSIGN(PageActionImageView);
};
class PageActionViewList {
public:
PageActionViewList(LocationBarViewMac* location_bar,
Profile* profile,
ToolbarModel* toolbar_model)
: owner_(location_bar),
profile_(profile),
toolbar_model_(toolbar_model) {}
void DeleteAll();
void RefreshViews();
PageActionImageView* ViewAt(size_t index);
size_t Count();
size_t VisibleCount();
// Called when the action at |index| is clicked. The |iconFrame| should
// describe the bounds of the affected action's icon.
void OnMousePressed(NSRect iconFrame, size_t index);
private:
// Any installed Page Actions.
std::vector<PageActionImageView*> views_;
// The location bar view that owns us.
LocationBarViewMac* owner_;
Profile* profile_;
ToolbarModel* toolbar_model_;
DISALLOW_COPY_AND_ASSIGN(PageActionViewList);
};
private:
// Sets the SSL icon we should be showing.
void SetSecurityIcon(ToolbarModel::Icon icon);
// Sets the label for the SSL icon.
void SetSecurityIconLabel();
scoped_ptr<AutocompleteEditViewMac> edit_view_;
CommandUpdater* command_updater_; // Weak, owned by Browser.
AutocompleteTextField* field_; // owned by tab controller
// When we get an OnAutocompleteAccept notification from the autocomplete
// edit, we save the input string so we can give it back to the browser on
// the LocationBar interface via GetInputString().
std::wstring location_input_;
// The user's desired disposition for how their input should be opened.
WindowOpenDisposition disposition_;
// The view that shows the lock/warning when in HTTPS mode.
SecurityImageView security_image_view_;
// Any installed Page Actions.
PageActionViewList* page_action_views_;
Profile* profile_;
ToolbarModel* toolbar_model_; // Weak, owned by Browser.
// Image used in drawing keyword hint.
scoped_nsobject<NSImage> tab_button_image_;
// The transition type to use for the navigation.
PageTransition::Type transition_;
DISALLOW_COPY_AND_ASSIGN(LocationBarViewMac);
};
#endif // CHROME_BROWSER_COCOA_LOCATION_BAR_VIEW_MAC_H_
|