OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/chromeos/launcher_search_provider/service.h" | 5 #include "chrome/browser/chromeos/launcher_search_provider/service.h" |
6 | 6 |
| 7 #include "base/memory/scoped_vector.h" |
| 8 #include "base/strings/utf_string_conversions.h" |
7 #include "chrome/browser/chromeos/launcher_search_provider/service_factory.h" | 9 #include "chrome/browser/chromeos/launcher_search_provider/service_factory.h" |
8 #include "chrome/common/extensions/api/launcher_search_provider.h" | 10 #include "chrome/browser/ui/app_list/search/launcher_search/launcher_search_prov
ider.h" |
| 11 #include "chrome/browser/ui/app_list/search/launcher_search/launcher_search_resu
lt.h" |
9 #include "extensions/browser/extension_registry.h" | 12 #include "extensions/browser/extension_registry.h" |
10 #include "extensions/common/extension_set.h" | 13 #include "extensions/common/extension_set.h" |
11 #include "extensions/common/permissions/permissions_data.h" | 14 #include "extensions/common/permissions/permissions_data.h" |
12 | 15 |
13 namespace api_launcher_search_provider = | 16 namespace api_launcher_search_provider = |
14 extensions::api::launcher_search_provider; | 17 extensions::api::launcher_search_provider; |
15 using extensions::ExtensionId; | 18 using extensions::ExtensionId; |
16 using extensions::ExtensionSet; | 19 using extensions::ExtensionSet; |
17 | 20 |
18 namespace chromeos { | 21 namespace chromeos { |
19 namespace launcher_search_provider { | 22 namespace launcher_search_provider { |
20 | 23 |
21 Service::Service(Profile* profile, | 24 Service::Service(Profile* profile, |
22 extensions::ExtensionRegistry* extension_registry) | 25 extensions::ExtensionRegistry* extension_registry) |
23 : profile_(profile), | 26 : profile_(profile), |
24 extension_registry_(extension_registry), | 27 extension_registry_(extension_registry), |
| 28 provider_(nullptr), |
25 query_id_(0), | 29 query_id_(0), |
26 is_query_running_(false) { | 30 is_query_running_(false) { |
27 } | 31 } |
28 | 32 |
29 Service::~Service() { | 33 Service::~Service() { |
30 } | 34 } |
31 | 35 |
32 // static | 36 // static |
33 Service* Service::Get(content::BrowserContext* context) { | 37 Service* Service::Get(content::BrowserContext* context) { |
34 return ServiceFactory::Get(context); | 38 return ServiceFactory::Get(context); |
35 } | 39 } |
36 | 40 |
37 void Service::OnQueryStarted(const std::string& query, const int max_result) { | 41 void Service::OnQueryStarted(app_list::LauncherSearchProvider* provider, |
| 42 const std::string& query, |
| 43 const int max_result) { |
38 DCHECK(!is_query_running_); | 44 DCHECK(!is_query_running_); |
39 is_query_running_ = true; | 45 is_query_running_ = true; |
| 46 provider_ = provider; |
40 | 47 |
41 ++query_id_; | 48 ++query_id_; |
42 | 49 |
43 extensions::EventRouter* event_router = | 50 extensions::EventRouter* event_router = |
44 extensions::EventRouter::Get(profile_); | 51 extensions::EventRouter::Get(profile_); |
45 | 52 |
46 std::set<ExtensionId> extension_ids = GetListenerExtensionIds(); | 53 std::set<ExtensionId> extension_ids = GetListenerExtensionIds(); |
47 for (const ExtensionId extension_id : extension_ids) { | 54 for (const ExtensionId extension_id : extension_ids) { |
| 55 // Convert query_id_ to string here since queryId is defined as string in |
| 56 // javascript side API while we use uint32 internally to generate it. |
| 57 // TODO(yawano): Consider if we can change it to integer at javascript side. |
48 event_router->DispatchEventToExtension( | 58 event_router->DispatchEventToExtension( |
49 extension_id, | 59 extension_id, |
50 make_scoped_ptr(new extensions::Event( | 60 make_scoped_ptr(new extensions::Event( |
51 api_launcher_search_provider::OnQueryStarted::kEventName, | 61 api_launcher_search_provider::OnQueryStarted::kEventName, |
52 api_launcher_search_provider::OnQueryStarted::Create( | 62 api_launcher_search_provider::OnQueryStarted::Create( |
53 std::to_string(query_id_), query, max_result)))); | 63 std::to_string(query_id_), query, max_result)))); |
54 } | 64 } |
55 } | 65 } |
56 | 66 |
57 void Service::OnQueryEnded() { | 67 void Service::OnQueryEnded() { |
58 DCHECK(is_query_running_); | 68 DCHECK(is_query_running_); |
| 69 provider_ = nullptr; |
59 | 70 |
60 extensions::EventRouter* event_router = | 71 extensions::EventRouter* event_router = |
61 extensions::EventRouter::Get(profile_); | 72 extensions::EventRouter::Get(profile_); |
62 | 73 |
63 std::set<ExtensionId> extension_ids = GetListenerExtensionIds(); | 74 std::set<ExtensionId> extension_ids = GetListenerExtensionIds(); |
64 for (const ExtensionId extension_id : extension_ids) { | 75 for (const ExtensionId extension_id : extension_ids) { |
65 event_router->DispatchEventToExtension( | 76 event_router->DispatchEventToExtension( |
66 extension_id, | 77 extension_id, |
67 make_scoped_ptr(new extensions::Event( | 78 make_scoped_ptr(new extensions::Event( |
68 api_launcher_search_provider::OnQueryEnded::kEventName, | 79 api_launcher_search_provider::OnQueryEnded::kEventName, |
69 api_launcher_search_provider::OnQueryEnded::Create( | 80 api_launcher_search_provider::OnQueryEnded::Create( |
70 std::to_string(query_id_))))); | 81 std::to_string(query_id_))))); |
71 } | 82 } |
72 | 83 |
73 is_query_running_ = false; | 84 is_query_running_ = false; |
74 } | 85 } |
75 | 86 |
| 87 void Service::SetSearchResults( |
| 88 const extensions::Extension* extension, |
| 89 const std::string& query_id, |
| 90 const std::vector<linked_ptr< |
| 91 extensions::api::launcher_search_provider::SearchResult>>& results) { |
| 92 // If query is not running or query_id is different from current query id, |
| 93 // discard the results. |
| 94 if (!is_query_running_ || query_id != std::to_string(query_id_)) |
| 95 return; |
| 96 |
| 97 // Set search results to provider. |
| 98 DCHECK(provider_); |
| 99 ScopedVector<app_list::LauncherSearchResult> search_results; |
| 100 for (const auto& result : results) { |
| 101 const int relevance = |
| 102 std::min(kMaxSearchResultScore, std::max(result->relevance, 0)); |
| 103 const GURL icon_url = |
| 104 result->icon_url ? GURL(*result->icon_url.get()) : GURL(); |
| 105 |
| 106 app_list::LauncherSearchResult* search_result = |
| 107 new app_list::LauncherSearchResult(result->item_id, icon_url, relevance, |
| 108 profile_, extension); |
| 109 search_result->set_title(base::UTF8ToUTF16(result->title)); |
| 110 search_results.push_back(search_result); |
| 111 } |
| 112 provider_->SetSearchResults(extension->id(), search_results.Pass()); |
| 113 } |
| 114 |
76 bool Service::IsQueryRunning() const { | 115 bool Service::IsQueryRunning() const { |
77 return is_query_running_; | 116 return is_query_running_; |
78 } | 117 } |
79 | 118 |
80 std::set<ExtensionId> Service::GetListenerExtensionIds() { | 119 std::set<ExtensionId> Service::GetListenerExtensionIds() { |
81 std::set<ExtensionId> extension_ids; | 120 std::set<ExtensionId> extension_ids; |
82 | 121 |
83 const ExtensionSet& extension_set = extension_registry_->enabled_extensions(); | 122 const ExtensionSet& extension_set = extension_registry_->enabled_extensions(); |
84 for (scoped_refptr<const extensions::Extension> extension : extension_set) { | 123 for (scoped_refptr<const extensions::Extension> extension : extension_set) { |
85 const extensions::PermissionsData* permission_data = | 124 const extensions::PermissionsData* permission_data = |
86 extension->permissions_data(); | 125 extension->permissions_data(); |
87 const bool has_permission = permission_data->HasAPIPermission( | 126 const bool has_permission = permission_data->HasAPIPermission( |
88 extensions::APIPermission::kLauncherSearchProvider); | 127 extensions::APIPermission::kLauncherSearchProvider); |
89 if (has_permission) | 128 if (has_permission) |
90 extension_ids.insert(extension->id()); | 129 extension_ids.insert(extension->id()); |
91 } | 130 } |
92 | 131 |
93 return extension_ids; | 132 return extension_ids; |
94 } | 133 } |
95 | 134 |
96 } // namespace launcher_search_provider | 135 } // namespace launcher_search_provider |
97 } // namespace chromeos | 136 } // namespace chromeos |
OLD | NEW |