// removes the value aRemoveValue from the string list of white-space separated values aValueList void ChangeCSSInlineStyleTxn::RemoveValueFromListOfValues(nsAString & aValues, const nsAString & aRemoveValue) { nsAutoString classStr(aValues); // copy to work buffer nsAutoString rv(aRemoveValue); nsAutoString outString; classStr.Append(kNullCh); // put an extra null at the end PRUnichar *start = classStr.BeginWriting(); PRUnichar *end = start; while (kNullCh != *start) { while ((kNullCh != *start) && nsCRT::IsAsciiSpace(*start)) { // skip leading space start++; } end = start; while ((kNullCh != *end) && (false == nsCRT::IsAsciiSpace(*end))) { // look for space or end end++; } *end = kNullCh; // end string here if (start < end) { if (!aRemoveValue.Equals(start)) { outString.Append(start); outString.Append(PRUnichar(' ')); } } start = ++end; } aValues.Assign(outString); }
// Removes the value aRemoveValue from the string list of white-space separated // values aValueList void ChangeStyleTransaction::RemoveValueFromListOfValues( nsAString& aValues, const nsAString& aRemoveValue) { nsAutoString classStr(aValues); nsAutoString outString; // put an extra null at the end classStr.Append(kNullCh); char16_t* start = classStr.BeginWriting(); char16_t* end = start; while (kNullCh != *start) { while (kNullCh != *start && nsCRT::IsAsciiSpace(*start)) { // skip leading space start++; } end = start; while (kNullCh != *end && !nsCRT::IsAsciiSpace(*end)) { // look for space or end end++; } // end string here *end = kNullCh; if (start < end && !aRemoveValue.Equals(start)) { outString.Append(start); outString.Append(char16_t(' ')); } start = ++end; } aValues.Assign(outString); }
TEST(RuleSetTest, findBestRuleSetAndAdd_ClassThenId) { CSSTestHelper helper; helper.addCSSRules(".class#id { }"); RuleSet& ruleSet = helper.ruleSet(); AtomicString str("id"); // id is prefered over class even if class preceeds it in the selector. const TerminatedArray<RuleData>* rules = ruleSet.idRules(str); ASSERT_EQ(1u, rules->size()); AtomicString classStr("class"); ASSERT_EQ(classStr, rules->at(0).selector().value()); }
Handle<Object> ProxyFactory::createV8Proxy(jclass javaClass, jobject javaProxy) { LOGV(TAG, "create v8 proxy"); JNIEnv* env = JNIScope::getEnv(); if (!env) { LOG_JNIENV_ERROR("while creating Java proxy."); return Handle<Object>(); } ENTER_V8(V8Runtime::globalContext); Local<Function> creator; LOGV(TAG, "get proxy info"); ProxyInfo* info; GET_PROXY_INFO(javaClass, info); if (!info) { // No info has been registered for this class yet, fall back // to the binding lookup table jstring javaClassName = JNIUtil::getClassName(javaClass); Handle<Value> className = TypeConverter::javaStringToJsString(javaClassName); env->DeleteLocalRef(javaClassName); Handle<Object> exports = KrollBindings::getBinding(className->ToString()); if (exports.IsEmpty()) { String::Utf8Value classStr(className); LOGE(TAG, "Failed to find class for %s", *classStr); LOG_JNIENV_ERROR("while creating V8 Proxy."); return Handle<Object>(); } // TODO: The first value in exports should be the type that's exported // But there's probably a better way to do this Handle<Array> names = exports->GetPropertyNames(); if (names->Length() >= 1) { creator = Local<Function>::Cast(exports->Get(names->Get(0))); } } else { creator = info->v8ProxyTemplate->GetFunction(); } Local<Value> external = External::New(javaProxy); TryCatch tryCatch; Local<Object> v8Proxy = creator->NewInstance(1, &external); if (tryCatch.HasCaught()) { LOGE(TAG, "Exception thrown while creating V8 proxy."); V8Util::reportException(tryCatch); return Handle<Object>(); } // set the pointer back on the java proxy Proxy* proxy = NativeObject::Unwrap<Proxy>(v8Proxy); jlong ptr = (jlong) *(proxy->handle_); jobject javaV8Object = env->NewObject(JNIUtil::v8ObjectClass, JNIUtil::v8ObjectInitMethod, ptr); env->SetObjectField(javaProxy, JNIUtil::krollProxyKrollObjectField, javaV8Object); env->DeleteLocalRef(javaV8Object); return scope.Close(v8Proxy); }