| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/api/tabs/tabs_event_router.h" | 5 #include "chrome/browser/extensions/api/tabs/tabs_event_router.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 |
| 8 #include <utility> | 9 #include <utility> |
| 9 | 10 |
| 11 #include "base/memory/ptr_util.h" |
| 10 #include "base/values.h" | 12 #include "base/values.h" |
| 11 #include "chrome/browser/extensions/api/tabs/tabs_constants.h" | 13 #include "chrome/browser/extensions/api/tabs/tabs_constants.h" |
| 12 #include "chrome/browser/extensions/api/tabs/tabs_windows_api.h" | 14 #include "chrome/browser/extensions/api/tabs/tabs_windows_api.h" |
| 13 #include "chrome/browser/extensions/api/tabs/windows_event_router.h" | 15 #include "chrome/browser/extensions/api/tabs/windows_event_router.h" |
| 14 #include "chrome/browser/extensions/extension_tab_util.h" | 16 #include "chrome/browser/extensions/extension_tab_util.h" |
| 15 #include "chrome/browser/profiles/profile.h" | 17 #include "chrome/browser/profiles/profile.h" |
| 16 #include "chrome/browser/ui/browser.h" | 18 #include "chrome/browser/ui/browser.h" |
| 17 #include "chrome/browser/ui/browser_list.h" | 19 #include "chrome/browser/ui/browser_list.h" |
| 18 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 20 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 19 #include "chrome/common/extensions/extension_constants.h" | 21 #include "chrome/common/extensions/extension_constants.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 34 | 36 |
| 35 namespace tabs = api::tabs; | 37 namespace tabs = api::tabs; |
| 36 | 38 |
| 37 bool WillDispatchTabUpdatedEvent( | 39 bool WillDispatchTabUpdatedEvent( |
| 38 WebContents* contents, | 40 WebContents* contents, |
| 39 const std::set<std::string> changed_property_names, | 41 const std::set<std::string> changed_property_names, |
| 40 content::BrowserContext* context, | 42 content::BrowserContext* context, |
| 41 const Extension* extension, | 43 const Extension* extension, |
| 42 Event* event, | 44 Event* event, |
| 43 const base::DictionaryValue* listener_filter) { | 45 const base::DictionaryValue* listener_filter) { |
| 44 scoped_ptr<api::tabs::Tab> tab_object = | 46 std::unique_ptr<api::tabs::Tab> tab_object = |
| 45 ExtensionTabUtil::CreateTabObject(contents, extension); | 47 ExtensionTabUtil::CreateTabObject(contents, extension); |
| 46 | 48 |
| 47 base::DictionaryValue* tab_value = tab_object->ToValue().release(); | 49 base::DictionaryValue* tab_value = tab_object->ToValue().release(); |
| 48 | 50 |
| 49 scoped_ptr<base::DictionaryValue> changed_properties( | 51 std::unique_ptr<base::DictionaryValue> changed_properties( |
| 50 new base::DictionaryValue); | 52 new base::DictionaryValue); |
| 51 const base::Value* value = nullptr; | 53 const base::Value* value = nullptr; |
| 52 for (const auto& property : changed_property_names) { | 54 for (const auto& property : changed_property_names) { |
| 53 if (tab_value->Get(property, &value)) | 55 if (tab_value->Get(property, &value)) |
| 54 changed_properties->Set(property, make_scoped_ptr(value->DeepCopy())); | 56 changed_properties->Set(property, base::WrapUnique(value->DeepCopy())); |
| 55 } | 57 } |
| 56 | 58 |
| 57 event->event_args->Set(1, changed_properties.release()); | 59 event->event_args->Set(1, changed_properties.release()); |
| 58 event->event_args->Set(2, tab_value); | 60 event->event_args->Set(2, tab_value); |
| 59 return true; | 61 return true; |
| 60 } | 62 } |
| 61 | 63 |
| 62 } // namespace | 64 } // namespace |
| 63 | 65 |
| 64 TabsEventRouter::TabEntry::TabEntry(TabsEventRouter* router, | 66 TabsEventRouter::TabEntry::TabEntry(TabsEventRouter* router, |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 } | 150 } |
| 149 | 151 |
| 150 void TabsEventRouter::RegisterForTabNotifications(WebContents* contents) { | 152 void TabsEventRouter::RegisterForTabNotifications(WebContents* contents) { |
| 151 favicon_scoped_observer_.Add( | 153 favicon_scoped_observer_.Add( |
| 152 favicon::ContentFaviconDriver::FromWebContents(contents)); | 154 favicon::ContentFaviconDriver::FromWebContents(contents)); |
| 153 | 155 |
| 154 ZoomController::FromWebContents(contents)->AddObserver(this); | 156 ZoomController::FromWebContents(contents)->AddObserver(this); |
| 155 | 157 |
| 156 int tab_id = ExtensionTabUtil::GetTabId(contents); | 158 int tab_id = ExtensionTabUtil::GetTabId(contents); |
| 157 DCHECK(tab_entries_.find(tab_id) == tab_entries_.end()); | 159 DCHECK(tab_entries_.find(tab_id) == tab_entries_.end()); |
| 158 tab_entries_[tab_id] = make_scoped_ptr(new TabEntry(this, contents)); | 160 tab_entries_[tab_id] = base::WrapUnique(new TabEntry(this, contents)); |
| 159 } | 161 } |
| 160 | 162 |
| 161 void TabsEventRouter::UnregisterForTabNotifications(WebContents* contents) { | 163 void TabsEventRouter::UnregisterForTabNotifications(WebContents* contents) { |
| 162 favicon_scoped_observer_.Remove( | 164 favicon_scoped_observer_.Remove( |
| 163 favicon::ContentFaviconDriver::FromWebContents(contents)); | 165 favicon::ContentFaviconDriver::FromWebContents(contents)); |
| 164 | 166 |
| 165 ZoomController::FromWebContents(contents)->RemoveObserver(this); | 167 ZoomController::FromWebContents(contents)->RemoveObserver(this); |
| 166 | 168 |
| 167 int tab_id = ExtensionTabUtil::GetTabId(contents); | 169 int tab_id = ExtensionTabUtil::GetTabId(contents); |
| 168 int removed_count = tab_entries_.erase(tab_id); | 170 int removed_count = tab_entries_.erase(tab_id); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 192 event->event_args->Append(tab_value); | 194 event->event_args->Append(tab_value); |
| 193 tab_value->SetBoolean(tabs_constants::kSelectedKey, active); | 195 tab_value->SetBoolean(tabs_constants::kSelectedKey, active); |
| 194 tab_value->SetBoolean(tabs_constants::kActiveKey, active); | 196 tab_value->SetBoolean(tabs_constants::kActiveKey, active); |
| 195 return true; | 197 return true; |
| 196 } | 198 } |
| 197 | 199 |
| 198 void TabsEventRouter::TabCreatedAt(WebContents* contents, | 200 void TabsEventRouter::TabCreatedAt(WebContents* contents, |
| 199 int index, | 201 int index, |
| 200 bool active) { | 202 bool active) { |
| 201 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); | 203 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); |
| 202 scoped_ptr<base::ListValue> args(new base::ListValue); | 204 std::unique_ptr<base::ListValue> args(new base::ListValue); |
| 203 scoped_ptr<Event> event(new Event( | 205 std::unique_ptr<Event> event(new Event( |
| 204 events::TABS_ON_CREATED, tabs::OnCreated::kEventName, std::move(args))); | 206 events::TABS_ON_CREATED, tabs::OnCreated::kEventName, std::move(args))); |
| 205 event->restrict_to_browser_context = profile; | 207 event->restrict_to_browser_context = profile; |
| 206 event->user_gesture = EventRouter::USER_GESTURE_NOT_ENABLED; | 208 event->user_gesture = EventRouter::USER_GESTURE_NOT_ENABLED; |
| 207 event->will_dispatch_callback = | 209 event->will_dispatch_callback = |
| 208 base::Bind(&WillDispatchTabCreatedEvent, contents, active); | 210 base::Bind(&WillDispatchTabCreatedEvent, contents, active); |
| 209 EventRouter::Get(profile)->BroadcastEvent(std::move(event)); | 211 EventRouter::Get(profile)->BroadcastEvent(std::move(event)); |
| 210 | 212 |
| 211 RegisterForTabNotifications(contents); | 213 RegisterForTabNotifications(contents); |
| 212 } | 214 } |
| 213 | 215 |
| 214 void TabsEventRouter::TabInsertedAt(WebContents* contents, | 216 void TabsEventRouter::TabInsertedAt(WebContents* contents, |
| 215 int index, | 217 int index, |
| 216 bool active) { | 218 bool active) { |
| 217 if (!GetTabEntry(contents)) { | 219 if (!GetTabEntry(contents)) { |
| 218 // We've never seen this tab, send create event as long as we're not in the | 220 // We've never seen this tab, send create event as long as we're not in the |
| 219 // constructor. | 221 // constructor. |
| 220 if (browser_tab_strip_tracker_.is_processing_initial_browsers()) | 222 if (browser_tab_strip_tracker_.is_processing_initial_browsers()) |
| 221 RegisterForTabNotifications(contents); | 223 RegisterForTabNotifications(contents); |
| 222 else | 224 else |
| 223 TabCreatedAt(contents, index, active); | 225 TabCreatedAt(contents, index, active); |
| 224 return; | 226 return; |
| 225 } | 227 } |
| 226 | 228 |
| 227 int tab_id = ExtensionTabUtil::GetTabId(contents); | 229 int tab_id = ExtensionTabUtil::GetTabId(contents); |
| 228 scoped_ptr<base::ListValue> args(new base::ListValue); | 230 std::unique_ptr<base::ListValue> args(new base::ListValue); |
| 229 args->Append(new FundamentalValue(tab_id)); | 231 args->Append(new FundamentalValue(tab_id)); |
| 230 | 232 |
| 231 base::DictionaryValue* object_args = new base::DictionaryValue(); | 233 base::DictionaryValue* object_args = new base::DictionaryValue(); |
| 232 object_args->Set(tabs_constants::kNewWindowIdKey, | 234 object_args->Set(tabs_constants::kNewWindowIdKey, |
| 233 new FundamentalValue( | 235 new FundamentalValue( |
| 234 ExtensionTabUtil::GetWindowIdOfTab(contents))); | 236 ExtensionTabUtil::GetWindowIdOfTab(contents))); |
| 235 object_args->Set(tabs_constants::kNewPositionKey, | 237 object_args->Set(tabs_constants::kNewPositionKey, |
| 236 new FundamentalValue(index)); | 238 new FundamentalValue(index)); |
| 237 args->Append(object_args); | 239 args->Append(object_args); |
| 238 | 240 |
| 239 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); | 241 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); |
| 240 DispatchEvent(profile, events::TABS_ON_ATTACHED, tabs::OnAttached::kEventName, | 242 DispatchEvent(profile, events::TABS_ON_ATTACHED, tabs::OnAttached::kEventName, |
| 241 std::move(args), EventRouter::USER_GESTURE_UNKNOWN); | 243 std::move(args), EventRouter::USER_GESTURE_UNKNOWN); |
| 242 } | 244 } |
| 243 | 245 |
| 244 void TabsEventRouter::TabDetachedAt(WebContents* contents, int index) { | 246 void TabsEventRouter::TabDetachedAt(WebContents* contents, int index) { |
| 245 if (!GetTabEntry(contents)) { | 247 if (!GetTabEntry(contents)) { |
| 246 // The tab was removed. Don't send detach event. | 248 // The tab was removed. Don't send detach event. |
| 247 return; | 249 return; |
| 248 } | 250 } |
| 249 | 251 |
| 250 scoped_ptr<base::ListValue> args(new base::ListValue); | 252 std::unique_ptr<base::ListValue> args(new base::ListValue); |
| 251 args->Append( | 253 args->Append( |
| 252 new FundamentalValue(ExtensionTabUtil::GetTabId(contents))); | 254 new FundamentalValue(ExtensionTabUtil::GetTabId(contents))); |
| 253 | 255 |
| 254 base::DictionaryValue* object_args = new base::DictionaryValue(); | 256 base::DictionaryValue* object_args = new base::DictionaryValue(); |
| 255 object_args->Set(tabs_constants::kOldWindowIdKey, | 257 object_args->Set(tabs_constants::kOldWindowIdKey, |
| 256 new FundamentalValue( | 258 new FundamentalValue( |
| 257 ExtensionTabUtil::GetWindowIdOfTab(contents))); | 259 ExtensionTabUtil::GetWindowIdOfTab(contents))); |
| 258 object_args->Set(tabs_constants::kOldPositionKey, | 260 object_args->Set(tabs_constants::kOldPositionKey, |
| 259 new FundamentalValue(index)); | 261 new FundamentalValue(index)); |
| 260 args->Append(object_args); | 262 args->Append(object_args); |
| 261 | 263 |
| 262 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); | 264 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); |
| 263 DispatchEvent(profile, events::TABS_ON_DETACHED, tabs::OnDetached::kEventName, | 265 DispatchEvent(profile, events::TABS_ON_DETACHED, tabs::OnDetached::kEventName, |
| 264 std::move(args), EventRouter::USER_GESTURE_UNKNOWN); | 266 std::move(args), EventRouter::USER_GESTURE_UNKNOWN); |
| 265 } | 267 } |
| 266 | 268 |
| 267 void TabsEventRouter::TabClosingAt(TabStripModel* tab_strip_model, | 269 void TabsEventRouter::TabClosingAt(TabStripModel* tab_strip_model, |
| 268 WebContents* contents, | 270 WebContents* contents, |
| 269 int index) { | 271 int index) { |
| 270 int tab_id = ExtensionTabUtil::GetTabId(contents); | 272 int tab_id = ExtensionTabUtil::GetTabId(contents); |
| 271 | 273 |
| 272 scoped_ptr<base::ListValue> args(new base::ListValue); | 274 std::unique_ptr<base::ListValue> args(new base::ListValue); |
| 273 args->Append(new FundamentalValue(tab_id)); | 275 args->Append(new FundamentalValue(tab_id)); |
| 274 | 276 |
| 275 base::DictionaryValue* object_args = new base::DictionaryValue(); | 277 base::DictionaryValue* object_args = new base::DictionaryValue(); |
| 276 object_args->SetInteger(tabs_constants::kWindowIdKey, | 278 object_args->SetInteger(tabs_constants::kWindowIdKey, |
| 277 ExtensionTabUtil::GetWindowIdOfTab(contents)); | 279 ExtensionTabUtil::GetWindowIdOfTab(contents)); |
| 278 object_args->SetBoolean(tabs_constants::kWindowClosing, | 280 object_args->SetBoolean(tabs_constants::kWindowClosing, |
| 279 tab_strip_model->closing_all()); | 281 tab_strip_model->closing_all()); |
| 280 args->Append(object_args); | 282 args->Append(object_args); |
| 281 | 283 |
| 282 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); | 284 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); |
| 283 DispatchEvent(profile, events::TABS_ON_REMOVED, tabs::OnRemoved::kEventName, | 285 DispatchEvent(profile, events::TABS_ON_REMOVED, tabs::OnRemoved::kEventName, |
| 284 std::move(args), EventRouter::USER_GESTURE_UNKNOWN); | 286 std::move(args), EventRouter::USER_GESTURE_UNKNOWN); |
| 285 | 287 |
| 286 UnregisterForTabNotifications(contents); | 288 UnregisterForTabNotifications(contents); |
| 287 } | 289 } |
| 288 | 290 |
| 289 void TabsEventRouter::ActiveTabChanged(WebContents* old_contents, | 291 void TabsEventRouter::ActiveTabChanged(WebContents* old_contents, |
| 290 WebContents* new_contents, | 292 WebContents* new_contents, |
| 291 int index, | 293 int index, |
| 292 int reason) { | 294 int reason) { |
| 293 scoped_ptr<base::ListValue> args(new base::ListValue); | 295 std::unique_ptr<base::ListValue> args(new base::ListValue); |
| 294 int tab_id = ExtensionTabUtil::GetTabId(new_contents); | 296 int tab_id = ExtensionTabUtil::GetTabId(new_contents); |
| 295 args->Append(new FundamentalValue(tab_id)); | 297 args->Append(new FundamentalValue(tab_id)); |
| 296 | 298 |
| 297 base::DictionaryValue* object_args = new base::DictionaryValue(); | 299 base::DictionaryValue* object_args = new base::DictionaryValue(); |
| 298 object_args->Set(tabs_constants::kWindowIdKey, | 300 object_args->Set(tabs_constants::kWindowIdKey, |
| 299 new FundamentalValue( | 301 new FundamentalValue( |
| 300 ExtensionTabUtil::GetWindowIdOfTab(new_contents))); | 302 ExtensionTabUtil::GetWindowIdOfTab(new_contents))); |
| 301 args->Append(object_args); | 303 args->Append(object_args); |
| 302 | 304 |
| 303 // The onActivated event replaced onActiveChanged and onSelectionChanged. The | 305 // The onActivated event replaced onActiveChanged and onSelectionChanged. The |
| 304 // deprecated events take two arguments: tabId, {windowId}. | 306 // deprecated events take two arguments: tabId, {windowId}. |
| 305 Profile* profile = | 307 Profile* profile = |
| 306 Profile::FromBrowserContext(new_contents->GetBrowserContext()); | 308 Profile::FromBrowserContext(new_contents->GetBrowserContext()); |
| 307 EventRouter::UserGestureState gesture = | 309 EventRouter::UserGestureState gesture = |
| 308 reason & CHANGE_REASON_USER_GESTURE | 310 reason & CHANGE_REASON_USER_GESTURE |
| 309 ? EventRouter::USER_GESTURE_ENABLED | 311 ? EventRouter::USER_GESTURE_ENABLED |
| 310 : EventRouter::USER_GESTURE_NOT_ENABLED; | 312 : EventRouter::USER_GESTURE_NOT_ENABLED; |
| 311 DispatchEvent(profile, events::TABS_ON_SELECTION_CHANGED, | 313 DispatchEvent(profile, events::TABS_ON_SELECTION_CHANGED, |
| 312 tabs::OnSelectionChanged::kEventName, | 314 tabs::OnSelectionChanged::kEventName, |
| 313 scoped_ptr<base::ListValue>(args->DeepCopy()), gesture); | 315 std::unique_ptr<base::ListValue>(args->DeepCopy()), gesture); |
| 314 DispatchEvent(profile, events::TABS_ON_ACTIVE_CHANGED, | 316 DispatchEvent(profile, events::TABS_ON_ACTIVE_CHANGED, |
| 315 tabs::OnActiveChanged::kEventName, | 317 tabs::OnActiveChanged::kEventName, |
| 316 scoped_ptr<base::ListValue>(args->DeepCopy()), gesture); | 318 std::unique_ptr<base::ListValue>(args->DeepCopy()), gesture); |
| 317 | 319 |
| 318 // The onActivated event takes one argument: {windowId, tabId}. | 320 // The onActivated event takes one argument: {windowId, tabId}. |
| 319 args->Remove(0, NULL); | 321 args->Remove(0, NULL); |
| 320 object_args->Set(tabs_constants::kTabIdKey, | 322 object_args->Set(tabs_constants::kTabIdKey, |
| 321 new FundamentalValue(tab_id)); | 323 new FundamentalValue(tab_id)); |
| 322 DispatchEvent(profile, events::TABS_ON_ACTIVATED, | 324 DispatchEvent(profile, events::TABS_ON_ACTIVATED, |
| 323 tabs::OnActivated::kEventName, std::move(args), gesture); | 325 tabs::OnActivated::kEventName, std::move(args), gesture); |
| 324 } | 326 } |
| 325 | 327 |
| 326 void TabsEventRouter::TabSelectionChanged( | 328 void TabsEventRouter::TabSelectionChanged( |
| 327 TabStripModel* tab_strip_model, | 329 TabStripModel* tab_strip_model, |
| 328 const ui::ListSelectionModel& old_model) { | 330 const ui::ListSelectionModel& old_model) { |
| 329 ui::ListSelectionModel::SelectedIndices new_selection = | 331 ui::ListSelectionModel::SelectedIndices new_selection = |
| 330 tab_strip_model->selection_model().selected_indices(); | 332 tab_strip_model->selection_model().selected_indices(); |
| 331 scoped_ptr<base::ListValue> all_tabs(new base::ListValue); | 333 std::unique_ptr<base::ListValue> all_tabs(new base::ListValue); |
| 332 | 334 |
| 333 for (size_t i = 0; i < new_selection.size(); ++i) { | 335 for (size_t i = 0; i < new_selection.size(); ++i) { |
| 334 int index = new_selection[i]; | 336 int index = new_selection[i]; |
| 335 WebContents* contents = tab_strip_model->GetWebContentsAt(index); | 337 WebContents* contents = tab_strip_model->GetWebContentsAt(index); |
| 336 if (!contents) | 338 if (!contents) |
| 337 break; | 339 break; |
| 338 int tab_id = ExtensionTabUtil::GetTabId(contents); | 340 int tab_id = ExtensionTabUtil::GetTabId(contents); |
| 339 all_tabs->Append(new FundamentalValue(tab_id)); | 341 all_tabs->Append(new FundamentalValue(tab_id)); |
| 340 } | 342 } |
| 341 | 343 |
| 342 scoped_ptr<base::ListValue> args(new base::ListValue); | 344 std::unique_ptr<base::ListValue> args(new base::ListValue); |
| 343 scoped_ptr<base::DictionaryValue> select_info(new base::DictionaryValue); | 345 std::unique_ptr<base::DictionaryValue> select_info(new base::DictionaryValue); |
| 344 | 346 |
| 345 select_info->Set( | 347 select_info->Set( |
| 346 tabs_constants::kWindowIdKey, | 348 tabs_constants::kWindowIdKey, |
| 347 new FundamentalValue( | 349 new FundamentalValue( |
| 348 ExtensionTabUtil::GetWindowIdOfTabStripModel(tab_strip_model))); | 350 ExtensionTabUtil::GetWindowIdOfTabStripModel(tab_strip_model))); |
| 349 | 351 |
| 350 select_info->Set(tabs_constants::kTabIdsKey, all_tabs.release()); | 352 select_info->Set(tabs_constants::kTabIdsKey, all_tabs.release()); |
| 351 args->Append(select_info.release()); | 353 args->Append(select_info.release()); |
| 352 | 354 |
| 353 // The onHighlighted event replaced onHighlightChanged. | 355 // The onHighlighted event replaced onHighlightChanged. |
| 354 Profile* profile = tab_strip_model->profile(); | 356 Profile* profile = tab_strip_model->profile(); |
| 355 DispatchEvent(profile, events::TABS_ON_HIGHLIGHT_CHANGED, | 357 DispatchEvent(profile, events::TABS_ON_HIGHLIGHT_CHANGED, |
| 356 tabs::OnHighlightChanged::kEventName, | 358 tabs::OnHighlightChanged::kEventName, |
| 357 scoped_ptr<base::ListValue>(args->DeepCopy()), | 359 std::unique_ptr<base::ListValue>(args->DeepCopy()), |
| 358 EventRouter::USER_GESTURE_UNKNOWN); | 360 EventRouter::USER_GESTURE_UNKNOWN); |
| 359 DispatchEvent(profile, events::TABS_ON_HIGHLIGHTED, | 361 DispatchEvent(profile, events::TABS_ON_HIGHLIGHTED, |
| 360 tabs::OnHighlighted::kEventName, std::move(args), | 362 tabs::OnHighlighted::kEventName, std::move(args), |
| 361 EventRouter::USER_GESTURE_UNKNOWN); | 363 EventRouter::USER_GESTURE_UNKNOWN); |
| 362 } | 364 } |
| 363 | 365 |
| 364 void TabsEventRouter::TabMoved(WebContents* contents, | 366 void TabsEventRouter::TabMoved(WebContents* contents, |
| 365 int from_index, | 367 int from_index, |
| 366 int to_index) { | 368 int to_index) { |
| 367 scoped_ptr<base::ListValue> args(new base::ListValue); | 369 std::unique_ptr<base::ListValue> args(new base::ListValue); |
| 368 args->Append( | 370 args->Append( |
| 369 new FundamentalValue(ExtensionTabUtil::GetTabId(contents))); | 371 new FundamentalValue(ExtensionTabUtil::GetTabId(contents))); |
| 370 | 372 |
| 371 base::DictionaryValue* object_args = new base::DictionaryValue(); | 373 base::DictionaryValue* object_args = new base::DictionaryValue(); |
| 372 object_args->Set(tabs_constants::kWindowIdKey, | 374 object_args->Set(tabs_constants::kWindowIdKey, |
| 373 new FundamentalValue( | 375 new FundamentalValue( |
| 374 ExtensionTabUtil::GetWindowIdOfTab(contents))); | 376 ExtensionTabUtil::GetWindowIdOfTab(contents))); |
| 375 object_args->Set(tabs_constants::kFromIndexKey, | 377 object_args->Set(tabs_constants::kFromIndexKey, |
| 376 new FundamentalValue(from_index)); | 378 new FundamentalValue(from_index)); |
| 377 object_args->Set(tabs_constants::kToIndexKey, | 379 object_args->Set(tabs_constants::kToIndexKey, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 407 return; | 409 return; |
| 408 std::set<std::string> changed_property_names; | 410 std::set<std::string> changed_property_names; |
| 409 changed_property_names.insert(tabs_constants::kFaviconUrlKey); | 411 changed_property_names.insert(tabs_constants::kFaviconUrlKey); |
| 410 DispatchTabUpdatedEvent(contents, std::move(changed_property_names)); | 412 DispatchTabUpdatedEvent(contents, std::move(changed_property_names)); |
| 411 } | 413 } |
| 412 | 414 |
| 413 void TabsEventRouter::DispatchEvent( | 415 void TabsEventRouter::DispatchEvent( |
| 414 Profile* profile, | 416 Profile* profile, |
| 415 events::HistogramValue histogram_value, | 417 events::HistogramValue histogram_value, |
| 416 const std::string& event_name, | 418 const std::string& event_name, |
| 417 scoped_ptr<base::ListValue> args, | 419 std::unique_ptr<base::ListValue> args, |
| 418 EventRouter::UserGestureState user_gesture) { | 420 EventRouter::UserGestureState user_gesture) { |
| 419 EventRouter* event_router = EventRouter::Get(profile); | 421 EventRouter* event_router = EventRouter::Get(profile); |
| 420 if (!profile_->IsSameProfile(profile) || !event_router) | 422 if (!profile_->IsSameProfile(profile) || !event_router) |
| 421 return; | 423 return; |
| 422 | 424 |
| 423 scoped_ptr<Event> event( | 425 std::unique_ptr<Event> event( |
| 424 new Event(histogram_value, event_name, std::move(args))); | 426 new Event(histogram_value, event_name, std::move(args))); |
| 425 event->restrict_to_browser_context = profile; | 427 event->restrict_to_browser_context = profile; |
| 426 event->user_gesture = user_gesture; | 428 event->user_gesture = user_gesture; |
| 427 event_router->BroadcastEvent(std::move(event)); | 429 event_router->BroadcastEvent(std::move(event)); |
| 428 } | 430 } |
| 429 | 431 |
| 430 void TabsEventRouter::DispatchTabUpdatedEvent( | 432 void TabsEventRouter::DispatchTabUpdatedEvent( |
| 431 WebContents* contents, | 433 WebContents* contents, |
| 432 const std::set<std::string> changed_property_names) { | 434 const std::set<std::string> changed_property_names) { |
| 433 DCHECK(!changed_property_names.empty()); | 435 DCHECK(!changed_property_names.empty()); |
| 434 DCHECK(contents); | 436 DCHECK(contents); |
| 435 | 437 |
| 436 // The state of the tab (as seen from the extension point of view) has | 438 // The state of the tab (as seen from the extension point of view) has |
| 437 // changed. Send a notification to the extension. | 439 // changed. Send a notification to the extension. |
| 438 scoped_ptr<base::ListValue> args_base(new base::ListValue); | 440 std::unique_ptr<base::ListValue> args_base(new base::ListValue); |
| 439 | 441 |
| 440 // First arg: The id of the tab that changed. | 442 // First arg: The id of the tab that changed. |
| 441 args_base->AppendInteger(ExtensionTabUtil::GetTabId(contents)); | 443 args_base->AppendInteger(ExtensionTabUtil::GetTabId(contents)); |
| 442 | 444 |
| 443 // Second arg: An object containing the changes to the tab state. Filled in | 445 // Second arg: An object containing the changes to the tab state. Filled in |
| 444 // by WillDispatchTabUpdatedEvent as a copy of changed_properties, if the | 446 // by WillDispatchTabUpdatedEvent as a copy of changed_properties, if the |
| 445 // extension has the tabs permission. | 447 // extension has the tabs permission. |
| 446 | 448 |
| 447 // Third arg: An object containing the state of the tab. Filled in by | 449 // Third arg: An object containing the state of the tab. Filled in by |
| 448 // WillDispatchTabUpdatedEvent. | 450 // WillDispatchTabUpdatedEvent. |
| 449 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); | 451 Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); |
| 450 | 452 |
| 451 scoped_ptr<Event> event(new Event(events::TABS_ON_UPDATED, | 453 std::unique_ptr<Event> event(new Event(events::TABS_ON_UPDATED, |
| 452 tabs::OnUpdated::kEventName, | 454 tabs::OnUpdated::kEventName, |
| 453 std::move(args_base))); | 455 std::move(args_base))); |
| 454 event->restrict_to_browser_context = profile; | 456 event->restrict_to_browser_context = profile; |
| 455 event->user_gesture = EventRouter::USER_GESTURE_NOT_ENABLED; | 457 event->user_gesture = EventRouter::USER_GESTURE_NOT_ENABLED; |
| 456 event->will_dispatch_callback = | 458 event->will_dispatch_callback = |
| 457 base::Bind(&WillDispatchTabUpdatedEvent, contents, | 459 base::Bind(&WillDispatchTabUpdatedEvent, contents, |
| 458 std::move(changed_property_names)); | 460 std::move(changed_property_names)); |
| 459 EventRouter::Get(profile)->BroadcastEvent(std::move(event)); | 461 EventRouter::Get(profile)->BroadcastEvent(std::move(event)); |
| 460 } | 462 } |
| 461 | 463 |
| 462 TabsEventRouter::TabEntry* TabsEventRouter::GetTabEntry(WebContents* contents) { | 464 TabsEventRouter::TabEntry* TabsEventRouter::GetTabEntry(WebContents* contents) { |
| 463 const auto it = tab_entries_.find(ExtensionTabUtil::GetTabId(contents)); | 465 const auto it = tab_entries_.find(ExtensionTabUtil::GetTabId(contents)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 474 } | 476 } |
| 475 | 477 |
| 476 void TabsEventRouter::TabReplacedAt(TabStripModel* tab_strip_model, | 478 void TabsEventRouter::TabReplacedAt(TabStripModel* tab_strip_model, |
| 477 WebContents* old_contents, | 479 WebContents* old_contents, |
| 478 WebContents* new_contents, | 480 WebContents* new_contents, |
| 479 int index) { | 481 int index) { |
| 480 // Notify listeners that the next tabs closing or being added are due to | 482 // Notify listeners that the next tabs closing or being added are due to |
| 481 // WebContents being swapped. | 483 // WebContents being swapped. |
| 482 const int new_tab_id = ExtensionTabUtil::GetTabId(new_contents); | 484 const int new_tab_id = ExtensionTabUtil::GetTabId(new_contents); |
| 483 const int old_tab_id = ExtensionTabUtil::GetTabId(old_contents); | 485 const int old_tab_id = ExtensionTabUtil::GetTabId(old_contents); |
| 484 scoped_ptr<base::ListValue> args(new base::ListValue); | 486 std::unique_ptr<base::ListValue> args(new base::ListValue); |
| 485 args->Append(new FundamentalValue(new_tab_id)); | 487 args->Append(new FundamentalValue(new_tab_id)); |
| 486 args->Append(new FundamentalValue(old_tab_id)); | 488 args->Append(new FundamentalValue(old_tab_id)); |
| 487 | 489 |
| 488 DispatchEvent(Profile::FromBrowserContext(new_contents->GetBrowserContext()), | 490 DispatchEvent(Profile::FromBrowserContext(new_contents->GetBrowserContext()), |
| 489 events::TABS_ON_REPLACED, tabs::OnReplaced::kEventName, | 491 events::TABS_ON_REPLACED, tabs::OnReplaced::kEventName, |
| 490 std::move(args), EventRouter::USER_GESTURE_UNKNOWN); | 492 std::move(args), EventRouter::USER_GESTURE_UNKNOWN); |
| 491 | 493 |
| 492 UnregisterForTabNotifications(old_contents); | 494 UnregisterForTabNotifications(old_contents); |
| 493 | 495 |
| 494 if (!GetTabEntry(new_contents)) | 496 if (!GetTabEntry(new_contents)) |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 bool icon_url_changed, | 541 bool icon_url_changed, |
| 540 const gfx::Image& image) { | 542 const gfx::Image& image) { |
| 541 if (notification_icon_type == NON_TOUCH_16_DIP && icon_url_changed) { | 543 if (notification_icon_type == NON_TOUCH_16_DIP && icon_url_changed) { |
| 542 favicon::ContentFaviconDriver* content_favicon_driver = | 544 favicon::ContentFaviconDriver* content_favicon_driver = |
| 543 static_cast<favicon::ContentFaviconDriver*>(favicon_driver); | 545 static_cast<favicon::ContentFaviconDriver*>(favicon_driver); |
| 544 FaviconUrlUpdated(content_favicon_driver->web_contents()); | 546 FaviconUrlUpdated(content_favicon_driver->web_contents()); |
| 545 } | 547 } |
| 546 } | 548 } |
| 547 | 549 |
| 548 } // namespace extensions | 550 } // namespace extensions |
| OLD | NEW |