| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2008 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 return false; | 114 return false; |
| 115 } | 115 } |
| 116 | 116 |
| 117 void ConditionEventListener::handleEvent(ScriptExecutionContext*, Event* event) | 117 void ConditionEventListener::handleEvent(ScriptExecutionContext*, Event* event) |
| 118 { | 118 { |
| 119 if (!m_animation) | 119 if (!m_animation) |
| 120 return; | 120 return; |
| 121 m_animation->handleConditionEvent(event, m_condition); | 121 m_animation->handleConditionEvent(event, m_condition); |
| 122 } | 122 } |
| 123 | 123 |
| 124 SVGSMILElement::Condition::Condition(Type type, BeginOrEnd beginOrEnd, const Str
ing& baseID, const String& name, SMILTime offset) | 124 SVGSMILElement::Condition::Condition(Type type, BeginOrEnd beginOrEnd, const Str
ing& baseID, const String& name, SMILTime offset, int repeat) |
| 125 : m_type(type) | 125 : m_type(type) |
| 126 , m_beginOrEnd(beginOrEnd) | 126 , m_beginOrEnd(beginOrEnd) |
| 127 , m_baseID(baseID) | 127 , m_baseID(baseID) |
| 128 , m_name(name) | 128 , m_name(name) |
| 129 , m_offset(offset) | 129 , m_offset(offset) |
| 130 , m_repeat(repeat) |
| 130 { | 131 { |
| 131 } | 132 } |
| 132 | 133 |
| 133 SVGSMILElement::SVGSMILElement(const QualifiedName& tagName, Document& doc) | 134 SVGSMILElement::SVGSMILElement(const QualifiedName& tagName, Document& doc) |
| 134 : SVGElement(tagName, doc) | 135 : SVGElement(tagName, doc) |
| 135 , m_attributeName(anyQName()) | 136 , m_attributeName(anyQName()) |
| 136 , m_targetElement(0) | 137 , m_targetElement(0) |
| 137 , m_conditionsConnected(false) | 138 , m_conditionsConnected(false) |
| 138 , m_hasEndEventConditions(false) | 139 , m_hasEndEventConditions(false) |
| 139 , m_isWaitingForFirstInterval(true) | 140 , m_isWaitingForFirstInterval(true) |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 static void sortTimeList(Vector<SMILTimeWithOrigin>& timeList) | 367 static void sortTimeList(Vector<SMILTimeWithOrigin>& timeList) |
| 367 { | 368 { |
| 368 std::sort(timeList.begin(), timeList.end()); | 369 std::sort(timeList.begin(), timeList.end()); |
| 369 } | 370 } |
| 370 | 371 |
| 371 bool SVGSMILElement::parseCondition(const String& value, BeginOrEnd beginOrEnd) | 372 bool SVGSMILElement::parseCondition(const String& value, BeginOrEnd beginOrEnd) |
| 372 { | 373 { |
| 373 String parseString = value.stripWhiteSpace(); | 374 String parseString = value.stripWhiteSpace(); |
| 374 | 375 |
| 375 double sign = 1.; | 376 double sign = 1.; |
| 377 bool ok; |
| 376 size_t pos = parseString.find('+'); | 378 size_t pos = parseString.find('+'); |
| 377 if (pos == notFound) { | 379 if (pos == notFound) { |
| 378 pos = parseString.find('-'); | 380 pos = parseString.find('-'); |
| 379 if (pos != notFound) | 381 if (pos != notFound) |
| 380 sign = -1.; | 382 sign = -1.; |
| 381 } | 383 } |
| 382 String conditionString; | 384 String conditionString; |
| 383 SMILTime offset = 0; | 385 SMILTime offset = 0; |
| 384 if (pos == notFound) | 386 if (pos == notFound) |
| 385 conditionString = parseString; | 387 conditionString = parseString; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 400 if (pos == notFound) | 402 if (pos == notFound) |
| 401 nameString = conditionString; | 403 nameString = conditionString; |
| 402 else { | 404 else { |
| 403 baseID = conditionString.left(pos); | 405 baseID = conditionString.left(pos); |
| 404 nameString = conditionString.substring(pos + 1); | 406 nameString = conditionString.substring(pos + 1); |
| 405 } | 407 } |
| 406 if (nameString.isEmpty()) | 408 if (nameString.isEmpty()) |
| 407 return false; | 409 return false; |
| 408 | 410 |
| 409 Condition::Type type; | 411 Condition::Type type; |
| 410 if (nameString == "begin" || nameString == "end") { | 412 int repeat = -1; |
| 413 if (nameString.startsWith("repeat(") && nameString.endsWith(')')) { |
| 414 repeat = nameString.substring(7, nameString.length() - 8).toUIntStrict(&
ok); |
| 415 if (!ok) |
| 416 return false; |
| 417 nameString = "repeatn"; |
| 418 type = Condition::EventBase; |
| 419 } else if (nameString == "begin" || nameString == "end") { |
| 411 if (baseID.isEmpty()) | 420 if (baseID.isEmpty()) |
| 412 return false; | 421 return false; |
| 413 type = Condition::Syncbase; | 422 type = Condition::Syncbase; |
| 414 } else if (nameString.startsWith("accesskey(")) { | 423 } else if (nameString.startsWith("accesskey(")) { |
| 415 // FIXME: accesskey() support. | 424 // FIXME: accesskey() support. |
| 416 type = Condition::AccessKey; | 425 type = Condition::AccessKey; |
| 417 } else | 426 } else |
| 418 type = Condition::EventBase; | 427 type = Condition::EventBase; |
| 419 | 428 |
| 420 m_conditions.append(Condition(type, beginOrEnd, baseID, nameString, offset))
; | 429 m_conditions.append(Condition(type, beginOrEnd, baseID, nameString, offset,
repeat)); |
| 421 | 430 |
| 422 if (type == Condition::EventBase && beginOrEnd == End) | 431 if (type == Condition::EventBase && beginOrEnd == End) |
| 423 m_hasEndEventConditions = true; | 432 m_hasEndEventConditions = true; |
| 424 | 433 |
| 425 return true; | 434 return true; |
| 426 } | 435 } |
| 427 | 436 |
| 428 bool SVGSMILElement::isSMILElement(Node* node) | 437 bool SVGSMILElement::isSMILElement(Node* node) |
| 429 { | 438 { |
| 430 if (!node) | 439 if (!node) |
| (...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1204 m_timeDependents.add(animation); | 1213 m_timeDependents.add(animation); |
| 1205 if (m_intervalBegin.isFinite()) | 1214 if (m_intervalBegin.isFinite()) |
| 1206 animation->createInstanceTimesFromSyncbase(this, NewInterval); | 1215 animation->createInstanceTimesFromSyncbase(this, NewInterval); |
| 1207 } | 1216 } |
| 1208 | 1217 |
| 1209 void SVGSMILElement::removeTimeDependent(SVGSMILElement* animation) | 1218 void SVGSMILElement::removeTimeDependent(SVGSMILElement* animation) |
| 1210 { | 1219 { |
| 1211 m_timeDependents.remove(animation); | 1220 m_timeDependents.remove(animation); |
| 1212 } | 1221 } |
| 1213 | 1222 |
| 1214 void SVGSMILElement::handleConditionEvent(Event*, Condition* condition) | 1223 void SVGSMILElement::handleConditionEvent(Event* event, Condition* condition) |
| 1215 { | 1224 { |
| 1225 if (event->type() == "repeatn" && event->repeat() != condition->m_repeat) |
| 1226 return; |
| 1227 |
| 1216 SMILTime elapsed = this->elapsed(); | 1228 SMILTime elapsed = this->elapsed(); |
| 1217 if (condition->m_beginOrEnd == Begin) | 1229 if (condition->m_beginOrEnd == Begin) |
| 1218 addBeginTime(elapsed, elapsed + condition->m_offset); | 1230 addBeginTime(elapsed, elapsed + condition->m_offset); |
| 1219 else | 1231 else |
| 1220 addEndTime(elapsed, elapsed + condition->m_offset); | 1232 addEndTime(elapsed, elapsed + condition->m_offset); |
| 1221 } | 1233 } |
| 1222 | 1234 |
| 1223 void SVGSMILElement::beginByLinkActivation() | 1235 void SVGSMILElement::beginByLinkActivation() |
| 1224 { | 1236 { |
| 1225 SMILTime elapsed = this->elapsed(); | 1237 SMILTime elapsed = this->elapsed(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1239 smilRepeatNEventSender().dispatchEventSoon(this); | 1251 smilRepeatNEventSender().dispatchEventSoon(this); |
| 1240 } | 1252 } |
| 1241 | 1253 |
| 1242 void SVGSMILElement::dispatchPendingEvent(SMILEventSender* eventSender) | 1254 void SVGSMILElement::dispatchPendingEvent(SMILEventSender* eventSender) |
| 1243 { | 1255 { |
| 1244 ASSERT(eventSender == &smilEndEventSender() || eventSender == &smilBeginEven
tSender() || eventSender == &smilRepeatEventSender() || eventSender == &smilRepe
atNEventSender()); | 1256 ASSERT(eventSender == &smilEndEventSender() || eventSender == &smilBeginEven
tSender() || eventSender == &smilRepeatEventSender() || eventSender == &smilRepe
atNEventSender()); |
| 1245 const AtomicString& eventType = eventSender->eventType(); | 1257 const AtomicString& eventType = eventSender->eventType(); |
| 1246 if (eventType == "repeatn") { | 1258 if (eventType == "repeatn") { |
| 1247 unsigned repeatEventCount = m_repeatEventCountList.first(); | 1259 unsigned repeatEventCount = m_repeatEventCountList.first(); |
| 1248 m_repeatEventCountList.remove(0); | 1260 m_repeatEventCountList.remove(0); |
| 1249 dispatchEvent(Event::create(String("repeat(" + String::number(repeatEven
tCount) + ")"))); | 1261 dispatchEvent(RepeatEvent::create(eventType, repeatEventCount)); |
| 1250 } else { | 1262 } else { |
| 1251 dispatchEvent(Event::create(eventType)); | 1263 dispatchEvent(Event::create(eventType)); |
| 1252 } | 1264 } |
| 1253 } | 1265 } |
| 1254 | 1266 |
| 1255 } | 1267 } |
| OLD | NEW |