OLD | NEW |
| (Empty) |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/ui/webui/chromeos/nfc_debug_ui.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/bind_helpers.h" | |
9 #include "base/macros.h" | |
10 #include "base/values.h" | |
11 #include "chrome/browser/profiles/profile.h" | |
12 #include "chrome/common/url_constants.h" | |
13 #include "chrome/grit/browser_resources.h" | |
14 #include "chrome/grit/generated_resources.h" | |
15 #include "content/public/browser/web_ui.h" | |
16 #include "content/public/browser/web_ui_data_source.h" | |
17 #include "content/public/browser/web_ui_message_handler.h" | |
18 #include "device/nfc/nfc_adapter.h" | |
19 #include "device/nfc/nfc_adapter_factory.h" | |
20 #include "device/nfc/nfc_peer.h" | |
21 #include "device/nfc/nfc_tag.h" | |
22 | |
23 using device::NfcAdapter; | |
24 using device::NfcAdapterFactory; | |
25 using device::NfcNdefMessage; | |
26 using device::NfcNdefRecord; | |
27 using device::NfcNdefTagTechnology; | |
28 using device::NfcPeer; | |
29 using device::NfcTag; | |
30 using device::NfcTagTechnology; | |
31 | |
32 namespace chromeos { | |
33 | |
34 namespace { | |
35 | |
36 // Keys for various NFC properties that are used by JS. | |
37 const char kAdapterPeersProperty[] = "peers"; | |
38 const char kAdapterPollingProperty[] = "polling"; | |
39 const char kAdapterPoweredProperty[] = "powered"; | |
40 const char kAdapterPresentProperty[] = "present"; | |
41 const char kAdapterTagsProperty[] = "tags"; | |
42 | |
43 const char kPeerIdentifierProperty[] = "identifier"; | |
44 const char kPeerRecordsProperty[] = "records"; | |
45 | |
46 const char kTagIdentifierProperty[] = "identifier"; | |
47 const char kTagTypeProperty[] = "type"; | |
48 const char kTagReadOnlyProperty[] = "readOnly"; | |
49 const char kTagRecordsProperty[] = "records"; | |
50 const char kTagSupportedProtocolProperty[] = "supportedProtocol"; | |
51 const char kTagSupportedTechnologiesProperty[] = "supportedTechnologies"; | |
52 const char kRecordTypeProperty[] = "type"; | |
53 | |
54 // Tag types. | |
55 const char kTagType1[] = "TYPE-1"; | |
56 const char kTagType2[] = "TYPE-2"; | |
57 const char kTagType3[] = "TYPE-3"; | |
58 const char kTagType4[] = "TYPE-4"; | |
59 const char kTagTypeUnknown[] = "UNKNOWN"; | |
60 | |
61 // NFC transfer protocols. | |
62 const char kTagProtocolFelica[] = "FELICA"; | |
63 const char kTagProtocolIsoDep[] = "ISO-DEP"; | |
64 const char kTagProtocolJewel[] = "JEWEL"; | |
65 const char kTagProtocolMifare[] = "MIFARE"; | |
66 const char kTagProtocolNfcDep[] = "NFC-DEP"; | |
67 const char kTagProtocolUnknown[] = "UNKNOWN"; | |
68 | |
69 // NFC tag technologies. | |
70 const char kTagTechnologyNfcA[] = "NFC-A"; | |
71 const char kTagTechnologyNfcB[] = "NFC-B"; | |
72 const char kTagTechnologyNfcF[] = "NFC-F"; | |
73 const char kTagTechnologyNfcV[] = "NFC-V"; | |
74 const char kTagTechnologyIsoDep[] = "ISO-DEP"; | |
75 const char kTagTechnologyNdef[] = "NDEF"; | |
76 | |
77 // NDEF types. | |
78 const char kTypeHandoverCarrier[] = "HANDOVER_CARRIER"; | |
79 const char kTypeHandoverRequest[] = "HANDOVER_REQUEST"; | |
80 const char kTypeHandoverSelect[] = "HANDOVER_SELECT"; | |
81 const char kTypeSmartPoster[] = "SMART_POSTER"; | |
82 const char kTypeText[] = "TEXT"; | |
83 const char kTypeURI[] = "URI"; | |
84 const char kTypeUnknown[] = "UNKNOWN"; | |
85 | |
86 // JavaScript callback constants. | |
87 const char kInitializeCallback[] = "initialize"; | |
88 const char kSetAdapterPowerCallback[] = "setAdapterPower"; | |
89 const char kSetAdapterPollingCallback[] = "setAdapterPolling"; | |
90 const char kSubmitRecordFormCallback[] = "submitRecordForm"; | |
91 | |
92 // Constants for JavaScript functions that we can call. | |
93 const char kOnNfcAdapterInfoChangedFunction[] = | |
94 "nfcDebug.NfcDebugUI.onNfcAdapterInfoChanged"; | |
95 const char kOnNfcAvailabilityDeterminedFunction[] = | |
96 "nfcDebug.NfcDebugUI.onNfcAvailabilityDetermined"; | |
97 const char kOnNfcPeerDeviceInfoChangedFunction[] = | |
98 "nfcDebug.NfcDebugUI.onNfcPeerDeviceInfoChanged"; | |
99 const char kOnNfcTagInfoChangedFunction[] = | |
100 "nfcDebug.NfcDebugUI.onNfcTagInfoChanged"; | |
101 const char kOnSetAdapterPollingFailedFunction[] = | |
102 "nfcDebug.NfcDebugUI.onSetAdapterPollingFailed"; | |
103 const char kOnSetAdapterPowerFailedFunction[] = | |
104 "nfcDebug.NfcDebugUI.onSetAdapterPowerFailed"; | |
105 const char kOnSubmitRecordFormFailedFunction[] = | |
106 "nfcDebug.NfcDebugUI.onSubmitRecordFormFailed"; | |
107 | |
108 std::string RecordTypeToString(NfcNdefRecord::Type type) { | |
109 switch (type) { | |
110 case NfcNdefRecord::kTypeHandoverCarrier: | |
111 return kTypeHandoverCarrier; | |
112 case NfcNdefRecord::kTypeHandoverRequest: | |
113 return kTypeHandoverRequest; | |
114 case NfcNdefRecord::kTypeHandoverSelect: | |
115 return kTypeHandoverSelect; | |
116 case NfcNdefRecord::kTypeSmartPoster: | |
117 return kTypeSmartPoster; | |
118 case NfcNdefRecord::kTypeText: | |
119 return kTypeText; | |
120 case NfcNdefRecord::kTypeURI: | |
121 return kTypeURI; | |
122 case NfcNdefRecord::kTypeUnknown: | |
123 return kTypeUnknown; | |
124 } | |
125 return kTypeUnknown; | |
126 } | |
127 | |
128 NfcNdefRecord::Type RecordTypeStringValueToEnum(const std::string& type) { | |
129 if (type == kTypeHandoverCarrier) | |
130 return NfcNdefRecord::kTypeHandoverCarrier; | |
131 if (type == kTypeHandoverRequest) | |
132 return NfcNdefRecord::kTypeHandoverRequest; | |
133 if (type == kTypeHandoverSelect) | |
134 return NfcNdefRecord::kTypeHandoverSelect; | |
135 if (type == kTypeSmartPoster) | |
136 return NfcNdefRecord::kTypeSmartPoster; | |
137 if (type == kTypeText) | |
138 return NfcNdefRecord::kTypeText; | |
139 if (type == kTypeURI) | |
140 return NfcNdefRecord::kTypeURI; | |
141 return NfcNdefRecord::kTypeUnknown; | |
142 } | |
143 | |
144 std::string TagTypeToString(NfcTag::TagType type) { | |
145 switch (type) { | |
146 case NfcTag::kTagType1: | |
147 return kTagType1; | |
148 case NfcTag::kTagType2: | |
149 return kTagType2; | |
150 case NfcTag::kTagType3: | |
151 return kTagType3; | |
152 case NfcTag::kTagType4: | |
153 return kTagType4; | |
154 case NfcTag::kTagTypeUnknown: | |
155 return kTagTypeUnknown; | |
156 } | |
157 return kTagTypeUnknown; | |
158 } | |
159 | |
160 std::string TagProtocolToString(NfcTag::Protocol protocol) { | |
161 switch (protocol) { | |
162 case NfcTag::kProtocolFelica: | |
163 return kTagProtocolFelica; | |
164 case NfcTag::kProtocolIsoDep: | |
165 return kTagProtocolIsoDep; | |
166 case NfcTag::kProtocolJewel: | |
167 return kTagProtocolJewel; | |
168 case NfcTag::kProtocolMifare: | |
169 return kTagProtocolMifare; | |
170 case NfcTag::kProtocolNfcDep: | |
171 return kTagProtocolNfcDep; | |
172 case NfcTag::kProtocolUnknown: | |
173 return kTagProtocolUnknown; | |
174 } | |
175 return kTagProtocolUnknown; | |
176 } | |
177 | |
178 // content::WebUIMessageHandler implementation for this page. | |
179 class NfcDebugMessageHandler : public content::WebUIMessageHandler, | |
180 public NfcAdapter::Observer, | |
181 public NfcNdefTagTechnology::Observer, | |
182 public NfcPeer::Observer, | |
183 public NfcTag::Observer { | |
184 public: | |
185 NfcDebugMessageHandler(); | |
186 ~NfcDebugMessageHandler() override; | |
187 | |
188 // WebUIMessageHandler implementation. | |
189 void RegisterMessages() override; | |
190 | |
191 // NfcAdapter::Observer overrides. | |
192 void AdapterPresentChanged(NfcAdapter* adapter, bool present) override; | |
193 void AdapterPoweredChanged(NfcAdapter* adapter, bool powered) override; | |
194 void AdapterPollingChanged(NfcAdapter* adapter, bool polling) override; | |
195 void TagFound(NfcAdapter* adapter, NfcTag* tag) override; | |
196 void TagLost(NfcAdapter* adapter, NfcTag* tag) override; | |
197 void PeerFound(NfcAdapter* adaper, NfcPeer* peer) override; | |
198 void PeerLost(NfcAdapter* adapter, NfcPeer* peer) override; | |
199 | |
200 // NfcNdefTagTechnology::Observer override. | |
201 void RecordReceived(NfcTag* tag, const NfcNdefRecord* record) override; | |
202 | |
203 // NfcPeer::Observer override. | |
204 void RecordReceived(NfcPeer* peer, const NfcNdefRecord* record) override; | |
205 | |
206 // NfcTag::Observer override. | |
207 void TagReady(NfcTag* tag) override; | |
208 | |
209 private: | |
210 // Called by the UI when the page loads. This method requests information | |
211 // about NFC availability on the current platform and requests the underlying | |
212 // Adapter object. The UI is notified once the information is available. | |
213 void Initialize(const base::ListValue* args); | |
214 | |
215 // Called by the UI to toggle the adapter power. |args| will contain one | |
216 // boolean that indicates whether the power should be set to ON or OFF. | |
217 void SetAdapterPower(const base::ListValue* args); | |
218 void OnSetAdapterPowerError(); | |
219 | |
220 // Called by the UI set the adapter's poll status. |args| will contain one | |
221 // boolean that indicates whether polling should be started or stopped. | |
222 void SetAdapterPolling(const base::ListValue* args); | |
223 void OnSetAdapterPollingError(); | |
224 | |
225 // Called by the UI to push an NDEF record to a remote device or tag. |args| | |
226 // will contain one dictionary that contains the record data. | |
227 void SubmitRecordForm(const base::ListValue* args); | |
228 void OnSubmitRecordFormFailed(const std::string& error_message); | |
229 | |
230 // Callback passed to NfcAdapterFactory::GetAdapter. | |
231 void OnGetAdapter(scoped_refptr<NfcAdapter> adapter); | |
232 | |
233 // Stores the properties of the NFC adapter in |out|, mapping these to keys | |
234 // that will be read by JS. | |
235 void GetAdapterProperties(base::DictionaryValue* out); | |
236 | |
237 // Stores the properties of the NFC peer in |out|, mapping these to keys | |
238 // that will be read by JS. |out| will not be modified, if no peer is known. | |
239 void GetPeerProperties(base::DictionaryValue* out); | |
240 | |
241 // Stores the properties of the NFC tag in |out|, mapping these to keys | |
242 // that will be read by JS. |out| will not be modified, if no tag is known. | |
243 void GetTagProperties(base::DictionaryValue* out); | |
244 | |
245 // Returns the records in |message| by populating |out|, in which | |
246 // they have been converted to a JS friendly format. | |
247 void GetRecordList(const NfcNdefMessage& message, base::ListValue* out); | |
248 | |
249 // Updates the data displayed in the UI for the current adapter. | |
250 void UpdateAdapterInfo(); | |
251 | |
252 // Updates the data displayed in the UI for the current peer. | |
253 void UpdatePeerInfo(); | |
254 | |
255 // Updates the data displayed in the UI for the current tag. | |
256 void UpdateTagInfo(); | |
257 | |
258 // The NfcAdapter object. | |
259 scoped_refptr<NfcAdapter> nfc_adapter_; | |
260 | |
261 // The cached identifier of the most recent NFC peer device found. | |
262 std::string peer_identifier_; | |
263 | |
264 // The cached identifier of the most recent NFC tag found. | |
265 std::string tag_identifier_; | |
266 | |
267 DISALLOW_COPY_AND_ASSIGN(NfcDebugMessageHandler); | |
268 }; | |
269 | |
270 NfcDebugMessageHandler::NfcDebugMessageHandler() { | |
271 } | |
272 | |
273 NfcDebugMessageHandler::~NfcDebugMessageHandler() { | |
274 if (!nfc_adapter_.get()) | |
275 return; | |
276 nfc_adapter_->RemoveObserver(this); | |
277 if (!peer_identifier_.empty()) { | |
278 NfcPeer* peer = nfc_adapter_->GetPeer(peer_identifier_); | |
279 if (peer) | |
280 peer->RemoveObserver(this); | |
281 } | |
282 if (!tag_identifier_.empty()) { | |
283 NfcTag* tag = nfc_adapter_->GetTag(tag_identifier_); | |
284 if (tag) | |
285 tag->RemoveObserver(this); | |
286 } | |
287 } | |
288 | |
289 void NfcDebugMessageHandler::AdapterPresentChanged( | |
290 NfcAdapter* adapter, | |
291 bool present) { | |
292 UpdateAdapterInfo(); | |
293 } | |
294 | |
295 void NfcDebugMessageHandler::AdapterPoweredChanged( | |
296 NfcAdapter* adapter, | |
297 bool powered) { | |
298 UpdateAdapterInfo(); | |
299 } | |
300 | |
301 void NfcDebugMessageHandler::AdapterPollingChanged( | |
302 NfcAdapter* adapter, | |
303 bool polling) { | |
304 UpdateAdapterInfo(); | |
305 } | |
306 | |
307 void NfcDebugMessageHandler::TagFound(NfcAdapter* adapter, NfcTag* tag) { | |
308 VLOG(1) << "Found NFC tag: " << tag->GetIdentifier(); | |
309 tag->AddObserver(this); | |
310 tag_identifier_ = tag->GetIdentifier(); | |
311 tag->GetNdefTagTechnology()->AddObserver(this); | |
312 UpdateAdapterInfo(); | |
313 UpdateTagInfo(); | |
314 } | |
315 | |
316 void NfcDebugMessageHandler::TagLost(NfcAdapter*adapter, NfcTag* tag) { | |
317 VLOG(1) << "Lost NFC tag: " << tag->GetIdentifier(); | |
318 tag->RemoveObserver(this); | |
319 tag->GetNdefTagTechnology()->RemoveObserver(this); | |
320 tag_identifier_.clear(); | |
321 UpdateAdapterInfo(); | |
322 UpdateTagInfo(); | |
323 } | |
324 | |
325 void NfcDebugMessageHandler::PeerFound(NfcAdapter* adaper, NfcPeer* peer) { | |
326 VLOG(1) << "Found NFC peer device: " << peer->GetIdentifier(); | |
327 peer->AddObserver(this); | |
328 peer_identifier_ = peer->GetIdentifier(); | |
329 UpdateAdapterInfo(); | |
330 UpdatePeerInfo(); | |
331 } | |
332 | |
333 void NfcDebugMessageHandler::PeerLost(NfcAdapter* adapter, NfcPeer* peer) { | |
334 VLOG(1) << "Lost NFC peer device: " << peer->GetIdentifier(); | |
335 peer->RemoveObserver(this); | |
336 peer_identifier_.clear(); | |
337 UpdateAdapterInfo(); | |
338 UpdatePeerInfo(); | |
339 } | |
340 | |
341 void NfcDebugMessageHandler::RecordReceived( | |
342 NfcTag* tag, | |
343 const NfcNdefRecord* record) { | |
344 if (tag->GetIdentifier() != tag_identifier_) { | |
345 LOG(WARNING) << "Records received from unknown tag: " | |
346 << tag->GetIdentifier(); | |
347 return; | |
348 } | |
349 UpdateTagInfo(); | |
350 } | |
351 | |
352 void NfcDebugMessageHandler::RecordReceived( | |
353 NfcPeer* peer, | |
354 const NfcNdefRecord* record) { | |
355 if (peer->GetIdentifier() != peer_identifier_) { | |
356 LOG(WARNING) << "Records received from unknown peer: " | |
357 << peer->GetIdentifier(); | |
358 return; | |
359 } | |
360 UpdatePeerInfo(); | |
361 } | |
362 | |
363 void NfcDebugMessageHandler::TagReady(NfcTag* tag) { | |
364 if (tag_identifier_ != tag->GetIdentifier()) { | |
365 LOG(WARNING) << "Unknown tag became ready: " << tag->GetIdentifier(); | |
366 return; | |
367 } | |
368 VLOG(1) << "Tag ready: " << tag->GetIdentifier(); | |
369 UpdateTagInfo(); | |
370 } | |
371 | |
372 void NfcDebugMessageHandler::RegisterMessages() { | |
373 web_ui()->RegisterMessageCallback( | |
374 kInitializeCallback, | |
375 base::Bind(&NfcDebugMessageHandler::Initialize, | |
376 base::Unretained(this))); | |
377 web_ui()->RegisterMessageCallback( | |
378 kSetAdapterPowerCallback, | |
379 base::Bind(&NfcDebugMessageHandler::SetAdapterPower, | |
380 base::Unretained(this))); | |
381 web_ui()->RegisterMessageCallback( | |
382 kSetAdapterPollingCallback, | |
383 base::Bind(&NfcDebugMessageHandler::SetAdapterPolling, | |
384 base::Unretained(this))); | |
385 web_ui()->RegisterMessageCallback( | |
386 kSubmitRecordFormCallback, | |
387 base::Bind(&NfcDebugMessageHandler::SubmitRecordForm, | |
388 base::Unretained(this))); | |
389 } | |
390 | |
391 void NfcDebugMessageHandler::Initialize(const base::ListValue* args) { | |
392 bool nfc_available = NfcAdapterFactory::IsNfcAvailable(); | |
393 base::FundamentalValue available(nfc_available); | |
394 web_ui()->CallJavascriptFunctionUnsafe(kOnNfcAvailabilityDeterminedFunction, | |
395 available); | |
396 if (!nfc_available) { | |
397 LOG(WARNING) << "NFC is not available on current platform."; | |
398 return; | |
399 } | |
400 NfcAdapterFactory::GetAdapter( | |
401 base::Bind(&NfcDebugMessageHandler::OnGetAdapter, | |
402 base::Unretained(this))); | |
403 } | |
404 | |
405 void NfcDebugMessageHandler::SetAdapterPower(const base::ListValue* args) { | |
406 DCHECK(1 == args->GetSize()); | |
407 DCHECK(nfc_adapter_.get()); | |
408 bool powered; | |
409 args->GetBoolean(0, &powered); | |
410 VLOG(1) << "Setting adapter power: " << powered; | |
411 nfc_adapter_->SetPowered( | |
412 powered, base::Bind(&base::DoNothing), | |
413 base::Bind(&NfcDebugMessageHandler::OnSetAdapterPowerError, | |
414 base::Unretained(this))); | |
415 } | |
416 | |
417 void NfcDebugMessageHandler::OnSetAdapterPowerError() { | |
418 LOG(ERROR) << "Failed to set NFC adapter power."; | |
419 web_ui()->CallJavascriptFunctionUnsafe(kOnSetAdapterPowerFailedFunction); | |
420 } | |
421 | |
422 void NfcDebugMessageHandler::SetAdapterPolling(const base::ListValue* args) { | |
423 DCHECK(1 == args->GetSize()); | |
424 DCHECK(nfc_adapter_.get()); | |
425 bool start = false; | |
426 bool result = args->GetBoolean(0, &start); | |
427 DCHECK(result); | |
428 if (start) { | |
429 VLOG(1) << "Starting NFC poll loop."; | |
430 nfc_adapter_->StartPolling( | |
431 base::Bind(&base::DoNothing), | |
432 base::Bind(&NfcDebugMessageHandler::OnSetAdapterPollingError, | |
433 base::Unretained(this))); | |
434 } else { | |
435 VLOG(1) << "Stopping NFC poll loop."; | |
436 nfc_adapter_->StopPolling( | |
437 base::Bind(&base::DoNothing), | |
438 base::Bind(&NfcDebugMessageHandler::OnSetAdapterPollingError, | |
439 base::Unretained(this))); | |
440 } | |
441 } | |
442 | |
443 void NfcDebugMessageHandler::OnSetAdapterPollingError() { | |
444 LOG(ERROR) << "Failed to start/stop polling."; | |
445 web_ui()->CallJavascriptFunctionUnsafe(kOnSetAdapterPollingFailedFunction); | |
446 } | |
447 | |
448 void NfcDebugMessageHandler::SubmitRecordForm(const base::ListValue* args) { | |
449 DCHECK(1 == args->GetSize()); | |
450 DCHECK(nfc_adapter_.get()); | |
451 const base::DictionaryValue* record_data_const = NULL; | |
452 if (!args->GetDictionary(0, &record_data_const)) { | |
453 NOTREACHED(); | |
454 return; | |
455 } | |
456 | |
457 if (peer_identifier_.empty() && tag_identifier_.empty()) { | |
458 OnSubmitRecordFormFailed("No peer or tag present."); | |
459 return; | |
460 } | |
461 | |
462 std::string type; | |
463 if (!record_data_const->GetString(kRecordTypeProperty, &type)) { | |
464 OnSubmitRecordFormFailed("Record type not provided."); | |
465 return; | |
466 } | |
467 | |
468 base::DictionaryValue* record_data = record_data_const->DeepCopy(); | |
469 record_data->Remove(kRecordTypeProperty, NULL); | |
470 | |
471 // Convert the "targetSize" field to a double, in case JS stored it as an | |
472 // integer. | |
473 int target_size; | |
474 if (record_data->GetInteger(NfcNdefRecord::kFieldTargetSize, &target_size)) { | |
475 record_data->SetDouble(NfcNdefRecord::kFieldTargetSize, | |
476 static_cast<double>(target_size)); | |
477 } | |
478 | |
479 NfcNdefRecord record; | |
480 if (!record.Populate(RecordTypeStringValueToEnum(type), record_data)) { | |
481 OnSubmitRecordFormFailed("Invalid record data provided. Missing required " | |
482 "fields?"); | |
483 return; | |
484 } | |
485 | |
486 if (!peer_identifier_.empty()) { | |
487 NfcPeer* peer = nfc_adapter_->GetPeer(peer_identifier_); | |
488 if (!peer) { | |
489 OnSubmitRecordFormFailed("The current NFC adapter doesn't seem to know " | |
490 "about peer: " + peer_identifier_); | |
491 return; | |
492 } | |
493 NfcNdefMessage message; | |
494 message.AddRecord(&record); | |
495 peer->PushNdef(message, | |
496 base::Bind(&base::DoNothing), | |
497 base::Bind(&NfcDebugMessageHandler::OnSubmitRecordFormFailed, | |
498 base::Unretained(this), | |
499 "Failed to push NDEF record.")); | |
500 return; | |
501 } | |
502 NfcTag* tag = nfc_adapter_->GetTag(tag_identifier_); | |
503 if (!tag) { | |
504 OnSubmitRecordFormFailed("The current NFC tag doesn't seem to known about " | |
505 "tag: " + tag_identifier_); | |
506 return; | |
507 } | |
508 NfcNdefMessage message; | |
509 message.AddRecord(&record); | |
510 tag->GetNdefTagTechnology()->WriteNdef( | |
511 message, | |
512 base::Bind(&base::DoNothing), | |
513 base::Bind(&NfcDebugMessageHandler::OnSubmitRecordFormFailed, | |
514 base::Unretained(this), | |
515 "Failed to write NDEF record.")); | |
516 } | |
517 | |
518 void NfcDebugMessageHandler::OnSubmitRecordFormFailed( | |
519 const std::string& error_message) { | |
520 LOG(ERROR) << "SubmitRecordForm failed: " << error_message; | |
521 web_ui()->CallJavascriptFunctionUnsafe(kOnSubmitRecordFormFailedFunction, | |
522 base::StringValue(error_message)); | |
523 } | |
524 | |
525 void NfcDebugMessageHandler::OnGetAdapter( | |
526 scoped_refptr<NfcAdapter> adapter) { | |
527 if (nfc_adapter_.get()) | |
528 return; | |
529 nfc_adapter_ = adapter; | |
530 nfc_adapter_->AddObserver(this); | |
531 UpdateAdapterInfo(); | |
532 | |
533 NfcAdapter::PeerList peers; | |
534 nfc_adapter_->GetPeers(&peers); | |
535 for (NfcAdapter::PeerList::const_iterator iter = peers.begin(); | |
536 iter != peers.end(); ++iter) { | |
537 PeerFound(nfc_adapter_.get(), *iter); | |
538 } | |
539 | |
540 NfcAdapter::TagList tags; | |
541 nfc_adapter_->GetTags(&tags); | |
542 for (NfcAdapter::TagList::const_iterator iter = tags.begin(); | |
543 iter != tags.end(); ++iter) { | |
544 TagFound(nfc_adapter_.get(), *iter); | |
545 } | |
546 } | |
547 | |
548 void NfcDebugMessageHandler::GetAdapterProperties( | |
549 base::DictionaryValue* out) { | |
550 if (!nfc_adapter_.get()) { | |
551 VLOG(1) << "NFC adapter hasn't been received yet."; | |
552 return; | |
553 } | |
554 out->SetBoolean(kAdapterPresentProperty, nfc_adapter_->IsPresent()); | |
555 out->SetBoolean(kAdapterPollingProperty, nfc_adapter_->IsPolling()); | |
556 out->SetBoolean(kAdapterPoweredProperty, nfc_adapter_->IsPowered()); | |
557 | |
558 NfcAdapter::PeerList peers; | |
559 nfc_adapter_->GetPeers(&peers); | |
560 out->SetInteger(kAdapterPeersProperty, static_cast<int>(peers.size())); | |
561 | |
562 NfcAdapter::TagList tags; | |
563 nfc_adapter_->GetTags(&tags); | |
564 out->SetInteger(kAdapterTagsProperty, static_cast<int>(tags.size())); | |
565 } | |
566 | |
567 void NfcDebugMessageHandler::GetPeerProperties(base::DictionaryValue* out) { | |
568 if (peer_identifier_.empty()) { | |
569 VLOG(1) << "No known peer exists."; | |
570 return; | |
571 } | |
572 if (!nfc_adapter_.get()) { | |
573 VLOG(1) << "NFC adapter hasn't been received yet."; | |
574 return; | |
575 } | |
576 NfcPeer* peer = nfc_adapter_->GetPeer(peer_identifier_); | |
577 if (!peer) { | |
578 LOG(ERROR) << "The current NFC adapter doesn't seem to know about peer: " | |
579 << peer_identifier_; | |
580 return; | |
581 } | |
582 out->SetString(kPeerIdentifierProperty, peer_identifier_); | |
583 | |
584 base::ListValue* records = new base::ListValue(); | |
585 GetRecordList(peer->GetNdefMessage(), records); | |
586 out->Set(kPeerRecordsProperty, records); | |
587 } | |
588 | |
589 void NfcDebugMessageHandler::GetTagProperties(base::DictionaryValue* out) { | |
590 if (tag_identifier_.empty()) { | |
591 VLOG(1) << "No known tag exists."; | |
592 return; | |
593 } | |
594 if (!nfc_adapter_.get()) { | |
595 VLOG(1) << "NFC adapter hasn't been received yet."; | |
596 return; | |
597 } | |
598 NfcTag* tag = nfc_adapter_->GetTag(tag_identifier_); | |
599 if (!tag) { | |
600 LOG(ERROR) << "The current NFC adapter doesn't seem to know about tag: " | |
601 << tag_identifier_; | |
602 return; | |
603 } | |
604 out->SetString(kTagIdentifierProperty, tag_identifier_); | |
605 out->SetString(kTagTypeProperty, TagTypeToString(tag->GetType())); | |
606 out->SetBoolean(kTagReadOnlyProperty, tag->IsReadOnly()); | |
607 out->SetString(kTagSupportedProtocolProperty, | |
608 TagProtocolToString(tag->GetSupportedProtocol())); | |
609 | |
610 base::ListValue* technologies = new base::ListValue(); | |
611 NfcTagTechnology::TechnologyTypeMask technology_mask = | |
612 tag->GetSupportedTechnologies(); | |
613 if (technology_mask & NfcTagTechnology::kTechnologyTypeNfcA) | |
614 technologies->AppendString(kTagTechnologyNfcA); | |
615 if (technology_mask & NfcTagTechnology::kTechnologyTypeNfcB) | |
616 technologies->AppendString(kTagTechnologyNfcB); | |
617 if (technology_mask & NfcTagTechnology::kTechnologyTypeNfcF) | |
618 technologies->AppendString(kTagTechnologyNfcF); | |
619 if (technology_mask & NfcTagTechnology::kTechnologyTypeNfcV) | |
620 technologies->AppendString(kTagTechnologyNfcV); | |
621 if (technology_mask & NfcTagTechnology::kTechnologyTypeIsoDep) | |
622 technologies->AppendString(kTagTechnologyIsoDep); | |
623 if (technology_mask & NfcTagTechnology::kTechnologyTypeNdef) | |
624 technologies->AppendString(kTagTechnologyNdef); | |
625 out->Set(kTagSupportedTechnologiesProperty, technologies); | |
626 | |
627 base::ListValue* records = new base::ListValue(); | |
628 GetRecordList(tag->GetNdefTagTechnology()->GetNdefMessage(), records); | |
629 out->Set(kTagRecordsProperty, records); | |
630 } | |
631 | |
632 void NfcDebugMessageHandler::GetRecordList(const NfcNdefMessage& message, | |
633 base::ListValue* out) { | |
634 for (NfcNdefMessage::RecordList::const_iterator iter = | |
635 message.records().begin(); | |
636 iter != message.records().end(); ++iter) { | |
637 const NfcNdefRecord* record = (*iter); | |
638 base::DictionaryValue* record_data = record->data().DeepCopy(); | |
639 record_data->SetString(kRecordTypeProperty, | |
640 RecordTypeToString(record->type())); | |
641 out->Append(record_data); | |
642 } | |
643 } | |
644 | |
645 void NfcDebugMessageHandler::UpdateAdapterInfo() { | |
646 base::DictionaryValue data; | |
647 GetAdapterProperties(&data); | |
648 web_ui()->CallJavascriptFunctionUnsafe(kOnNfcAdapterInfoChangedFunction, | |
649 data); | |
650 } | |
651 | |
652 void NfcDebugMessageHandler::UpdatePeerInfo() { | |
653 base::DictionaryValue data; | |
654 GetPeerProperties(&data); | |
655 web_ui()->CallJavascriptFunctionUnsafe(kOnNfcPeerDeviceInfoChangedFunction, | |
656 data); | |
657 } | |
658 | |
659 void NfcDebugMessageHandler::UpdateTagInfo() { | |
660 base::DictionaryValue data; | |
661 GetTagProperties(&data); | |
662 web_ui()->CallJavascriptFunctionUnsafe(kOnNfcTagInfoChangedFunction, data); | |
663 } | |
664 | |
665 } // namespace | |
666 | |
667 NfcDebugUI::NfcDebugUI(content::WebUI* web_ui) | |
668 : content::WebUIController(web_ui) { | |
669 web_ui->AddMessageHandler(new NfcDebugMessageHandler()); | |
670 | |
671 content::WebUIDataSource* html_source = | |
672 content::WebUIDataSource::Create(chrome::kChromeUINfcDebugHost); | |
673 | |
674 html_source->AddLocalizedString("titleText", IDS_NFC_DEBUG_TITLE); | |
675 html_source->AddLocalizedString("notSupportedText", | |
676 IDS_NFC_DEBUG_NOT_SUPPORTED); | |
677 html_source->AddLocalizedString("adapterHeaderText", | |
678 IDS_NFC_DEBUG_ADAPTER_HEADER); | |
679 html_source->AddLocalizedString("adapterPowerOnText", | |
680 IDS_NFC_DEBUG_ADAPTER_POWER_ON); | |
681 html_source->AddLocalizedString("adapterPowerOffText", | |
682 IDS_NFC_DEBUG_ADAPTER_POWER_OFF); | |
683 html_source->AddLocalizedString("adapterStartPollText", | |
684 IDS_NFC_DEBUG_ADAPTER_START_POLL); | |
685 html_source->AddLocalizedString("adapterStopPollText", | |
686 IDS_NFC_DEBUG_ADAPTER_STOP_POLL); | |
687 html_source->AddLocalizedString("ndefFormHeaderText", | |
688 IDS_NFC_DEBUG_NDEF_FORM_HEADER); | |
689 html_source->AddLocalizedString("ndefFormTypeTextText", | |
690 IDS_NFC_DEBUG_NDEF_FORM_TYPE_TEXT); | |
691 html_source->AddLocalizedString("ndefFormTypeUriText", | |
692 IDS_NFC_DEBUG_NDEF_FORM_TYPE_URI); | |
693 html_source->AddLocalizedString("ndefFormTypeSmartPosterText", | |
694 IDS_NFC_DEBUG_NDEF_FORM_TYPE_SMART_POSTER); | |
695 html_source->AddLocalizedString("ndefFormWriteButtonText", | |
696 IDS_NFC_DEBUG_NDEF_FORM_WRITE_BUTTON); | |
697 html_source->AddLocalizedString("ndefFormFieldTextText", | |
698 IDS_NFC_DEBUG_NDEF_FORM_FIELD_TEXT); | |
699 html_source->AddLocalizedString("ndefFormFieldEncodingText", | |
700 IDS_NFC_DEBUG_NDEF_FORM_FIELD_ENCODING); | |
701 html_source->AddLocalizedString("ndefFormFieldLanguageCodeText", | |
702 IDS_NFC_DEBUG_NDEF_FORM_FIELD_LANGUAGE_CODE); | |
703 html_source->AddLocalizedString("ndefFormFieldUriText", | |
704 IDS_NFC_DEBUG_NDEF_FORM_FIELD_URI); | |
705 html_source->AddLocalizedString("ndefFormFieldMimeTypeText", | |
706 IDS_NFC_DEBUG_NDEF_FORM_FIELD_MIME_TYPE); | |
707 html_source->AddLocalizedString("ndefFormFieldTargetSizeText", | |
708 IDS_NFC_DEBUG_NDEF_FORM_FIELD_TARGET_SIZE); | |
709 html_source->AddLocalizedString("ndefFormFieldTitleTextText", | |
710 IDS_NFC_DEBUG_NDEF_FORM_FIELD_TITLE_TEXT); | |
711 html_source->AddLocalizedString("ndefFormFieldTitleEncodingText", | |
712 IDS_NFC_DEBUG_NDEF_FORM_FIELD_TITLE_ENCODING); | |
713 html_source->AddLocalizedString( | |
714 "ndefFormFieldTitleLanguageCodeText", | |
715 IDS_NFC_DEBUG_NDEF_FORM_FIELD_TITLE_LANGUAGE_CODE); | |
716 html_source->AddLocalizedString("ndefFormPushButtonText", | |
717 IDS_NFC_DEBUG_NDEF_FORM_PUSH_BUTTON); | |
718 html_source->AddLocalizedString("nfcPeerHeaderText", | |
719 IDS_NFC_DEBUG_NFC_PEER_HEADER); | |
720 html_source->AddLocalizedString("nfcTagHeaderText", | |
721 IDS_NFC_DEBUG_NFC_TAG_HEADER); | |
722 html_source->AddLocalizedString("recordsHeaderText", | |
723 IDS_NFC_DEBUG_RECORDS_HEADER); | |
724 html_source->AddLocalizedString("errorFailedToSetPowerText", | |
725 IDS_NFC_DEBUG_ERROR_FAILED_TO_SET_POWER); | |
726 html_source->AddLocalizedString("errorFailedToSetPollingText", | |
727 IDS_NFC_DEBUG_ERROR_FAILED_TO_SET_POLLING); | |
728 html_source->AddLocalizedString("errorFailedToSubmitPrefixText", | |
729 IDS_NFC_DEBUG_ERROR_FAILED_TO_SUBMIT_PREFIX); | |
730 html_source->SetJsonPath("strings.js"); | |
731 | |
732 // Add required resources. | |
733 html_source->AddResourcePath("nfc_debug.css", IDR_NFC_DEBUG_CSS); | |
734 html_source->AddResourcePath("nfc_debug.js", IDR_NFC_DEBUG_JS); | |
735 html_source->SetDefaultResource(IDR_NFC_DEBUG_HTML); | |
736 | |
737 Profile* profile = Profile::FromWebUI(web_ui); | |
738 content::WebUIDataSource::Add(profile, html_source); | |
739 } | |
740 | |
741 NfcDebugUI::~NfcDebugUI() { | |
742 } | |
743 | |
744 } // namespace chromeos | |
OLD | NEW |