blob: 9f3244e74a0058619ec3b1569bf79fefdd7e937e [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/webui/chromeos/nfc_debug_ui.h"
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/values.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/generated_resources.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
#include "content/public/browser/web_ui_message_handler.h"
#include "device/nfc/nfc_adapter.h"
#include "device/nfc/nfc_adapter_factory.h"
#include "device/nfc/nfc_peer.h"
#include "device/nfc/nfc_tag.h"
#include "grit/browser_resources.h"
using device::NfcAdapter;
using device::NfcAdapterFactory;
using device::NfcNdefMessage;
using device::NfcNdefRecord;
using device::NfcNdefTagTechnology;
using device::NfcPeer;
using device::NfcTag;
using device::NfcTagTechnology;
namespace chromeos {
namespace {
// Keys for various NFC properties that are used by JS.
const char kAdapterPeersProperty[] = "peers";
const char kAdapterPollingProperty[] = "polling";
const char kAdapterPoweredProperty[] = "powered";
const char kAdapterPresentProperty[] = "present";
const char kAdapterTagsProperty[] = "tags";
const char kPeerIdentifierProperty[] = "identifier";
const char kPeerRecordsProperty[] = "records";
const char kTagIdentifierProperty[] = "identifier";
const char kTagTypeProperty[] = "type";
const char kTagReadOnlyProperty[] = "readOnly";
const char kTagRecordsProperty[] = "records";
const char kTagSupportedProtocolProperty[] = "supportedProtocol";
const char kTagSupportedTechnologiesProperty[] = "supportedTechnologies";
const char kRecordTypeProperty[] = "type";
// Tag types.
const char kTagType1[] = "TYPE-1";
const char kTagType2[] = "TYPE-2";
const char kTagType3[] = "TYPE-3";
const char kTagType4[] = "TYPE-4";
const char kTagTypeUnknown[] = "UNKNOWN";
// NFC transfer protocols.
const char kTagProtocolFelica[] = "FELICA";
const char kTagProtocolIsoDep[] = "ISO-DEP";
const char kTagProtocolJewel[] = "JEWEL";
const char kTagProtocolMifare[] = "MIFARE";
const char kTagProtocolNfcDep[] = "NFC-DEP";
const char kTagProtocolUnknown[] = "UNKNOWN";
// NFC tag technologies.
const char kTagTechnologyNfcA[] = "NFC-A";
const char kTagTechnologyNfcB[] = "NFC-B";
const char kTagTechnologyNfcF[] = "NFC-F";
const char kTagTechnologyNfcV[] = "NFC-V";
const char kTagTechnologyIsoDep[] = "ISO-DEP";
const char kTagTechnologyNdef[] = "NDEF";
// NDEF types.
const char kTypeHandoverCarrier[] = "HANDOVER_CARRIER";
const char kTypeHandoverRequest[] = "HANDOVER_REQUEST";
const char kTypeHandoverSelect[] = "HANDOVER_SELECT";
const char kTypeSmartPoster[] = "SMART_POSTER";
const char kTypeText[] = "TEXT";
const char kTypeURI[] = "URI";
const char kTypeUnknown[] = "UNKNOWN";
// JavaScript callback constants.
const char kInitializeCallback[] = "initialize";
const char kSetAdapterPowerCallback[] = "setAdapterPower";
const char kSetAdapterPollingCallback[] = "setAdapterPolling";
const char kSubmitRecordFormCallback[] = "submitRecordForm";
// Constants for JavaScript functions that we can call.
const char kOnNfcAdapterInfoChangedFunction[] =
"nfcDebug.NfcDebugUI.onNfcAdapterInfoChanged";
const char kOnNfcAvailabilityDeterminedFunction[] =
"nfcDebug.NfcDebugUI.onNfcAvailabilityDetermined";
const char kOnNfcPeerDeviceInfoChangedFunction[] =
"nfcDebug.NfcDebugUI.onNfcPeerDeviceInfoChanged";
const char kOnNfcTagInfoChangedFunction[] =
"nfcDebug.NfcDebugUI.onNfcTagInfoChanged";
const char kOnSetAdapterPollingFailedFunction[] =
"nfcDebug.NfcDebugUI.onSetAdapterPollingFailed";
const char kOnSetAdapterPowerFailedFunction[] =
"nfcDebug.NfcDebugUI.onSetAdapterPowerFailed";
const char kOnSubmitRecordFormFailedFunction[] =
"nfcDebug.NfcDebugUI.onSubmitRecordFormFailed";
std::string RecordTypeToString(NfcNdefRecord::Type type) {
switch (type) {
case NfcNdefRecord::kTypeHandoverCarrier:
return kTypeHandoverCarrier;
case NfcNdefRecord::kTypeHandoverRequest:
return kTypeHandoverRequest;
case NfcNdefRecord::kTypeHandoverSelect:
return kTypeHandoverSelect;
case NfcNdefRecord::kTypeSmartPoster:
return kTypeSmartPoster;
case NfcNdefRecord::kTypeText:
return kTypeText;
case NfcNdefRecord::kTypeURI:
return kTypeURI;
case NfcNdefRecord::kTypeUnknown:
return kTypeUnknown;
}
return kTypeUnknown;
}
NfcNdefRecord::Type RecordTypeStringValueToEnum(const std::string& type) {
if (type == kTypeHandoverCarrier)
return NfcNdefRecord::kTypeHandoverCarrier;
if (type == kTypeHandoverRequest)
return NfcNdefRecord::kTypeHandoverRequest;
if (type == kTypeHandoverSelect)
return NfcNdefRecord::kTypeHandoverSelect;
if (type == kTypeSmartPoster)
return NfcNdefRecord::kTypeSmartPoster;
if (type == kTypeText)
return NfcNdefRecord::kTypeText;
if (type == kTypeURI)
return NfcNdefRecord::kTypeURI;
return NfcNdefRecord::kTypeUnknown;
}
std::string TagTypeToString(NfcTag::TagType type) {
switch (type) {
case NfcTag::kTagType1:
return kTagType1;
case NfcTag::kTagType2:
return kTagType2;
case NfcTag::kTagType3:
return kTagType3;
case NfcTag::kTagType4:
return kTagType4;
case NfcTag::kTagTypeUnknown:
return kTagTypeUnknown;
}
return kTagTypeUnknown;
}
std::string TagProtocolToString(NfcTag::Protocol protocol) {
switch (protocol) {
case NfcTag::kProtocolFelica:
return kTagProtocolFelica;
case NfcTag::kProtocolIsoDep:
return kTagProtocolIsoDep;
case NfcTag::kProtocolJewel:
return kTagProtocolJewel;
case NfcTag::kProtocolMifare:
return kTagProtocolMifare;
case NfcTag::kProtocolNfcDep:
return kTagProtocolNfcDep;
case NfcTag::kProtocolUnknown:
return kTagProtocolUnknown;
}
return kTagProtocolUnknown;
}
// content::WebUIMessageHandler implementation for this page.
class NfcDebugMessageHandler : public content::WebUIMessageHandler,
public NfcAdapter::Observer,
public NfcNdefTagTechnology::Observer,
public NfcPeer::Observer,
public NfcTag::Observer {
public:
NfcDebugMessageHandler();
~NfcDebugMessageHandler() override;
// WebUIMessageHandler implementation.
void RegisterMessages() override;
// NfcAdapter::Observer overrides.
void AdapterPresentChanged(NfcAdapter* adapter, bool present) override;
void AdapterPoweredChanged(NfcAdapter* adapter, bool powered) override;
void AdapterPollingChanged(NfcAdapter* adapter, bool polling) override;
void TagFound(NfcAdapter* adapter, NfcTag* tag) override;
void TagLost(NfcAdapter* adapter, NfcTag* tag) override;
void PeerFound(NfcAdapter* adaper, NfcPeer* peer) override;
void PeerLost(NfcAdapter* adapter, NfcPeer* peer) override;
// NfcNdefTagTechnology::Observer override.
void RecordReceived(NfcTag* tag, const NfcNdefRecord* record) override;
// NfcPeer::Observer override.
void RecordReceived(NfcPeer* peer, const NfcNdefRecord* record) override;
// NfcTag::Observer override.
void TagReady(NfcTag* tag) override;
private:
// Called by the UI when the page loads. This method requests information
// about NFC availability on the current platform and requests the underlying
// Adapter object. The UI is notified once the information is available.
void Initialize(const base::ListValue* args);
// Called by the UI to toggle the adapter power. |args| will contain one
// boolean that indicates whether the power should be set to ON or OFF.
void SetAdapterPower(const base::ListValue* args);
void OnSetAdapterPowerError();
// Called by the UI set the adapter's poll status. |args| will contain one
// boolean that indicates whether polling should be started or stopped.
void SetAdapterPolling(const base::ListValue* args);
void OnSetAdapterPollingError();
// Called by the UI to push an NDEF record to a remote device or tag. |args|
// will contain one dictionary that contains the record data.
void SubmitRecordForm(const base::ListValue* args);
void OnSubmitRecordFormFailed(const std::string& error_message);
// Callback passed to NfcAdapterFactory::GetAdapter.
void OnGetAdapter(scoped_refptr<NfcAdapter> adapter);
// Stores the properties of the NFC adapter in |out|, mapping these to keys
// that will be read by JS.
void GetAdapterProperties(base::DictionaryValue* out);
// Stores the properties of the NFC peer in |out|, mapping these to keys
// that will be read by JS. |out| will not be modified, if no peer is known.
void GetPeerProperties(base::DictionaryValue* out);
// Stores the properties of the NFC tag in |out|, mapping these to keys
// that will be read by JS. |out| will not be modified, if no tag is known.
void GetTagProperties(base::DictionaryValue* out);
// Returns the records in |message| by populating |out|, in which
// they have been converted to a JS friendly format.
void GetRecordList(const NfcNdefMessage& message, base::ListValue* out);
// Updates the data displayed in the UI for the current adapter.
void UpdateAdapterInfo();
// Updates the data displayed in the UI for the current peer.
void UpdatePeerInfo();
// Updates the data displayed in the UI for the current tag.
void UpdateTagInfo();
// The NfcAdapter object.
scoped_refptr<NfcAdapter> nfc_adapter_;
// The cached identifier of the most recent NFC peer device found.
std::string peer_identifier_;
// The cached identifier of the most recent NFC tag found.
std::string tag_identifier_;
DISALLOW_COPY_AND_ASSIGN(NfcDebugMessageHandler);
};
NfcDebugMessageHandler::NfcDebugMessageHandler() {
}
NfcDebugMessageHandler::~NfcDebugMessageHandler() {
if (!nfc_adapter_.get())
return;
nfc_adapter_->RemoveObserver(this);
if (!peer_identifier_.empty()) {
NfcPeer* peer = nfc_adapter_->GetPeer(peer_identifier_);
if (peer)
peer->RemoveObserver(this);
}
if (!tag_identifier_.empty()) {
NfcTag* tag = nfc_adapter_->GetTag(tag_identifier_);
if (tag)
tag->RemoveObserver(this);
}
}
void NfcDebugMessageHandler::AdapterPresentChanged(
NfcAdapter* adapter,
bool present) {
UpdateAdapterInfo();
}
void NfcDebugMessageHandler::AdapterPoweredChanged(
NfcAdapter* adapter,
bool powered) {
UpdateAdapterInfo();
}
void NfcDebugMessageHandler::AdapterPollingChanged(
NfcAdapter* adapter,
bool polling) {
UpdateAdapterInfo();
}
void NfcDebugMessageHandler::TagFound(NfcAdapter* adapter, NfcTag* tag) {
VLOG(1) << "Found NFC tag: " << tag->GetIdentifier();
tag->AddObserver(this);
tag_identifier_ = tag->GetIdentifier();
tag->GetNdefTagTechnology()->AddObserver(this);
UpdateAdapterInfo();
UpdateTagInfo();
}
void NfcDebugMessageHandler::TagLost(NfcAdapter*adapter, NfcTag* tag) {
VLOG(1) << "Lost NFC tag: " << tag->GetIdentifier();
tag->RemoveObserver(this);
tag->GetNdefTagTechnology()->RemoveObserver(this);
tag_identifier_.clear();
UpdateAdapterInfo();
UpdateTagInfo();
}
void NfcDebugMessageHandler::PeerFound(NfcAdapter* adaper, NfcPeer* peer) {
VLOG(1) << "Found NFC peer device: " << peer->GetIdentifier();
peer->AddObserver(this);
peer_identifier_ = peer->GetIdentifier();
UpdateAdapterInfo();
UpdatePeerInfo();
}
void NfcDebugMessageHandler::PeerLost(NfcAdapter* adapter, NfcPeer* peer) {
VLOG(1) << "Lost NFC peer device: " << peer->GetIdentifier();
peer->RemoveObserver(this);
peer_identifier_.clear();
UpdateAdapterInfo();
UpdatePeerInfo();
}
void NfcDebugMessageHandler::RecordReceived(
NfcTag* tag,
const NfcNdefRecord* record) {
if (tag->GetIdentifier() != tag_identifier_) {
LOG(WARNING) << "Records received from unknown tag: "
<< tag->GetIdentifier();
return;
}
UpdateTagInfo();
}
void NfcDebugMessageHandler::RecordReceived(
NfcPeer* peer,
const NfcNdefRecord* record) {
if (peer->GetIdentifier() != peer_identifier_) {
LOG(WARNING) << "Records received from unknown peer: "
<< peer->GetIdentifier();
return;
}
UpdatePeerInfo();
}
void NfcDebugMessageHandler::TagReady(NfcTag* tag) {
if (tag_identifier_ != tag->GetIdentifier()) {
LOG(WARNING) << "Unknown tag became ready: " << tag->GetIdentifier();
return;
}
VLOG(1) << "Tag ready: " << tag->GetIdentifier();
UpdateTagInfo();
}
void NfcDebugMessageHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
kInitializeCallback,
base::Bind(&NfcDebugMessageHandler::Initialize,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
kSetAdapterPowerCallback,
base::Bind(&NfcDebugMessageHandler::SetAdapterPower,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
kSetAdapterPollingCallback,
base::Bind(&NfcDebugMessageHandler::SetAdapterPolling,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
kSubmitRecordFormCallback,
base::Bind(&NfcDebugMessageHandler::SubmitRecordForm,
base::Unretained(this)));
}
void NfcDebugMessageHandler::Initialize(const base::ListValue* args) {
bool nfc_available = NfcAdapterFactory::IsNfcAvailable();
base::FundamentalValue available(nfc_available);
web_ui()->CallJavascriptFunction(kOnNfcAvailabilityDeterminedFunction,
available);
if (!nfc_available) {
LOG(WARNING) << "NFC is not available on current platform.";
return;
}
NfcAdapterFactory::GetAdapter(
base::Bind(&NfcDebugMessageHandler::OnGetAdapter,
base::Unretained(this)));
}
void NfcDebugMessageHandler::SetAdapterPower(const base::ListValue* args) {
DCHECK(1 == args->GetSize());
DCHECK(nfc_adapter_.get());
bool powered;
args->GetBoolean(0, &powered);
VLOG(1) << "Setting adapter power: " << powered;
nfc_adapter_->SetPowered(
powered, base::Bind(&base::DoNothing),
base::Bind(&NfcDebugMessageHandler::OnSetAdapterPowerError,
base::Unretained(this)));
}
void NfcDebugMessageHandler::OnSetAdapterPowerError() {
LOG(ERROR) << "Failed to set NFC adapter power.";
web_ui()->CallJavascriptFunction(kOnSetAdapterPowerFailedFunction);
}
void NfcDebugMessageHandler::SetAdapterPolling(const base::ListValue* args) {
DCHECK(1 == args->GetSize());
DCHECK(nfc_adapter_.get());
bool start = false;
bool result = args->GetBoolean(0, &start);
DCHECK(result);
if (start) {
VLOG(1) << "Starting NFC poll loop.";
nfc_adapter_->StartPolling(
base::Bind(&base::DoNothing),
base::Bind(&NfcDebugMessageHandler::OnSetAdapterPollingError,
base::Unretained(this)));
} else {
VLOG(1) << "Stopping NFC poll loop.";
nfc_adapter_->StopPolling(
base::Bind(&base::DoNothing),
base::Bind(&NfcDebugMessageHandler::OnSetAdapterPollingError,
base::Unretained(this)));
}
}
void NfcDebugMessageHandler::OnSetAdapterPollingError() {
LOG(ERROR) << "Failed to start/stop polling.";
web_ui()->CallJavascriptFunction(kOnSetAdapterPollingFailedFunction);
}
void NfcDebugMessageHandler::SubmitRecordForm(const base::ListValue* args) {
DCHECK(1 == args->GetSize());
DCHECK(nfc_adapter_.get());
const base::DictionaryValue* record_data_const = NULL;
if (!args->GetDictionary(0, &record_data_const)) {
NOTREACHED();
return;
}
if (peer_identifier_.empty() && tag_identifier_.empty()) {
OnSubmitRecordFormFailed("No peer or tag present.");
return;
}
std::string type;
if (!record_data_const->GetString(kRecordTypeProperty, &type)) {
OnSubmitRecordFormFailed("Record type not provided.");
return;
}
base::DictionaryValue* record_data = record_data_const->DeepCopy();
record_data->Remove(kRecordTypeProperty, NULL);
// Convert the "targetSize" field to a double, in case JS stored it as an
// integer.
int target_size;
if (record_data->GetInteger(NfcNdefRecord::kFieldTargetSize, &target_size)) {
record_data->SetDouble(NfcNdefRecord::kFieldTargetSize,
static_cast<double>(target_size));
}
NfcNdefRecord record;
if (!record.Populate(RecordTypeStringValueToEnum(type), record_data)) {
OnSubmitRecordFormFailed("Invalid record data provided. Missing required "
"fields?");
return;
}
if (!peer_identifier_.empty()) {
NfcPeer* peer = nfc_adapter_->GetPeer(peer_identifier_);
if (!peer) {
OnSubmitRecordFormFailed("The current NFC adapter doesn't seem to know "
"about peer: " + peer_identifier_);
return;
}
NfcNdefMessage message;
message.AddRecord(&record);
peer->PushNdef(message,
base::Bind(&base::DoNothing),
base::Bind(&NfcDebugMessageHandler::OnSubmitRecordFormFailed,
base::Unretained(this),
"Failed to push NDEF record."));
return;
}
NfcTag* tag = nfc_adapter_->GetTag(tag_identifier_);
if (!tag) {
OnSubmitRecordFormFailed("The current NFC tag doesn't seem to known about "
"tag: " + tag_identifier_);
return;
}
NfcNdefMessage message;
message.AddRecord(&record);
tag->GetNdefTagTechnology()->WriteNdef(
message,
base::Bind(&base::DoNothing),
base::Bind(&NfcDebugMessageHandler::OnSubmitRecordFormFailed,
base::Unretained(this),
"Failed to write NDEF record."));
}
void NfcDebugMessageHandler::OnSubmitRecordFormFailed(
const std::string& error_message) {
LOG(ERROR) << "SubmitRecordForm failed: " << error_message;
web_ui()->CallJavascriptFunction(kOnSubmitRecordFormFailedFunction,
base::StringValue(error_message));
}
void NfcDebugMessageHandler::OnGetAdapter(
scoped_refptr<NfcAdapter> adapter) {
if (nfc_adapter_.get())
return;
nfc_adapter_ = adapter;
nfc_adapter_->AddObserver(this);
UpdateAdapterInfo();
NfcAdapter::PeerList peers;
nfc_adapter_->GetPeers(&peers);
for (NfcAdapter::PeerList::const_iterator iter = peers.begin();
iter != peers.end(); ++iter) {
PeerFound(nfc_adapter_.get(), *iter);
}
NfcAdapter::TagList tags;
nfc_adapter_->GetTags(&tags);
for (NfcAdapter::TagList::const_iterator iter = tags.begin();
iter != tags.end(); ++iter) {
TagFound(nfc_adapter_.get(), *iter);
}
}
void NfcDebugMessageHandler::GetAdapterProperties(
base::DictionaryValue* out) {
if (!nfc_adapter_.get()) {
VLOG(1) << "NFC adapter hasn't been received yet.";
return;
}
out->SetBoolean(kAdapterPresentProperty, nfc_adapter_->IsPresent());
out->SetBoolean(kAdapterPollingProperty, nfc_adapter_->IsPolling());
out->SetBoolean(kAdapterPoweredProperty, nfc_adapter_->IsPowered());
NfcAdapter::PeerList peers;
nfc_adapter_->GetPeers(&peers);
out->SetInteger(kAdapterPeersProperty, static_cast<int>(peers.size()));
NfcAdapter::TagList tags;
nfc_adapter_->GetTags(&tags);
out->SetInteger(kAdapterTagsProperty, static_cast<int>(tags.size()));
}
void NfcDebugMessageHandler::GetPeerProperties(base::DictionaryValue* out) {
if (peer_identifier_.empty()) {
VLOG(1) << "No known peer exists.";
return;
}
if (!nfc_adapter_.get()) {
VLOG(1) << "NFC adapter hasn't been received yet.";
return;
}
NfcPeer* peer = nfc_adapter_->GetPeer(peer_identifier_);
if (!peer) {
LOG(ERROR) << "The current NFC adapter doesn't seem to know about peer: "
<< peer_identifier_;
return;
}
out->SetString(kPeerIdentifierProperty, peer_identifier_);
base::ListValue* records = new base::ListValue();
GetRecordList(peer->GetNdefMessage(), records);
out->Set(kPeerRecordsProperty, records);
}
void NfcDebugMessageHandler::GetTagProperties(base::DictionaryValue* out) {
if (tag_identifier_.empty()) {
VLOG(1) << "No known tag exists.";
return;
}
if (!nfc_adapter_.get()) {
VLOG(1) << "NFC adapter hasn't been received yet.";
return;
}
NfcTag* tag = nfc_adapter_->GetTag(tag_identifier_);
if (!tag) {
LOG(ERROR) << "The current NFC adapter doesn't seem to know about tag: "
<< tag_identifier_;
return;
}
out->SetString(kTagIdentifierProperty, tag_identifier_);
out->SetString(kTagTypeProperty, TagTypeToString(tag->GetType()));
out->SetBoolean(kTagReadOnlyProperty, tag->IsReadOnly());
out->SetString(kTagSupportedProtocolProperty,
TagProtocolToString(tag->GetSupportedProtocol()));
base::ListValue* technologies = new base::ListValue();
NfcTagTechnology::TechnologyTypeMask technology_mask =
tag->GetSupportedTechnologies();
if (technology_mask & NfcTagTechnology::kTechnologyTypeNfcA)
technologies->AppendString(kTagTechnologyNfcA);
if (technology_mask & NfcTagTechnology::kTechnologyTypeNfcB)
technologies->AppendString(kTagTechnologyNfcB);
if (technology_mask & NfcTagTechnology::kTechnologyTypeNfcF)
technologies->AppendString(kTagTechnologyNfcF);
if (technology_mask & NfcTagTechnology::kTechnologyTypeNfcV)
technologies->AppendString(kTagTechnologyNfcV);
if (technology_mask & NfcTagTechnology::kTechnologyTypeIsoDep)
technologies->AppendString(kTagTechnologyIsoDep);
if (technology_mask & NfcTagTechnology::kTechnologyTypeNdef)
technologies->AppendString(kTagTechnologyNdef);
out->Set(kTagSupportedTechnologiesProperty, technologies);
base::ListValue* records = new base::ListValue();
GetRecordList(tag->GetNdefTagTechnology()->GetNdefMessage(), records);
out->Set(kTagRecordsProperty, records);
}
void NfcDebugMessageHandler::GetRecordList(const NfcNdefMessage& message,
base::ListValue* out) {
for (NfcNdefMessage::RecordList::const_iterator iter =
message.records().begin();
iter != message.records().end(); ++iter) {
const NfcNdefRecord* record = (*iter);
base::DictionaryValue* record_data = record->data().DeepCopy();
record_data->SetString(kRecordTypeProperty,
RecordTypeToString(record->type()));
out->Append(record_data);
}
}
void NfcDebugMessageHandler::UpdateAdapterInfo() {
base::DictionaryValue data;
GetAdapterProperties(&data);
web_ui()->CallJavascriptFunction(kOnNfcAdapterInfoChangedFunction, data);
}
void NfcDebugMessageHandler::UpdatePeerInfo() {
base::DictionaryValue data;
GetPeerProperties(&data);
web_ui()->CallJavascriptFunction(kOnNfcPeerDeviceInfoChangedFunction, data);
}
void NfcDebugMessageHandler::UpdateTagInfo() {
base::DictionaryValue data;
GetTagProperties(&data);
web_ui()->CallJavascriptFunction(kOnNfcTagInfoChangedFunction, data);
}
} // namespace
NfcDebugUI::NfcDebugUI(content::WebUI* web_ui)
: content::WebUIController(web_ui) {
web_ui->AddMessageHandler(new NfcDebugMessageHandler());
content::WebUIDataSource* html_source =
content::WebUIDataSource::Create(chrome::kChromeUINfcDebugHost);
html_source->AddLocalizedString("titleText", IDS_NFC_DEBUG_TITLE);
html_source->AddLocalizedString("notSupportedText",
IDS_NFC_DEBUG_NOT_SUPPORTED);
html_source->AddLocalizedString("adapterHeaderText",
IDS_NFC_DEBUG_ADAPTER_HEADER);
html_source->AddLocalizedString("adapterPowerOnText",
IDS_NFC_DEBUG_ADAPTER_POWER_ON);
html_source->AddLocalizedString("adapterPowerOffText",
IDS_NFC_DEBUG_ADAPTER_POWER_OFF);
html_source->AddLocalizedString("adapterStartPollText",
IDS_NFC_DEBUG_ADAPTER_START_POLL);
html_source->AddLocalizedString("adapterStopPollText",
IDS_NFC_DEBUG_ADAPTER_STOP_POLL);
html_source->AddLocalizedString("ndefFormHeaderText",
IDS_NFC_DEBUG_NDEF_FORM_HEADER);
html_source->AddLocalizedString("ndefFormTypeTextText",
IDS_NFC_DEBUG_NDEF_FORM_TYPE_TEXT);
html_source->AddLocalizedString("ndefFormTypeUriText",
IDS_NFC_DEBUG_NDEF_FORM_TYPE_URI);
html_source->AddLocalizedString("ndefFormTypeSmartPosterText",
IDS_NFC_DEBUG_NDEF_FORM_TYPE_SMART_POSTER);
html_source->AddLocalizedString("ndefFormWriteButtonText",
IDS_NFC_DEBUG_NDEF_FORM_WRITE_BUTTON);
html_source->AddLocalizedString("ndefFormFieldTextText",
IDS_NFC_DEBUG_NDEF_FORM_FIELD_TEXT);
html_source->AddLocalizedString("ndefFormFieldEncodingText",
IDS_NFC_DEBUG_NDEF_FORM_FIELD_ENCODING);
html_source->AddLocalizedString("ndefFormFieldLanguageCodeText",
IDS_NFC_DEBUG_NDEF_FORM_FIELD_LANGUAGE_CODE);
html_source->AddLocalizedString("ndefFormFieldUriText",
IDS_NFC_DEBUG_NDEF_FORM_FIELD_URI);
html_source->AddLocalizedString("ndefFormFieldMimeTypeText",
IDS_NFC_DEBUG_NDEF_FORM_FIELD_MIME_TYPE);
html_source->AddLocalizedString("ndefFormFieldTargetSizeText",
IDS_NFC_DEBUG_NDEF_FORM_FIELD_TARGET_SIZE);
html_source->AddLocalizedString("ndefFormFieldTitleTextText",
IDS_NFC_DEBUG_NDEF_FORM_FIELD_TITLE_TEXT);
html_source->AddLocalizedString("ndefFormFieldTitleEncodingText",
IDS_NFC_DEBUG_NDEF_FORM_FIELD_TITLE_ENCODING);
html_source->AddLocalizedString(
"ndefFormFieldTitleLanguageCodeText",
IDS_NFC_DEBUG_NDEF_FORM_FIELD_TITLE_LANGUAGE_CODE);
html_source->AddLocalizedString("ndefFormPushButtonText",
IDS_NFC_DEBUG_NDEF_FORM_PUSH_BUTTON);
html_source->AddLocalizedString("nfcPeerHeaderText",
IDS_NFC_DEBUG_NFC_PEER_HEADER);
html_source->AddLocalizedString("nfcTagHeaderText",
IDS_NFC_DEBUG_NFC_TAG_HEADER);
html_source->AddLocalizedString("recordsHeaderText",
IDS_NFC_DEBUG_RECORDS_HEADER);
html_source->AddLocalizedString("errorFailedToSetPowerText",
IDS_NFC_DEBUG_ERROR_FAILED_TO_SET_POWER);
html_source->AddLocalizedString("errorFailedToSetPollingText",
IDS_NFC_DEBUG_ERROR_FAILED_TO_SET_POLLING);
html_source->AddLocalizedString("errorFailedToSubmitPrefixText",
IDS_NFC_DEBUG_ERROR_FAILED_TO_SUBMIT_PREFIX);
html_source->SetJsonPath("strings.js");
// Add required resources.
html_source->AddResourcePath("nfc_debug.css", IDR_NFC_DEBUG_CSS);
html_source->AddResourcePath("nfc_debug.js", IDR_NFC_DEBUG_JS);
html_source->SetDefaultResource(IDR_NFC_DEBUG_HTML);
Profile* profile = Profile::FromWebUI(web_ui);
content::WebUIDataSource::Add(profile, html_source);
}
NfcDebugUI::~NfcDebugUI() {
}
} // namespace chromeos