/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsDOMStringMap)
NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER // Check that mElement exists in case the unlink code is run more than once. if (tmp->mElement) { // Call back to element to null out weak reference to this object.
tmp->mElement->ClearDataset();
tmp->mElement->RemoveMutationObserver(tmp);
tmp->mElement = nullptr;
}
tmp->mExpandoAndGeneration.OwnerUnlinked();
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
nsDOMStringMap::~nsDOMStringMap() { // Check if element still exists, may have been unlinked by cycle collector. if (mElement) { // Call back to element to null out weak reference to this object.
mElement->ClearDataset();
mElement->RemoveMutationObserver(this);
}
}
// Iterate through all the attributes and add property // names corresponding to data attributes to return array. for (uint32_t i = 0; i < attrCount; ++i) { const nsAttrName* attrName = mElement->GetAttrNameAt(i); // Skip the ones that are not in the null namespace if (attrName->NamespaceID() != kNameSpaceID_None) { continue;
}
nsAutoString prop; if (!AttrToDataProp(nsDependentAtomString(attrName->LocalName()), prop)) { continue;
}
aNames.AppendElement(prop);
}
}
/** * Converts a dataset property name to the corresponding data attribute name. * (ex. aBigFish to data-a-big-fish).
*/ bool nsDOMStringMap::DataPropToAttr(const nsAString& aProp,
nsAutoString& aResult) { // aResult is an autostring, so don't worry about setting its capacity: // SetCapacity is slow even when it's a no-op and we already have enough // storage there for most cases, probably.
aResult.AppendLiteral("data-");
// Iterate property by character to form attribute name. // Return syntax error if there is a sequence of "-" followed by a character // in the range "a" to "z". // Replace capital characters with "-" followed by lower case character. // Otherwise, simply append character to attribute name. const char16_t* start = aProp.BeginReading(); const char16_t* end = aProp.EndReading(); const char16_t* cur = start; for (; cur < end; ++cur) { const char16_t* next = cur + 1; if (char16_t('-') == *cur && next < end && char16_t('a') <= *next &&
*next <= char16_t('z')) { // Syntax error if character following "-" is in range "a" to "z". returnfalse;
}
if (char16_t('A') <= *cur && *cur <= char16_t('Z')) { // Append the characters in the range [start, cur)
aResult.Append(start, cur - start); // Uncamel-case characters in the range of "A" to "Z".
aResult.Append(char16_t('-'));
aResult.Append(*cur - 'A' + 'a');
start = next; // We've already appended the thing at *cur
}
}
aResult.Append(start, cur - start);
returntrue;
}
/** * Converts a data attribute name to the corresponding dataset property name. * (ex. data-a-big-fish to aBigFish).
*/ bool nsDOMStringMap::AttrToDataProp(const nsAString& aAttr,
nsAutoString& aResult) { // If the attribute name does not begin with "data-" then it can not be // a data attribute. if (!StringBeginsWith(aAttr, u"data-"_ns)) { returnfalse;
}
// Start reading attribute from first character after "data-". const char16_t* cur = aAttr.BeginReading() + 5; const char16_t* end = aAttr.EndReading();
// Don't try to mess with aResult's capacity: the probably-no-op SetCapacity() // call is not that fast.
// Iterate through attrName by character to form property name. // If there is a sequence of "-" followed by a character in the range "a" to // "z" then replace with upper case letter. // Otherwise append character to property name. for (; cur < end; ++cur) { const char16_t* next = cur + 1; if (char16_t('-') == *cur && next < end && char16_t('a') <= *next &&
*next <= char16_t('z')) { // Upper case the lower case letters that follow a "-".
aResult.Append(*next - 'a' + 'A'); // Consume character to account for "-" character.
++cur;
} else { // Simply append character if camel case is not necessary.
aResult.Append(*cur);
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.