| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google, Inc. All Rights Reserved. | 2 * Copyright (C) 2013 Google, 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 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 // thrash malloc. When we finally finish the parse the | 159 // thrash malloc. When we finally finish the parse the |
| 160 // HTMLToken will be destroyed and the VectorBuffer released. | 160 // HTMLToken will be destroyed and the VectorBuffer released. |
| 161 m_data.shrink(0); | 161 m_data.shrink(0); |
| 162 m_orAllData = 0; | 162 m_orAllData = 0; |
| 163 } | 163 } |
| 164 | 164 |
| 165 bool isUninitialized() { return m_type == Uninitialized; } | 165 bool isUninitialized() { return m_type == Uninitialized; } |
| 166 TokenType type() const { return m_type; } | 166 TokenType type() const { return m_type; } |
| 167 | 167 |
| 168 void makeEndOfFile() { | 168 void makeEndOfFile() { |
| 169 ASSERT(m_type == Uninitialized); | 169 DCHECK_EQ(m_type, Uninitialized); |
| 170 m_type = EndOfFile; | 170 m_type = EndOfFile; |
| 171 } | 171 } |
| 172 | 172 |
| 173 // Range and offset methods exposed for HTMLSourceTracker and | 173 // Range and offset methods exposed for HTMLSourceTracker and |
| 174 // HTMLViewSourceParser. | 174 // HTMLViewSourceParser. |
| 175 int startIndex() const { return m_range.start; } | 175 int startIndex() const { return m_range.start; } |
| 176 int endIndex() const { return m_range.end; } | 176 int endIndex() const { return m_range.end; } |
| 177 | 177 |
| 178 void setBaseOffset(int offset) { m_baseOffset = offset; } | 178 void setBaseOffset(int offset) { m_baseOffset = offset; } |
| 179 | 179 |
| 180 void end(int endOffset) { m_range.end = endOffset - m_baseOffset; } | 180 void end(int endOffset) { m_range.end = endOffset - m_baseOffset; } |
| 181 | 181 |
| 182 const DataVector& data() const { | 182 const DataVector& data() const { |
| 183 ASSERT(m_type == Character || m_type == Comment || m_type == StartTag || | 183 DCHECK(m_type == Character || m_type == Comment || m_type == StartTag || |
| 184 m_type == EndTag); | 184 m_type == EndTag); |
| 185 return m_data; | 185 return m_data; |
| 186 } | 186 } |
| 187 | 187 |
| 188 bool isAll8BitData() const { return (m_orAllData <= 0xff); } | 188 bool isAll8BitData() const { return (m_orAllData <= 0xff); } |
| 189 | 189 |
| 190 const DataVector& name() const { | 190 const DataVector& name() const { |
| 191 ASSERT(m_type == StartTag || m_type == EndTag || m_type == DOCTYPE); | 191 DCHECK(m_type == StartTag || m_type == EndTag || m_type == DOCTYPE); |
| 192 return m_data; | 192 return m_data; |
| 193 } | 193 } |
| 194 | 194 |
| 195 void appendToName(UChar character) { | 195 void appendToName(UChar character) { |
| 196 ASSERT(m_type == StartTag || m_type == EndTag || m_type == DOCTYPE); | 196 DCHECK(m_type == StartTag || m_type == EndTag || m_type == DOCTYPE); |
| 197 ASSERT(character); | 197 DCHECK(character); |
| 198 m_data.push_back(character); | 198 m_data.push_back(character); |
| 199 m_orAllData |= character; | 199 m_orAllData |= character; |
| 200 } | 200 } |
| 201 | 201 |
| 202 /* DOCTYPE Tokens */ | 202 /* DOCTYPE Tokens */ |
| 203 | 203 |
| 204 bool forceQuirks() const { | 204 bool forceQuirks() const { |
| 205 ASSERT(m_type == DOCTYPE); | 205 DCHECK_EQ(m_type, DOCTYPE); |
| 206 return m_doctypeData->m_forceQuirks; | 206 return m_doctypeData->m_forceQuirks; |
| 207 } | 207 } |
| 208 | 208 |
| 209 void setForceQuirks() { | 209 void setForceQuirks() { |
| 210 ASSERT(m_type == DOCTYPE); | 210 DCHECK_EQ(m_type, DOCTYPE); |
| 211 m_doctypeData->m_forceQuirks = true; | 211 m_doctypeData->m_forceQuirks = true; |
| 212 } | 212 } |
| 213 | 213 |
| 214 void beginDOCTYPE() { | 214 void beginDOCTYPE() { |
| 215 ASSERT(m_type == Uninitialized); | 215 DCHECK_EQ(m_type, Uninitialized); |
| 216 m_type = DOCTYPE; | 216 m_type = DOCTYPE; |
| 217 m_doctypeData = WTF::wrapUnique(new DoctypeData); | 217 m_doctypeData = WTF::wrapUnique(new DoctypeData); |
| 218 } | 218 } |
| 219 | 219 |
| 220 void beginDOCTYPE(UChar character) { | 220 void beginDOCTYPE(UChar character) { |
| 221 ASSERT(character); | 221 DCHECK(character); |
| 222 beginDOCTYPE(); | 222 beginDOCTYPE(); |
| 223 m_data.push_back(character); | 223 m_data.push_back(character); |
| 224 m_orAllData |= character; | 224 m_orAllData |= character; |
| 225 } | 225 } |
| 226 | 226 |
| 227 // FIXME: Distinguish between a missing public identifer and an empty one. | 227 // FIXME: Distinguish between a missing public identifer and an empty one. |
| 228 const WTF::Vector<UChar>& publicIdentifier() const { | 228 const WTF::Vector<UChar>& publicIdentifier() const { |
| 229 ASSERT(m_type == DOCTYPE); | 229 DCHECK_EQ(m_type, DOCTYPE); |
| 230 return m_doctypeData->m_publicIdentifier; | 230 return m_doctypeData->m_publicIdentifier; |
| 231 } | 231 } |
| 232 | 232 |
| 233 // FIXME: Distinguish between a missing system identifer and an empty one. | 233 // FIXME: Distinguish between a missing system identifer and an empty one. |
| 234 const WTF::Vector<UChar>& systemIdentifier() const { | 234 const WTF::Vector<UChar>& systemIdentifier() const { |
| 235 ASSERT(m_type == DOCTYPE); | 235 DCHECK_EQ(m_type, DOCTYPE); |
| 236 return m_doctypeData->m_systemIdentifier; | 236 return m_doctypeData->m_systemIdentifier; |
| 237 } | 237 } |
| 238 | 238 |
| 239 void setPublicIdentifierToEmptyString() { | 239 void setPublicIdentifierToEmptyString() { |
| 240 ASSERT(m_type == DOCTYPE); | 240 DCHECK_EQ(m_type, DOCTYPE); |
| 241 m_doctypeData->m_hasPublicIdentifier = true; | 241 m_doctypeData->m_hasPublicIdentifier = true; |
| 242 m_doctypeData->m_publicIdentifier.clear(); | 242 m_doctypeData->m_publicIdentifier.clear(); |
| 243 } | 243 } |
| 244 | 244 |
| 245 void setSystemIdentifierToEmptyString() { | 245 void setSystemIdentifierToEmptyString() { |
| 246 ASSERT(m_type == DOCTYPE); | 246 DCHECK_EQ(m_type, DOCTYPE); |
| 247 m_doctypeData->m_hasSystemIdentifier = true; | 247 m_doctypeData->m_hasSystemIdentifier = true; |
| 248 m_doctypeData->m_systemIdentifier.clear(); | 248 m_doctypeData->m_systemIdentifier.clear(); |
| 249 } | 249 } |
| 250 | 250 |
| 251 void appendToPublicIdentifier(UChar character) { | 251 void appendToPublicIdentifier(UChar character) { |
| 252 ASSERT(character); | 252 DCHECK(character); |
| 253 ASSERT(m_type == DOCTYPE); | 253 DCHECK_EQ(m_type, DOCTYPE); |
| 254 ASSERT(m_doctypeData->m_hasPublicIdentifier); | 254 DCHECK(m_doctypeData->m_hasPublicIdentifier); |
| 255 m_doctypeData->m_publicIdentifier.push_back(character); | 255 m_doctypeData->m_publicIdentifier.push_back(character); |
| 256 } | 256 } |
| 257 | 257 |
| 258 void appendToSystemIdentifier(UChar character) { | 258 void appendToSystemIdentifier(UChar character) { |
| 259 ASSERT(character); | 259 DCHECK(character); |
| 260 ASSERT(m_type == DOCTYPE); | 260 DCHECK_EQ(m_type, DOCTYPE); |
| 261 ASSERT(m_doctypeData->m_hasSystemIdentifier); | 261 DCHECK(m_doctypeData->m_hasSystemIdentifier); |
| 262 m_doctypeData->m_systemIdentifier.push_back(character); | 262 m_doctypeData->m_systemIdentifier.push_back(character); |
| 263 } | 263 } |
| 264 | 264 |
| 265 std::unique_ptr<DoctypeData> releaseDoctypeData() { | 265 std::unique_ptr<DoctypeData> releaseDoctypeData() { |
| 266 return std::move(m_doctypeData); | 266 return std::move(m_doctypeData); |
| 267 } | 267 } |
| 268 | 268 |
| 269 /* Start/End Tag Tokens */ | 269 /* Start/End Tag Tokens */ |
| 270 | 270 |
| 271 bool selfClosing() const { | 271 bool selfClosing() const { |
| 272 ASSERT(m_type == StartTag || m_type == EndTag); | 272 DCHECK(m_type == StartTag || m_type == EndTag); |
| 273 return m_selfClosing; | 273 return m_selfClosing; |
| 274 } | 274 } |
| 275 | 275 |
| 276 void setSelfClosing() { | 276 void setSelfClosing() { |
| 277 ASSERT(m_type == StartTag || m_type == EndTag); | 277 DCHECK(m_type == StartTag || m_type == EndTag); |
| 278 m_selfClosing = true; | 278 m_selfClosing = true; |
| 279 } | 279 } |
| 280 | 280 |
| 281 void beginStartTag(UChar character) { | 281 void beginStartTag(UChar character) { |
| 282 ASSERT(character); | 282 DCHECK(character); |
| 283 ASSERT(m_type == Uninitialized); | 283 DCHECK_EQ(m_type, Uninitialized); |
| 284 m_type = StartTag; | 284 m_type = StartTag; |
| 285 m_selfClosing = false; | 285 m_selfClosing = false; |
| 286 m_currentAttribute = 0; | 286 m_currentAttribute = 0; |
| 287 m_attributes.clear(); | 287 m_attributes.clear(); |
| 288 | 288 |
| 289 m_data.push_back(character); | 289 m_data.push_back(character); |
| 290 m_orAllData |= character; | 290 m_orAllData |= character; |
| 291 } | 291 } |
| 292 | 292 |
| 293 void beginEndTag(LChar character) { | 293 void beginEndTag(LChar character) { |
| 294 ASSERT(m_type == Uninitialized); | 294 DCHECK_EQ(m_type, Uninitialized); |
| 295 m_type = EndTag; | 295 m_type = EndTag; |
| 296 m_selfClosing = false; | 296 m_selfClosing = false; |
| 297 m_currentAttribute = 0; | 297 m_currentAttribute = 0; |
| 298 m_attributes.clear(); | 298 m_attributes.clear(); |
| 299 | 299 |
| 300 m_data.push_back(character); | 300 m_data.push_back(character); |
| 301 } | 301 } |
| 302 | 302 |
| 303 void beginEndTag(const Vector<LChar, 32>& characters) { | 303 void beginEndTag(const Vector<LChar, 32>& characters) { |
| 304 ASSERT(m_type == Uninitialized); | 304 DCHECK_EQ(m_type, Uninitialized); |
| 305 m_type = EndTag; | 305 m_type = EndTag; |
| 306 m_selfClosing = false; | 306 m_selfClosing = false; |
| 307 m_currentAttribute = 0; | 307 m_currentAttribute = 0; |
| 308 m_attributes.clear(); | 308 m_attributes.clear(); |
| 309 | 309 |
| 310 m_data.appendVector(characters); | 310 m_data.appendVector(characters); |
| 311 } | 311 } |
| 312 | 312 |
| 313 void addNewAttribute() { | 313 void addNewAttribute() { |
| 314 ASSERT(m_type == StartTag || m_type == EndTag); | 314 DCHECK(m_type == StartTag || m_type == EndTag); |
| 315 m_attributes.grow(m_attributes.size() + 1); | 315 m_attributes.grow(m_attributes.size() + 1); |
| 316 m_currentAttribute = &m_attributes.back(); | 316 m_currentAttribute = &m_attributes.back(); |
| 317 m_currentAttribute->mutableNameRange().clear(); | 317 m_currentAttribute->mutableNameRange().clear(); |
| 318 m_currentAttribute->mutableValueRange().clear(); | 318 m_currentAttribute->mutableValueRange().clear(); |
| 319 } | 319 } |
| 320 | 320 |
| 321 void beginAttributeName(int offset) { | 321 void beginAttributeName(int offset) { |
| 322 m_currentAttribute->mutableNameRange().start = offset - m_baseOffset; | 322 m_currentAttribute->mutableNameRange().start = offset - m_baseOffset; |
| 323 m_currentAttribute->nameRange().checkValidStart(); | 323 m_currentAttribute->nameRange().checkValidStart(); |
| 324 } | 324 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 336 m_currentAttribute->mutableValueRange().start = offset - m_baseOffset; | 336 m_currentAttribute->mutableValueRange().start = offset - m_baseOffset; |
| 337 m_currentAttribute->valueRange().checkValidStart(); | 337 m_currentAttribute->valueRange().checkValidStart(); |
| 338 } | 338 } |
| 339 | 339 |
| 340 void endAttributeValue(int offset) { | 340 void endAttributeValue(int offset) { |
| 341 m_currentAttribute->mutableValueRange().end = offset - m_baseOffset; | 341 m_currentAttribute->mutableValueRange().end = offset - m_baseOffset; |
| 342 m_currentAttribute->valueRange().checkValid(); | 342 m_currentAttribute->valueRange().checkValid(); |
| 343 } | 343 } |
| 344 | 344 |
| 345 void appendToAttributeName(UChar character) { | 345 void appendToAttributeName(UChar character) { |
| 346 ASSERT(character); | 346 DCHECK(character); |
| 347 ASSERT(m_type == StartTag || m_type == EndTag); | 347 DCHECK(m_type == StartTag || m_type == EndTag); |
| 348 m_currentAttribute->nameRange().checkValidStart(); | 348 m_currentAttribute->nameRange().checkValidStart(); |
| 349 m_currentAttribute->appendToName(character); | 349 m_currentAttribute->appendToName(character); |
| 350 } | 350 } |
| 351 | 351 |
| 352 void appendToAttributeValue(UChar character) { | 352 void appendToAttributeValue(UChar character) { |
| 353 ASSERT(character); | 353 DCHECK(character); |
| 354 ASSERT(m_type == StartTag || m_type == EndTag); | 354 DCHECK(m_type == StartTag || m_type == EndTag); |
| 355 m_currentAttribute->valueRange().checkValidStart(); | 355 m_currentAttribute->valueRange().checkValidStart(); |
| 356 m_currentAttribute->appendToValue(character); | 356 m_currentAttribute->appendToValue(character); |
| 357 } | 357 } |
| 358 | 358 |
| 359 void appendToAttributeValue(size_t i, const String& value) { | 359 void appendToAttributeValue(size_t i, const String& value) { |
| 360 ASSERT(!value.isEmpty()); | 360 DCHECK(!value.isEmpty()); |
| 361 ASSERT(m_type == StartTag || m_type == EndTag); | 361 DCHECK(m_type == StartTag || m_type == EndTag); |
| 362 m_attributes[i].appendToValue(value); | 362 m_attributes[i].appendToValue(value); |
| 363 } | 363 } |
| 364 | 364 |
| 365 const AttributeList& attributes() const { | 365 const AttributeList& attributes() const { |
| 366 ASSERT(m_type == StartTag || m_type == EndTag); | 366 DCHECK(m_type == StartTag || m_type == EndTag); |
| 367 return m_attributes; | 367 return m_attributes; |
| 368 } | 368 } |
| 369 | 369 |
| 370 const Attribute* getAttributeItem(const QualifiedName& name) const { | 370 const Attribute* getAttributeItem(const QualifiedName& name) const { |
| 371 for (unsigned i = 0; i < m_attributes.size(); ++i) { | 371 for (unsigned i = 0; i < m_attributes.size(); ++i) { |
| 372 if (m_attributes.at(i).name() == name.localName()) | 372 if (m_attributes.at(i).name() == name.localName()) |
| 373 return &m_attributes.at(i); | 373 return &m_attributes.at(i); |
| 374 } | 374 } |
| 375 return 0; | 375 return 0; |
| 376 } | 376 } |
| 377 | 377 |
| 378 // Used by the XSSAuditor to nuke XSS-laden attributes. | 378 // Used by the XSSAuditor to nuke XSS-laden attributes. |
| 379 void eraseValueOfAttribute(size_t i) { | 379 void eraseValueOfAttribute(size_t i) { |
| 380 ASSERT(m_type == StartTag || m_type == EndTag); | 380 DCHECK(m_type == StartTag || m_type == EndTag); |
| 381 m_attributes[i].clearValue(); | 381 m_attributes[i].clearValue(); |
| 382 } | 382 } |
| 383 | 383 |
| 384 /* Character Tokens */ | 384 /* Character Tokens */ |
| 385 | 385 |
| 386 // Starting a character token works slightly differently than starting | 386 // Starting a character token works slightly differently than starting |
| 387 // other types of tokens because we want to save a per-character branch. | 387 // other types of tokens because we want to save a per-character branch. |
| 388 void ensureIsCharacterToken() { | 388 void ensureIsCharacterToken() { |
| 389 ASSERT(m_type == Uninitialized || m_type == Character); | 389 DCHECK(m_type == Uninitialized || m_type == Character); |
| 390 m_type = Character; | 390 m_type = Character; |
| 391 } | 391 } |
| 392 | 392 |
| 393 const DataVector& characters() const { | 393 const DataVector& characters() const { |
| 394 ASSERT(m_type == Character); | 394 DCHECK_EQ(m_type, Character); |
| 395 return m_data; | 395 return m_data; |
| 396 } | 396 } |
| 397 | 397 |
| 398 void appendToCharacter(char character) { | 398 void appendToCharacter(char character) { |
| 399 ASSERT(m_type == Character); | 399 DCHECK_EQ(m_type, Character); |
| 400 m_data.push_back(character); | 400 m_data.push_back(character); |
| 401 } | 401 } |
| 402 | 402 |
| 403 void appendToCharacter(UChar character) { | 403 void appendToCharacter(UChar character) { |
| 404 ASSERT(m_type == Character); | 404 DCHECK_EQ(m_type, Character); |
| 405 m_data.push_back(character); | 405 m_data.push_back(character); |
| 406 m_orAllData |= character; | 406 m_orAllData |= character; |
| 407 } | 407 } |
| 408 | 408 |
| 409 void appendToCharacter(const Vector<LChar, 32>& characters) { | 409 void appendToCharacter(const Vector<LChar, 32>& characters) { |
| 410 ASSERT(m_type == Character); | 410 DCHECK_EQ(m_type, Character); |
| 411 m_data.appendVector(characters); | 411 m_data.appendVector(characters); |
| 412 } | 412 } |
| 413 | 413 |
| 414 /* Comment Tokens */ | 414 /* Comment Tokens */ |
| 415 | 415 |
| 416 const DataVector& comment() const { | 416 const DataVector& comment() const { |
| 417 ASSERT(m_type == Comment); | 417 DCHECK_EQ(m_type, Comment); |
| 418 return m_data; | 418 return m_data; |
| 419 } | 419 } |
| 420 | 420 |
| 421 void beginComment() { | 421 void beginComment() { |
| 422 ASSERT(m_type == Uninitialized); | 422 DCHECK_EQ(m_type, Uninitialized); |
| 423 m_type = Comment; | 423 m_type = Comment; |
| 424 } | 424 } |
| 425 | 425 |
| 426 void appendToComment(UChar character) { | 426 void appendToComment(UChar character) { |
| 427 ASSERT(character); | 427 DCHECK(character); |
| 428 ASSERT(m_type == Comment); | 428 DCHECK_EQ(m_type, Comment); |
| 429 m_data.push_back(character); | 429 m_data.push_back(character); |
| 430 m_orAllData |= character; | 430 m_orAllData |= character; |
| 431 } | 431 } |
| 432 | 432 |
| 433 // Only for XSSAuditor | 433 // Only for XSSAuditor |
| 434 void eraseCharacters() { | 434 void eraseCharacters() { |
| 435 ASSERT(m_type == Character); | 435 DCHECK_EQ(m_type, Character); |
| 436 m_data.clear(); | 436 m_data.clear(); |
| 437 m_orAllData = 0; | 437 m_orAllData = 0; |
| 438 } | 438 } |
| 439 | 439 |
| 440 private: | 440 private: |
| 441 TokenType m_type; | 441 TokenType m_type; |
| 442 Attribute::Range m_range; // Always starts at zero. | 442 Attribute::Range m_range; // Always starts at zero. |
| 443 int m_baseOffset; | 443 int m_baseOffset; |
| 444 DataVector m_data; | 444 DataVector m_data; |
| 445 UChar m_orAllData; | 445 UChar m_orAllData; |
| 446 | 446 |
| 447 // For StartTag and EndTag | 447 // For StartTag and EndTag |
| 448 bool m_selfClosing; | 448 bool m_selfClosing; |
| 449 AttributeList m_attributes; | 449 AttributeList m_attributes; |
| 450 | 450 |
| 451 // A pointer into m_attributes used during lexing. | 451 // A pointer into m_attributes used during lexing. |
| 452 Attribute* m_currentAttribute; | 452 Attribute* m_currentAttribute; |
| 453 | 453 |
| 454 // For DOCTYPE | 454 // For DOCTYPE |
| 455 std::unique_ptr<DoctypeData> m_doctypeData; | 455 std::unique_ptr<DoctypeData> m_doctypeData; |
| 456 }; | 456 }; |
| 457 | 457 |
| 458 #ifndef NDEBUG | 458 #ifndef NDEBUG |
| 459 const char* toString(HTMLToken::TokenType); | 459 const char* toString(HTMLToken::TokenType); |
| 460 #endif | 460 #endif |
| 461 | 461 |
| 462 } // namespace blink | 462 } // namespace blink |
| 463 | 463 |
| 464 #endif | 464 #endif |
| OLD | NEW |