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/extensions/browser_event_router.h" | 5 #include "chrome/browser/extensions/api/tabs/tabs_event_router.h" |
6 | 6 |
7 #include "base/json/json_writer.h" | 7 #include "base/json/json_writer.h" |
8 #include "base/values.h" | 8 #include "base/values.h" |
9 #include "chrome/browser/chrome_notification_types.h" | 9 #include "chrome/browser/chrome_notification_types.h" |
10 #include "chrome/browser/extensions/api/tabs/tabs_constants.h" | 10 #include "chrome/browser/extensions/api/tabs/tabs_constants.h" |
11 #include "chrome/browser/extensions/api/tabs/tabs_windows_api.h" | 11 #include "chrome/browser/extensions/api/tabs/tabs_windows_api.h" |
12 #include "chrome/browser/extensions/api/tabs/windows_event_router.h" | 12 #include "chrome/browser/extensions/api/tabs/windows_event_router.h" |
13 #include "chrome/browser/extensions/extension_service.h" | |
14 #include "chrome/browser/extensions/extension_system.h" | 13 #include "chrome/browser/extensions/extension_system.h" |
15 #include "chrome/browser/extensions/extension_tab_util.h" | 14 #include "chrome/browser/extensions/extension_tab_util.h" |
16 #include "chrome/browser/extensions/window_controller.h" | |
17 #include "chrome/browser/profiles/profile.h" | 15 #include "chrome/browser/profiles/profile.h" |
18 #include "chrome/browser/ui/browser.h" | 16 #include "chrome/browser/ui/browser.h" |
19 #include "chrome/browser/ui/browser_iterator.h" | 17 #include "chrome/browser/ui/browser_iterator.h" |
20 #include "chrome/browser/ui/browser_list.h" | 18 #include "chrome/browser/ui/browser_list.h" |
21 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 19 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
22 #include "chrome/common/extensions/extension_constants.h" | 20 #include "chrome/common/extensions/extension_constants.h" |
23 #include "content/public/browser/favicon_status.h" | 21 #include "content/public/browser/favicon_status.h" |
24 #include "content/public/browser/navigation_controller.h" | 22 #include "content/public/browser/navigation_controller.h" |
25 #include "content/public/browser/navigation_entry.h" | 23 #include "content/public/browser/navigation_entry.h" |
26 #include "content/public/browser/notification_service.h" | 24 #include "content/public/browser/notification_service.h" |
27 #include "content/public/browser/notification_types.h" | 25 #include "content/public/browser/notification_types.h" |
28 #include "content/public/browser/web_contents.h" | 26 #include "content/public/browser/web_contents.h" |
29 | 27 |
30 namespace tab_keys = extensions::tabs_constants; | 28 using base::DictionaryValue; |
31 | 29 using base::ListValue; |
Yoyo Zhou
2013/09/10 23:03:09
also could using FundamentalValue
Devlin
2013/09/11 00:49:50
Done.
| |
32 using content::NavigationController; | 30 using content::NavigationController; |
33 using content::WebContents; | 31 using content::WebContents; |
34 | 32 |
35 namespace extensions { | 33 namespace extensions { |
36 | 34 |
35 namespace { | |
36 | |
37 namespace tabs = api::tabs; | 37 namespace tabs = api::tabs; |
38 | 38 |
39 BrowserEventRouter::TabEntry::TabEntry() | 39 void WillDispatchTabUpdatedEvent(WebContents* contents, |
40 : complete_waiting_on_load_(false), | 40 const DictionaryValue* changed_properties, |
41 url_() { | 41 Profile* profile, |
42 const Extension* extension, | |
43 ListValue* event_args) { | |
44 // Overwrite the second argument with the appropriate properties dictionary, | |
45 // depending on extension permissions. | |
46 DictionaryValue* properties_value = changed_properties->DeepCopy(); | |
47 ExtensionTabUtil::ScrubTabValueForExtension(contents, | |
48 extension, | |
49 properties_value); | |
50 event_args->Set(1, properties_value); | |
51 | |
52 // Overwrite the third arg with our tab value as seen by this extension. | |
53 event_args->Set(2, ExtensionTabUtil::CreateTabValue(contents, extension)); | |
42 } | 54 } |
43 | 55 |
44 DictionaryValue* BrowserEventRouter::TabEntry::UpdateLoadState( | 56 } // namespace |
57 | |
58 TabsEventRouter::TabEntry::TabEntry() : complete_waiting_on_load_(false), | |
59 url_() { | |
60 } | |
61 | |
62 DictionaryValue* TabsEventRouter::TabEntry::UpdateLoadState( | |
45 const WebContents* contents) { | 63 const WebContents* contents) { |
46 // The tab may go in & out of loading (for instance if iframes navigate). | 64 // The tab may go in & out of loading (for instance if iframes navigate). |
47 // We only want to respond to the first change from loading to !loading after | 65 // We only want to respond to the first change from loading to !loading after |
48 // the NAV_ENTRY_COMMITTED was fired. | 66 // the NAV_ENTRY_COMMITTED was fired. |
49 if (!complete_waiting_on_load_ || contents->IsLoading()) | 67 if (!complete_waiting_on_load_ || contents->IsLoading()) |
50 return NULL; | 68 return NULL; |
51 | 69 |
52 // Send "complete" state change. | 70 // Send "complete" state change. |
53 complete_waiting_on_load_ = false; | 71 complete_waiting_on_load_ = false; |
54 DictionaryValue* changed_properties = new DictionaryValue(); | 72 DictionaryValue* changed_properties = new DictionaryValue(); |
55 changed_properties->SetString(tab_keys::kStatusKey, | 73 changed_properties->SetString(tabs_constants::kStatusKey, |
56 tab_keys::kStatusValueComplete); | 74 tabs_constants::kStatusValueComplete); |
57 return changed_properties; | 75 return changed_properties; |
58 } | 76 } |
59 | 77 |
60 DictionaryValue* BrowserEventRouter::TabEntry::DidNavigate( | 78 DictionaryValue* TabsEventRouter::TabEntry::DidNavigate( |
61 const WebContents* contents) { | 79 const WebContents* contents) { |
62 // Send "loading" state change. | 80 // Send "loading" state change. |
63 complete_waiting_on_load_ = true; | 81 complete_waiting_on_load_ = true; |
64 DictionaryValue* changed_properties = new DictionaryValue(); | 82 DictionaryValue* changed_properties = new DictionaryValue(); |
65 changed_properties->SetString(tab_keys::kStatusKey, | 83 changed_properties->SetString(tabs_constants::kStatusKey, |
66 tab_keys::kStatusValueLoading); | 84 tabs_constants::kStatusValueLoading); |
67 | 85 |
68 if (contents->GetURL() != url_) { | 86 if (contents->GetURL() != url_) { |
69 url_ = contents->GetURL(); | 87 url_ = contents->GetURL(); |
70 changed_properties->SetString(tab_keys::kUrlKey, url_.spec()); | 88 changed_properties->SetString(tabs_constants::kUrlKey, url_.spec()); |
71 } | 89 } |
72 | 90 |
73 return changed_properties; | 91 return changed_properties; |
74 } | 92 } |
75 | 93 |
76 BrowserEventRouter::BrowserEventRouter(Profile* profile) | 94 TabsEventRouter::TabsEventRouter(Profile* profile) : profile_(profile) { |
77 : profile_(profile) { | |
78 DCHECK(!profile->IsOffTheRecord()); | 95 DCHECK(!profile->IsOffTheRecord()); |
79 | 96 |
80 BrowserList::AddObserver(this); | 97 BrowserList::AddObserver(this); |
81 | 98 |
82 // Init() can happen after the browser is running, so catch up with any | 99 // Init() can happen after the browser is running, so catch up with any |
83 // windows that already exist. | 100 // windows that already exist. |
84 for (chrome::BrowserIterator it; !it.done(); it.Next()) { | 101 for (chrome::BrowserIterator it; !it.done(); it.Next()) { |
85 RegisterForBrowserNotifications(*it); | 102 RegisterForBrowserNotifications(*it); |
86 | 103 |
87 // Also catch up our internal bookkeeping of tab entries. | 104 // Also catch up our internal bookkeeping of tab entries. |
88 Browser* browser = *it; | 105 Browser* browser = *it; |
89 if (browser->tab_strip_model()) { | 106 if (browser->tab_strip_model()) { |
90 for (int i = 0; i < browser->tab_strip_model()->count(); ++i) { | 107 for (int i = 0; i < browser->tab_strip_model()->count(); ++i) { |
91 WebContents* contents = browser->tab_strip_model()->GetWebContentsAt(i); | 108 WebContents* contents = browser->tab_strip_model()->GetWebContentsAt(i); |
92 int tab_id = ExtensionTabUtil::GetTabId(contents); | 109 int tab_id = ExtensionTabUtil::GetTabId(contents); |
93 tab_entries_[tab_id] = TabEntry(); | 110 tab_entries_[tab_id] = TabEntry(); |
94 } | 111 } |
95 } | 112 } |
96 } | 113 } |
97 } | 114 } |
98 | 115 |
99 BrowserEventRouter::~BrowserEventRouter() { | 116 TabsEventRouter::~TabsEventRouter() { |
100 BrowserList::RemoveObserver(this); | 117 BrowserList::RemoveObserver(this); |
101 } | 118 } |
102 | 119 |
103 void BrowserEventRouter::OnBrowserAdded(Browser* browser) { | 120 void TabsEventRouter::OnBrowserAdded(Browser* browser) { |
104 RegisterForBrowserNotifications(browser); | 121 RegisterForBrowserNotifications(browser); |
105 } | 122 } |
106 | 123 |
107 void BrowserEventRouter::RegisterForBrowserNotifications(Browser* browser) { | 124 void TabsEventRouter::RegisterForBrowserNotifications(Browser* browser) { |
108 if (!profile_->IsSameProfile(browser->profile())) | 125 if (!profile_->IsSameProfile(browser->profile())) |
109 return; | 126 return; |
110 // Start listening to TabStripModel events for this browser. | 127 // Start listening to TabStripModel events for this browser. |
111 TabStripModel* tab_strip = browser->tab_strip_model(); | 128 TabStripModel* tab_strip = browser->tab_strip_model(); |
112 tab_strip->AddObserver(this); | 129 tab_strip->AddObserver(this); |
113 | 130 |
114 for (int i = 0; i < tab_strip->count(); ++i) { | 131 for (int i = 0; i < tab_strip->count(); ++i) { |
115 RegisterForTabNotifications(tab_strip->GetWebContentsAt(i)); | 132 RegisterForTabNotifications(tab_strip->GetWebContentsAt(i)); |
116 } | 133 } |
117 } | 134 } |
118 | 135 |
119 void BrowserEventRouter::RegisterForTabNotifications(WebContents* contents) { | 136 void TabsEventRouter::RegisterForTabNotifications(WebContents* contents) { |
120 registrar_.Add( | 137 registrar_.Add( |
121 this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, | 138 this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
122 content::Source<NavigationController>(&contents->GetController())); | 139 content::Source<NavigationController>(&contents->GetController())); |
123 | 140 |
124 // Observing NOTIFICATION_WEB_CONTENTS_DESTROYED is necessary because it's | 141 // Observing NOTIFICATION_WEB_CONTENTS_DESTROYED is necessary because it's |
125 // possible for tabs to be created, detached and then destroyed without | 142 // possible for tabs to be created, detached and then destroyed without |
126 // ever having been re-attached and closed. This happens in the case of | 143 // ever having been re-attached and closed. This happens in the case of |
127 // a devtools WebContents that is opened in window, docked, then closed. | 144 // a devtools WebContents that is opened in window, docked, then closed. |
128 registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, | 145 registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
129 content::Source<WebContents>(contents)); | 146 content::Source<WebContents>(contents)); |
130 | 147 |
131 registrar_.Add(this, chrome::NOTIFICATION_FAVICON_UPDATED, | 148 registrar_.Add(this, chrome::NOTIFICATION_FAVICON_UPDATED, |
132 content::Source<WebContents>(contents)); | 149 content::Source<WebContents>(contents)); |
133 } | 150 } |
134 | 151 |
135 void BrowserEventRouter::UnregisterForTabNotifications(WebContents* contents) { | 152 void TabsEventRouter::UnregisterForTabNotifications(WebContents* contents) { |
136 registrar_.Remove(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, | 153 registrar_.Remove(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
137 content::Source<NavigationController>(&contents->GetController())); | 154 content::Source<NavigationController>(&contents->GetController())); |
138 registrar_.Remove(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, | 155 registrar_.Remove(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
139 content::Source<WebContents>(contents)); | 156 content::Source<WebContents>(contents)); |
140 registrar_.Remove(this, chrome::NOTIFICATION_FAVICON_UPDATED, | 157 registrar_.Remove(this, chrome::NOTIFICATION_FAVICON_UPDATED, |
141 content::Source<WebContents>(contents)); | 158 content::Source<WebContents>(contents)); |
142 } | 159 } |
143 | 160 |
144 void BrowserEventRouter::OnBrowserRemoved(Browser* browser) { | 161 void TabsEventRouter::OnBrowserRemoved(Browser* browser) { |
145 if (!profile_->IsSameProfile(browser->profile())) | 162 if (!profile_->IsSameProfile(browser->profile())) |
146 return; | 163 return; |
147 | 164 |
148 // Stop listening to TabStripModel events for this browser. | 165 // Stop listening to TabStripModel events for this browser. |
149 browser->tab_strip_model()->RemoveObserver(this); | 166 browser->tab_strip_model()->RemoveObserver(this); |
150 } | 167 } |
151 | 168 |
152 void BrowserEventRouter::OnBrowserSetLastActive(Browser* browser) { | 169 void TabsEventRouter::OnBrowserSetLastActive(Browser* browser) { |
153 TabsWindowsAPI* tabs_window_api = TabsWindowsAPI::Get(profile_); | 170 TabsWindowsAPI* tabs_window_api = TabsWindowsAPI::Get(profile_); |
154 if (tabs_window_api) { | 171 if (tabs_window_api) { |
155 tabs_window_api->windows_event_router()->OnActiveWindowChanged( | 172 tabs_window_api->windows_event_router()->OnActiveWindowChanged( |
156 browser ? browser->extension_window_controller() : NULL); | 173 browser ? browser->extension_window_controller() : NULL); |
157 } | 174 } |
158 } | 175 } |
159 | 176 |
160 static void WillDispatchTabCreatedEvent(WebContents* contents, | 177 static void WillDispatchTabCreatedEvent(WebContents* contents, |
161 bool active, | 178 bool active, |
162 Profile* profile, | 179 Profile* profile, |
163 const Extension* extension, | 180 const Extension* extension, |
164 base::ListValue* event_args) { | 181 ListValue* event_args) { |
165 DictionaryValue* tab_value = ExtensionTabUtil::CreateTabValue( | 182 DictionaryValue* tab_value = ExtensionTabUtil::CreateTabValue( |
166 contents, extension); | 183 contents, extension); |
167 event_args->Clear(); | 184 event_args->Clear(); |
168 event_args->Append(tab_value); | 185 event_args->Append(tab_value); |
169 tab_value->SetBoolean(tab_keys::kSelectedKey, active); | 186 tab_value->SetBoolean(tabs_constants::kSelectedKey, active); |
170 } | 187 } |
171 | 188 |
172 void BrowserEventRouter::TabCreatedAt(WebContents* contents, | 189 void TabsEventRouter::TabCreatedAt(WebContents* contents, |
173 int index, | 190 int index, |
174 bool active) { | 191 bool active) { |
175 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); | 192 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); |
176 scoped_ptr<base::ListValue> args(new base::ListValue()); | 193 scoped_ptr<ListValue> args(new ListValue); |
177 scoped_ptr<Event> event(new Event(tabs::OnCreated::kEventName, args.Pass())); | 194 scoped_ptr<Event> event(new Event(tabs::OnCreated::kEventName, args.Pass())); |
178 event->restrict_to_profile = profile; | 195 event->restrict_to_profile = profile; |
179 event->user_gesture = EventRouter::USER_GESTURE_NOT_ENABLED; | 196 event->user_gesture = EventRouter::USER_GESTURE_NOT_ENABLED; |
180 event->will_dispatch_callback = | 197 event->will_dispatch_callback = |
181 base::Bind(&WillDispatchTabCreatedEvent, contents, active); | 198 base::Bind(&WillDispatchTabCreatedEvent, contents, active); |
182 ExtensionSystem::Get(profile)->event_router()->BroadcastEvent(event.Pass()); | 199 ExtensionSystem::Get(profile)->event_router()->BroadcastEvent(event.Pass()); |
183 | 200 |
184 RegisterForTabNotifications(contents); | 201 RegisterForTabNotifications(contents); |
185 } | 202 } |
186 | 203 |
187 void BrowserEventRouter::TabInsertedAt(WebContents* contents, | 204 void TabsEventRouter::TabInsertedAt(WebContents* contents, |
188 int index, | 205 int index, |
189 bool active) { | 206 bool active) { |
190 // If tab is new, send created event. | 207 // If tab is new, send created event. |
191 int tab_id = ExtensionTabUtil::GetTabId(contents); | 208 int tab_id = ExtensionTabUtil::GetTabId(contents); |
192 if (!GetTabEntry(contents)) { | 209 if (!GetTabEntry(contents)) { |
193 tab_entries_[tab_id] = TabEntry(); | 210 tab_entries_[tab_id] = TabEntry(); |
194 | 211 |
195 TabCreatedAt(contents, index, active); | 212 TabCreatedAt(contents, index, active); |
196 return; | 213 return; |
197 } | 214 } |
198 | 215 |
199 scoped_ptr<base::ListValue> args(new base::ListValue()); | 216 scoped_ptr<ListValue> args(new ListValue); |
200 args->Append(new base::FundamentalValue(tab_id)); | 217 args->Append(new base::FundamentalValue(tab_id)); |
201 | 218 |
202 DictionaryValue* object_args = new DictionaryValue(); | 219 DictionaryValue* object_args = new DictionaryValue(); |
203 object_args->Set(tab_keys::kNewWindowIdKey, new base::FundamentalValue( | 220 object_args->Set(tabs_constants::kNewWindowIdKey, |
204 ExtensionTabUtil::GetWindowIdOfTab(contents))); | 221 new base::FundamentalValue( |
205 object_args->Set(tab_keys::kNewPositionKey, new base::FundamentalValue( | 222 ExtensionTabUtil::GetWindowIdOfTab(contents))); |
206 index)); | 223 object_args->Set(tabs_constants::kNewPositionKey, |
224 new base::FundamentalValue(index)); | |
207 args->Append(object_args); | 225 args->Append(object_args); |
208 | 226 |
209 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); | 227 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); |
210 DispatchEvent(profile, tabs::OnAttached::kEventName, args.Pass(), | 228 DispatchEvent(profile, tabs::OnAttached::kEventName, args.Pass(), |
211 EventRouter::USER_GESTURE_UNKNOWN); | 229 EventRouter::USER_GESTURE_UNKNOWN); |
212 } | 230 } |
213 | 231 |
214 void BrowserEventRouter::TabDetachedAt(WebContents* contents, int index) { | 232 void TabsEventRouter::TabDetachedAt(WebContents* contents, int index) { |
215 if (!GetTabEntry(contents)) { | 233 if (!GetTabEntry(contents)) { |
216 // The tab was removed. Don't send detach event. | 234 // The tab was removed. Don't send detach event. |
217 return; | 235 return; |
218 } | 236 } |
219 | 237 |
220 scoped_ptr<base::ListValue> args(new base::ListValue()); | 238 scoped_ptr<ListValue> args(new ListValue); |
221 args->Append( | 239 args->Append( |
222 new base::FundamentalValue(ExtensionTabUtil::GetTabId(contents))); | 240 new base::FundamentalValue(ExtensionTabUtil::GetTabId(contents))); |
223 | 241 |
224 DictionaryValue* object_args = new DictionaryValue(); | 242 DictionaryValue* object_args = new DictionaryValue(); |
225 object_args->Set(tab_keys::kOldWindowIdKey, new base::FundamentalValue( | 243 object_args->Set(tabs_constants::kOldWindowIdKey, |
226 ExtensionTabUtil::GetWindowIdOfTab(contents))); | 244 new base::FundamentalValue( |
227 object_args->Set(tab_keys::kOldPositionKey, new base::FundamentalValue( | 245 ExtensionTabUtil::GetWindowIdOfTab(contents))); |
228 index)); | 246 object_args->Set(tabs_constants::kOldPositionKey, |
247 new base::FundamentalValue(index)); | |
229 args->Append(object_args); | 248 args->Append(object_args); |
230 | 249 |
231 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); | 250 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); |
232 DispatchEvent(profile, tabs::OnDetached::kEventName, args.Pass(), | 251 DispatchEvent(profile, |
252 tabs::OnDetached::kEventName, | |
253 args.Pass(), | |
233 EventRouter::USER_GESTURE_UNKNOWN); | 254 EventRouter::USER_GESTURE_UNKNOWN); |
234 } | 255 } |
235 | 256 |
236 void BrowserEventRouter::TabClosingAt(TabStripModel* tab_strip_model, | 257 void TabsEventRouter::TabClosingAt(TabStripModel* tab_strip_model, |
237 WebContents* contents, | 258 WebContents* contents, |
238 int index) { | 259 int index) { |
239 int tab_id = ExtensionTabUtil::GetTabId(contents); | 260 int tab_id = ExtensionTabUtil::GetTabId(contents); |
240 | 261 |
241 scoped_ptr<base::ListValue> args(new base::ListValue()); | 262 scoped_ptr<ListValue> args(new ListValue); |
242 args->Append(new base::FundamentalValue(tab_id)); | 263 args->Append(new base::FundamentalValue(tab_id)); |
243 | 264 |
244 DictionaryValue* object_args = new DictionaryValue(); | 265 DictionaryValue* object_args = new DictionaryValue(); |
245 object_args->SetInteger(tab_keys::kWindowIdKey, | 266 object_args->SetInteger(tabs_constants::kWindowIdKey, |
246 ExtensionTabUtil::GetWindowIdOfTab(contents)); | 267 ExtensionTabUtil::GetWindowIdOfTab(contents)); |
247 object_args->SetBoolean(tab_keys::kWindowClosing, | 268 object_args->SetBoolean(tabs_constants::kWindowClosing, |
248 tab_strip_model->closing_all()); | 269 tab_strip_model->closing_all()); |
249 args->Append(object_args); | 270 args->Append(object_args); |
250 | 271 |
251 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); | 272 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); |
252 DispatchEvent(profile, tabs::OnRemoved::kEventName, args.Pass(), | 273 DispatchEvent(profile, |
274 tabs::OnRemoved::kEventName, | |
275 args.Pass(), | |
253 EventRouter::USER_GESTURE_UNKNOWN); | 276 EventRouter::USER_GESTURE_UNKNOWN); |
254 | 277 |
255 int removed_count = tab_entries_.erase(tab_id); | 278 int removed_count = tab_entries_.erase(tab_id); |
256 DCHECK_GT(removed_count, 0); | 279 DCHECK_GT(removed_count, 0); |
257 | 280 |
258 UnregisterForTabNotifications(contents); | 281 UnregisterForTabNotifications(contents); |
259 } | 282 } |
260 | 283 |
261 void BrowserEventRouter::ActiveTabChanged(WebContents* old_contents, | 284 void TabsEventRouter::ActiveTabChanged(WebContents* old_contents, |
262 WebContents* new_contents, | 285 WebContents* new_contents, |
263 int index, | 286 int index, |
264 int reason) { | 287 int reason) { |
265 scoped_ptr<base::ListValue> args(new base::ListValue()); | 288 scoped_ptr<ListValue> args(new ListValue); |
266 int tab_id = ExtensionTabUtil::GetTabId(new_contents); | 289 int tab_id = ExtensionTabUtil::GetTabId(new_contents); |
267 args->Append(new base::FundamentalValue(tab_id)); | 290 args->Append(new base::FundamentalValue(tab_id)); |
268 | 291 |
269 DictionaryValue* object_args = new DictionaryValue(); | 292 DictionaryValue* object_args = new DictionaryValue(); |
270 object_args->Set(tab_keys::kWindowIdKey, new base::FundamentalValue( | 293 object_args->Set(tabs_constants::kWindowIdKey, |
271 ExtensionTabUtil::GetWindowIdOfTab(new_contents))); | 294 new base::FundamentalValue( |
295 ExtensionTabUtil::GetWindowIdOfTab(new_contents))); | |
272 args->Append(object_args); | 296 args->Append(object_args); |
273 | 297 |
274 // The onActivated event replaced onActiveChanged and onSelectionChanged. The | 298 // The onActivated event replaced onActiveChanged and onSelectionChanged. The |
275 // deprecated events take two arguments: tabId, {windowId}. | 299 // deprecated events take two arguments: tabId, {windowId}. |
276 Profile* profile = | 300 Profile* profile = |
277 Profile::FromBrowserContext(new_contents->GetBrowserContext()); | 301 Profile::FromBrowserContext(new_contents->GetBrowserContext()); |
278 EventRouter::UserGestureState gesture = | 302 EventRouter::UserGestureState gesture = |
279 reason & CHANGE_REASON_USER_GESTURE | 303 reason & CHANGE_REASON_USER_GESTURE |
280 ? EventRouter::USER_GESTURE_ENABLED | 304 ? EventRouter::USER_GESTURE_ENABLED |
281 : EventRouter::USER_GESTURE_NOT_ENABLED; | 305 : EventRouter::USER_GESTURE_NOT_ENABLED; |
282 DispatchEvent(profile, tabs::OnSelectionChanged::kEventName, | 306 DispatchEvent(profile, |
283 scoped_ptr<base::ListValue>(args->DeepCopy()), gesture); | 307 tabs::OnSelectionChanged::kEventName, |
284 DispatchEvent(profile, tabs::OnActiveChanged::kEventName, | 308 scoped_ptr<ListValue>(args->DeepCopy()), |
285 scoped_ptr<base::ListValue>(args->DeepCopy()), gesture); | 309 gesture); |
310 DispatchEvent(profile, | |
311 tabs::OnActiveChanged::kEventName, | |
312 scoped_ptr<ListValue>(args->DeepCopy()), | |
313 gesture); | |
286 | 314 |
287 // The onActivated event takes one argument: {windowId, tabId}. | 315 // The onActivated event takes one argument: {windowId, tabId}. |
288 args->Remove(0, NULL); | 316 args->Remove(0, NULL); |
289 object_args->Set(tab_keys::kTabIdKey, new base::FundamentalValue(tab_id)); | 317 object_args->Set(tabs_constants::kTabIdKey, |
318 new base::FundamentalValue(tab_id)); | |
290 DispatchEvent(profile, tabs::OnActivated::kEventName, args.Pass(), gesture); | 319 DispatchEvent(profile, tabs::OnActivated::kEventName, args.Pass(), gesture); |
291 } | 320 } |
292 | 321 |
293 void BrowserEventRouter::TabSelectionChanged( | 322 void TabsEventRouter::TabSelectionChanged( |
294 TabStripModel* tab_strip_model, | 323 TabStripModel* tab_strip_model, |
295 const ui::ListSelectionModel& old_model) { | 324 const ui::ListSelectionModel& old_model) { |
296 ui::ListSelectionModel::SelectedIndices new_selection = | 325 ui::ListSelectionModel::SelectedIndices new_selection = |
297 tab_strip_model->selection_model().selected_indices(); | 326 tab_strip_model->selection_model().selected_indices(); |
298 base::ListValue* all = new base::ListValue(); | 327 scoped_ptr<ListValue> all_tabs(new ListValue); |
299 | 328 |
300 for (size_t i = 0; i < new_selection.size(); ++i) { | 329 for (size_t i = 0; i < new_selection.size(); ++i) { |
301 int index = new_selection[i]; | 330 int index = new_selection[i]; |
302 WebContents* contents = tab_strip_model->GetWebContentsAt(index); | 331 WebContents* contents = tab_strip_model->GetWebContentsAt(index); |
303 if (!contents) | 332 if (!contents) |
304 break; | 333 break; |
305 int tab_id = ExtensionTabUtil::GetTabId(contents); | 334 int tab_id = ExtensionTabUtil::GetTabId(contents); |
306 all->Append(new base::FundamentalValue(tab_id)); | 335 all_tabs->Append(new base::FundamentalValue(tab_id)); |
307 } | 336 } |
308 | 337 |
309 scoped_ptr<base::ListValue> args(new base::ListValue()); | 338 scoped_ptr<ListValue> args(new ListValue); |
310 DictionaryValue* select_info = new DictionaryValue(); | 339 scoped_ptr<DictionaryValue> select_info(new DictionaryValue); |
311 | 340 |
312 select_info->Set(tab_keys::kWindowIdKey, new base::FundamentalValue( | 341 select_info->Set( |
313 ExtensionTabUtil::GetWindowIdOfTabStripModel(tab_strip_model))); | 342 tabs_constants::kWindowIdKey, |
343 new base::FundamentalValue( | |
344 ExtensionTabUtil::GetWindowIdOfTabStripModel(tab_strip_model))); | |
314 | 345 |
315 select_info->Set(tab_keys::kTabIdsKey, all); | 346 select_info->Set(tabs_constants::kTabIdsKey, all_tabs.release()); |
316 args->Append(select_info); | 347 args->Append(select_info.release()); |
317 | 348 |
318 // The onHighlighted event replaced onHighlightChanged. | 349 // The onHighlighted event replaced onHighlightChanged. |
319 Profile* profile = tab_strip_model->profile(); | 350 Profile* profile = tab_strip_model->profile(); |
320 DispatchEvent(profile, tabs::OnHighlightChanged::kEventName, | 351 DispatchEvent(profile, |
321 scoped_ptr<base::ListValue>(args->DeepCopy()), | 352 tabs::OnHighlightChanged::kEventName, |
353 scoped_ptr<ListValue>(args->DeepCopy()), | |
322 EventRouter::USER_GESTURE_UNKNOWN); | 354 EventRouter::USER_GESTURE_UNKNOWN); |
323 DispatchEvent(profile, tabs::OnHighlighted::kEventName, args.Pass(), | 355 DispatchEvent(profile, |
356 tabs::OnHighlighted::kEventName, | |
357 args.Pass(), | |
324 EventRouter::USER_GESTURE_UNKNOWN); | 358 EventRouter::USER_GESTURE_UNKNOWN); |
325 } | 359 } |
326 | 360 |
327 void BrowserEventRouter::TabMoved(WebContents* contents, | 361 void TabsEventRouter::TabMoved(WebContents* contents, |
328 int from_index, | 362 int from_index, |
329 int to_index) { | 363 int to_index) { |
330 scoped_ptr<base::ListValue> args(new base::ListValue()); | 364 scoped_ptr<ListValue> args(new ListValue); |
331 args->Append( | 365 args->Append( |
332 new base::FundamentalValue(ExtensionTabUtil::GetTabId(contents))); | 366 new base::FundamentalValue(ExtensionTabUtil::GetTabId(contents))); |
333 | 367 |
334 DictionaryValue* object_args = new DictionaryValue(); | 368 DictionaryValue* object_args = new DictionaryValue(); |
335 object_args->Set(tab_keys::kWindowIdKey, new base::FundamentalValue( | 369 object_args->Set(tabs_constants::kWindowIdKey, |
336 ExtensionTabUtil::GetWindowIdOfTab(contents))); | 370 new base::FundamentalValue( |
337 object_args->Set(tab_keys::kFromIndexKey, new base::FundamentalValue( | 371 ExtensionTabUtil::GetWindowIdOfTab(contents))); |
338 from_index)); | 372 object_args->Set(tabs_constants::kFromIndexKey, |
339 object_args->Set(tab_keys::kToIndexKey, new base::FundamentalValue( | 373 new base::FundamentalValue(from_index)); |
340 to_index)); | 374 object_args->Set(tabs_constants::kToIndexKey, |
375 new base::FundamentalValue(to_index)); | |
341 args->Append(object_args); | 376 args->Append(object_args); |
342 | 377 |
343 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); | 378 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); |
344 DispatchEvent(profile, tabs::OnMoved::kEventName, args.Pass(), | 379 DispatchEvent(profile, |
380 tabs::OnMoved::kEventName, | |
381 args.Pass(), | |
345 EventRouter::USER_GESTURE_UNKNOWN); | 382 EventRouter::USER_GESTURE_UNKNOWN); |
346 } | 383 } |
347 | 384 |
348 void BrowserEventRouter::TabUpdated(WebContents* contents, bool did_navigate) { | 385 void TabsEventRouter::TabUpdated(WebContents* contents, bool did_navigate) { |
349 TabEntry* entry = GetTabEntry(contents); | 386 TabEntry* entry = GetTabEntry(contents); |
350 scoped_ptr<DictionaryValue> changed_properties; | 387 scoped_ptr<DictionaryValue> changed_properties; |
351 | 388 |
352 DCHECK(entry); | 389 CHECK(entry); |
353 | 390 |
354 if (did_navigate) | 391 if (did_navigate) |
355 changed_properties.reset(entry->DidNavigate(contents)); | 392 changed_properties.reset(entry->DidNavigate(contents)); |
356 else | 393 else |
357 changed_properties.reset(entry->UpdateLoadState(contents)); | 394 changed_properties.reset(entry->UpdateLoadState(contents)); |
358 | 395 |
359 if (changed_properties) | 396 if (changed_properties) |
360 DispatchTabUpdatedEvent(contents, changed_properties.Pass()); | 397 DispatchTabUpdatedEvent(contents, changed_properties.Pass()); |
361 } | 398 } |
362 | 399 |
363 void BrowserEventRouter::FaviconUrlUpdated(WebContents* contents, | 400 void TabsEventRouter::FaviconUrlUpdated(WebContents* contents) { |
364 const bool* icon_url_changed) { | |
365 if (!icon_url_changed || !*icon_url_changed) | |
366 return; | |
367 content::NavigationEntry* entry = | 401 content::NavigationEntry* entry = |
368 contents->GetController().GetVisibleEntry(); | 402 contents->GetController().GetVisibleEntry(); |
369 if (!entry || !entry->GetFavicon().valid) | 403 if (!entry || !entry->GetFavicon().valid) |
370 return; | 404 return; |
371 scoped_ptr<DictionaryValue> changed_properties(new DictionaryValue()); | 405 scoped_ptr<DictionaryValue> changed_properties(new DictionaryValue); |
372 changed_properties->SetString( | 406 changed_properties->SetString( |
373 tab_keys::kFaviconUrlKey, | 407 tabs_constants::kFaviconUrlKey, |
374 entry->GetFavicon().url.possibly_invalid_spec()); | 408 entry->GetFavicon().url.possibly_invalid_spec()); |
375 DispatchTabUpdatedEvent(contents, changed_properties.Pass()); | 409 DispatchTabUpdatedEvent(contents, changed_properties.Pass()); |
376 } | 410 } |
377 | 411 |
378 void BrowserEventRouter::DispatchEvent( | 412 void TabsEventRouter::DispatchEvent( |
379 Profile* profile, | 413 Profile* profile, |
380 const char* event_name, | 414 const char* event_name, |
381 scoped_ptr<base::ListValue> args, | 415 scoped_ptr<ListValue> args, |
382 EventRouter::UserGestureState user_gesture) { | 416 EventRouter::UserGestureState user_gesture) { |
383 if (!profile_->IsSameProfile(profile) || | 417 if (!profile_->IsSameProfile(profile) || |
384 !extensions::ExtensionSystem::Get(profile)->event_router()) | 418 !ExtensionSystem::Get(profile)->event_router()) |
385 return; | 419 return; |
386 | 420 |
387 scoped_ptr<Event> event(new Event(event_name, args.Pass())); | 421 scoped_ptr<Event> event(new Event(event_name, args.Pass())); |
388 event->restrict_to_profile = profile; | 422 event->restrict_to_profile = profile; |
389 event->user_gesture = user_gesture; | 423 event->user_gesture = user_gesture; |
390 ExtensionSystem::Get(profile)->event_router()->BroadcastEvent(event.Pass()); | 424 ExtensionSystem::Get(profile)->event_router()->BroadcastEvent(event.Pass()); |
391 } | 425 } |
392 | 426 |
393 void BrowserEventRouter::DispatchSimpleBrowserEvent( | 427 void TabsEventRouter::DispatchSimpleBrowserEvent( |
394 Profile* profile, const int window_id, const char* event_name) { | 428 Profile* profile, const int window_id, const char* event_name) { |
395 if (!profile_->IsSameProfile(profile)) | 429 if (!profile_->IsSameProfile(profile)) |
396 return; | 430 return; |
397 | 431 |
398 scoped_ptr<base::ListValue> args(new base::ListValue()); | 432 scoped_ptr<ListValue> args(new ListValue); |
399 args->Append(new base::FundamentalValue(window_id)); | 433 args->Append(new base::FundamentalValue(window_id)); |
400 | 434 |
401 DispatchEvent(profile, event_name, args.Pass(), | 435 DispatchEvent(profile, |
436 event_name, | |
437 args.Pass(), | |
402 EventRouter::USER_GESTURE_UNKNOWN); | 438 EventRouter::USER_GESTURE_UNKNOWN); |
403 } | 439 } |
404 | 440 |
405 static void WillDispatchTabUpdatedEvent( | 441 void TabsEventRouter::DispatchTabUpdatedEvent( |
406 WebContents* contents, | |
407 const DictionaryValue* changed_properties, | |
408 Profile* profile, | |
409 const Extension* extension, | |
410 base::ListValue* event_args) { | |
411 // Overwrite the second argument with the appropriate properties dictionary, | |
412 // depending on extension permissions. | |
413 DictionaryValue* properties_value = changed_properties->DeepCopy(); | |
414 ExtensionTabUtil::ScrubTabValueForExtension(contents, extension, | |
415 properties_value); | |
416 event_args->Set(1, properties_value); | |
417 | |
418 // Overwrite the third arg with our tab value as seen by this extension. | |
419 DictionaryValue* tab_value = ExtensionTabUtil::CreateTabValue( | |
420 contents, extension); | |
421 event_args->Set(2, tab_value); | |
422 } | |
423 | |
424 void BrowserEventRouter::DispatchTabUpdatedEvent( | |
425 WebContents* contents, scoped_ptr<DictionaryValue> changed_properties) { | 442 WebContents* contents, scoped_ptr<DictionaryValue> changed_properties) { |
426 DCHECK(changed_properties); | 443 DCHECK(changed_properties); |
427 DCHECK(contents); | 444 DCHECK(contents); |
428 | 445 |
429 // The state of the tab (as seen from the extension point of view) has | 446 // The state of the tab (as seen from the extension point of view) has |
430 // changed. Send a notification to the extension. | 447 // changed. Send a notification to the extension. |
431 scoped_ptr<base::ListValue> args_base(new base::ListValue()); | 448 scoped_ptr<ListValue> args_base(new ListValue); |
432 | 449 |
433 // First arg: The id of the tab that changed. | 450 // First arg: The id of the tab that changed. |
434 args_base->AppendInteger(ExtensionTabUtil::GetTabId(contents)); | 451 args_base->AppendInteger(ExtensionTabUtil::GetTabId(contents)); |
435 | 452 |
436 // Second arg: An object containing the changes to the tab state. Filled in | 453 // Second arg: An object containing the changes to the tab state. Filled in |
437 // by WillDispatchTabUpdatedEvent as a copy of changed_properties, if the | 454 // by WillDispatchTabUpdatedEvent as a copy of changed_properties, if the |
438 // extension has the tabs permission. | 455 // extension has the tabs permission. |
439 | 456 |
440 // Third arg: An object containing the state of the tab. Filled in by | 457 // Third arg: An object containing the state of the tab. Filled in by |
441 // WillDispatchTabUpdatedEvent. | 458 // WillDispatchTabUpdatedEvent. |
442 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); | 459 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); |
443 | 460 |
444 scoped_ptr<Event> event(new Event(tabs::OnUpdated::kEventName, | 461 scoped_ptr<Event> event( |
445 args_base.Pass())); | 462 new Event(tabs::OnUpdated::kEventName, args_base.Pass())); |
446 event->restrict_to_profile = profile; | 463 event->restrict_to_profile = profile; |
447 event->user_gesture = EventRouter::USER_GESTURE_NOT_ENABLED; | 464 event->user_gesture = EventRouter::USER_GESTURE_NOT_ENABLED; |
448 event->will_dispatch_callback = | 465 event->will_dispatch_callback = |
449 base::Bind(&WillDispatchTabUpdatedEvent, | 466 base::Bind(&WillDispatchTabUpdatedEvent, |
450 contents, changed_properties.get()); | 467 contents, |
468 changed_properties.get()); | |
451 ExtensionSystem::Get(profile)->event_router()->BroadcastEvent(event.Pass()); | 469 ExtensionSystem::Get(profile)->event_router()->BroadcastEvent(event.Pass()); |
452 } | 470 } |
453 | 471 |
454 BrowserEventRouter::TabEntry* BrowserEventRouter::GetTabEntry( | 472 TabsEventRouter::TabEntry* TabsEventRouter::GetTabEntry( |
455 const WebContents* contents) { | 473 const WebContents* contents) { |
456 int tab_id = ExtensionTabUtil::GetTabId(contents); | 474 int tab_id = ExtensionTabUtil::GetTabId(contents); |
457 std::map<int, TabEntry>::iterator i = tab_entries_.find(tab_id); | 475 std::map<int, TabEntry>::iterator i = tab_entries_.find(tab_id); |
458 if (tab_entries_.end() == i) | 476 if (tab_entries_.end() == i) |
459 return NULL; | 477 return NULL; |
460 return &i->second; | 478 return &i->second; |
461 } | 479 } |
462 | 480 |
463 void BrowserEventRouter::Observe(int type, | 481 void TabsEventRouter::Observe(int type, |
464 const content::NotificationSource& source, | 482 const content::NotificationSource& source, |
465 const content::NotificationDetails& details) { | 483 const content::NotificationDetails& details) { |
466 if (type == content::NOTIFICATION_NAV_ENTRY_COMMITTED) { | 484 if (type == content::NOTIFICATION_NAV_ENTRY_COMMITTED) { |
467 NavigationController* source_controller = | 485 NavigationController* source_controller = |
468 content::Source<NavigationController>(source).ptr(); | 486 content::Source<NavigationController>(source).ptr(); |
469 TabUpdated(source_controller->GetWebContents(), true); | 487 TabUpdated(source_controller->GetWebContents(), true); |
470 } else if (type == content::NOTIFICATION_WEB_CONTENTS_DESTROYED) { | 488 } else if (type == content::NOTIFICATION_WEB_CONTENTS_DESTROYED) { |
471 // Tab was destroyed after being detached (without being re-attached). | 489 // Tab was destroyed after being detached (without being re-attached). |
472 WebContents* contents = content::Source<WebContents>(source).ptr(); | 490 WebContents* contents = content::Source<WebContents>(source).ptr(); |
473 registrar_.Remove(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, | 491 registrar_.Remove(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
474 content::Source<NavigationController>(&contents->GetController())); | 492 content::Source<NavigationController>(&contents->GetController())); |
475 registrar_.Remove(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, | 493 registrar_.Remove(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
476 content::Source<WebContents>(contents)); | 494 content::Source<WebContents>(contents)); |
477 registrar_.Remove(this, chrome::NOTIFICATION_FAVICON_UPDATED, | 495 registrar_.Remove(this, chrome::NOTIFICATION_FAVICON_UPDATED, |
478 content::Source<WebContents>(contents)); | 496 content::Source<WebContents>(contents)); |
479 } else if (type == chrome::NOTIFICATION_FAVICON_UPDATED) { | 497 } else if (type == chrome::NOTIFICATION_FAVICON_UPDATED) { |
480 WebContents* contents = content::Source<WebContents>(source).ptr(); | 498 bool icon_url_changed = *content::Details<bool>(details).ptr(); |
481 const bool* icon_url_changed = content::Details<bool>(details).ptr(); | 499 if (icon_url_changed) |
482 FaviconUrlUpdated(contents, icon_url_changed); | 500 FaviconUrlUpdated(content::Source<WebContents>(source).ptr()); |
483 } else { | 501 } else { |
484 NOTREACHED(); | 502 NOTREACHED(); |
485 } | 503 } |
486 } | 504 } |
487 | 505 |
488 void BrowserEventRouter::TabChangedAt(WebContents* contents, | 506 void TabsEventRouter::TabChangedAt(WebContents* contents, |
489 int index, | 507 int index, |
490 TabChangeType change_type) { | 508 TabChangeType change_type) { |
491 TabUpdated(contents, false); | 509 TabUpdated(contents, false); |
492 } | 510 } |
493 | 511 |
494 void BrowserEventRouter::TabReplacedAt(TabStripModel* tab_strip_model, | 512 void TabsEventRouter::TabReplacedAt(TabStripModel* tab_strip_model, |
495 WebContents* old_contents, | 513 WebContents* old_contents, |
496 WebContents* new_contents, | 514 WebContents* new_contents, |
497 int index) { | 515 int index) { |
498 // Notify listeners that the next tabs closing or being added are due to | 516 // Notify listeners that the next tabs closing or being added are due to |
499 // WebContents being swapped. | 517 // WebContents being swapped. |
500 const int new_tab_id = ExtensionTabUtil::GetTabId(new_contents); | 518 const int new_tab_id = ExtensionTabUtil::GetTabId(new_contents); |
501 const int old_tab_id = ExtensionTabUtil::GetTabId(old_contents); | 519 const int old_tab_id = ExtensionTabUtil::GetTabId(old_contents); |
502 scoped_ptr<base::ListValue> args(new base::ListValue()); | 520 scoped_ptr<ListValue> args(new ListValue); |
503 args->Append(new base::FundamentalValue(new_tab_id)); | 521 args->Append(new base::FundamentalValue(new_tab_id)); |
504 args->Append(new base::FundamentalValue(old_tab_id)); | 522 args->Append(new base::FundamentalValue(old_tab_id)); |
505 | 523 |
506 DispatchEvent(Profile::FromBrowserContext(new_contents->GetBrowserContext()), | 524 DispatchEvent(Profile::FromBrowserContext(new_contents->GetBrowserContext()), |
507 tabs::OnReplaced::kEventName, | 525 tabs::OnReplaced::kEventName, |
508 args.Pass(), | 526 args.Pass(), |
509 EventRouter::USER_GESTURE_UNKNOWN); | 527 EventRouter::USER_GESTURE_UNKNOWN); |
510 | 528 |
511 // Update tab_entries_. | 529 // Update tab_entries_. |
512 const int removed_count = tab_entries_.erase(old_tab_id); | 530 const int removed_count = tab_entries_.erase(old_tab_id); |
513 DCHECK_GT(removed_count, 0); | 531 DCHECK_GT(removed_count, 0); |
514 UnregisterForTabNotifications(old_contents); | 532 UnregisterForTabNotifications(old_contents); |
515 | 533 |
516 if (!GetTabEntry(new_contents)) { | 534 if (!GetTabEntry(new_contents)) { |
517 tab_entries_[new_tab_id] = TabEntry(); | 535 tab_entries_[new_tab_id] = TabEntry(); |
518 RegisterForTabNotifications(new_contents); | 536 RegisterForTabNotifications(new_contents); |
519 } | 537 } |
520 } | 538 } |
521 | 539 |
522 void BrowserEventRouter::TabPinnedStateChanged(WebContents* contents, | 540 void TabsEventRouter::TabPinnedStateChanged(WebContents* contents, int index) { |
523 int index) { | |
524 TabStripModel* tab_strip = NULL; | 541 TabStripModel* tab_strip = NULL; |
525 int tab_index; | 542 int tab_index; |
526 | 543 |
527 if (ExtensionTabUtil::GetTabStripModel(contents, &tab_strip, &tab_index)) { | 544 if (ExtensionTabUtil::GetTabStripModel(contents, &tab_strip, &tab_index)) { |
528 scoped_ptr<DictionaryValue> changed_properties(new DictionaryValue()); | 545 scoped_ptr<DictionaryValue> changed_properties(new DictionaryValue()); |
529 changed_properties->SetBoolean(tab_keys::kPinnedKey, | 546 changed_properties->SetBoolean(tabs_constants::kPinnedKey, |
530 tab_strip->IsTabPinned(tab_index)); | 547 tab_strip->IsTabPinned(tab_index)); |
531 DispatchTabUpdatedEvent(contents, changed_properties.Pass()); | 548 DispatchTabUpdatedEvent(contents, changed_properties.Pass()); |
532 } | 549 } |
533 } | 550 } |
534 | 551 |
535 void BrowserEventRouter::TabStripEmpty() {} | |
536 | |
537 } // namespace extensions | 552 } // namespace extensions |
OLD | NEW |