Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(118)

Side by Side Diff: Source/core/dom/Element.h

Issue 202633006: Use an unsigned of flags in ElementRareData (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: try again Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | Source/core/dom/Element.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Peter Kelly (pmk@post.com) 4 * (C) 2001 Peter Kelly (pmk@post.com)
5 * (C) 2001 Dirk Mueller (mueller@kde.org) 5 * (C) 2001 Dirk Mueller (mueller@kde.org)
6 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2013 Appl e Inc. All rights reserved. 6 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2013 Appl e Inc. All rights reserved.
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 AffectedSelectorVisited = 1 << 6 68 AffectedSelectorVisited = 1 << 6
69 }; 69 };
70 typedef int AffectedSelectorMask; 70 typedef int AffectedSelectorMask;
71 71
72 enum SpellcheckAttributeState { 72 enum SpellcheckAttributeState {
73 SpellcheckAttributeTrue, 73 SpellcheckAttributeTrue,
74 SpellcheckAttributeFalse, 74 SpellcheckAttributeFalse,
75 SpellcheckAttributeDefault 75 SpellcheckAttributeDefault
76 }; 76 };
77 77
78 enum ElementFlags {
79 TabIndexWasSetExplicitly = 1 << 0,
80 NeedsFocusAppearanceUpdateSoonAfterAttach = 1 << 1,
81 StyleAffectedByEmpty = 1 << 2,
82 IsInCanvasSubtree = 1 << 3,
83 ContainsFullScreenElement = 1 << 4,
84 IsInTopLayer = 1 << 5,
85 HasPendingResources = 1 << 6,
86 ChildrenAffectedByFocus = 1 << 7,
87 ChildrenAffectedByHover = 1 << 8,
88 ChildrenAffectedByActive = 1 << 9,
89 ChildrenAffectedByDrag = 1 << 10,
90 ChildrenAffectedByFirstChildRules = 1 << 11,
91 ChildrenAffectedByLastChildRules = 1 << 12,
92 ChildrenAffectedByDirectAdjacentRules = 1 << 13,
93 ChildrenAffectedByForwardPositionalRules = 1 << 14,
94 ChildrenAffectedByBackwardPositionalRules = 1 << 15,
95
96 // If any of these flags are set we cannot share style.
97 ElementFlagsPreventingStyleSharing =
98 ChildrenAffectedByFocus
99 | ChildrenAffectedByHover
100 | ChildrenAffectedByActive
101 | ChildrenAffectedByDrag
102 | ChildrenAffectedByFirstChildRules
103 | ChildrenAffectedByLastChildRules
104 | ChildrenAffectedByDirectAdjacentRules
105 | ChildrenAffectedByForwardPositionalRules
106 | ChildrenAffectedByBackwardPositionalRules,
107 };
108
78 class Element : public ContainerNode { 109 class Element : public ContainerNode {
79 public: 110 public:
80 static PassRefPtr<Element> create(const QualifiedName&, Document*); 111 static PassRefPtr<Element> create(const QualifiedName&, Document*);
81 virtual ~Element(); 112 virtual ~Element();
82 113
83 DEFINE_ATTRIBUTE_EVENT_LISTENER(beforecopy); 114 DEFINE_ATTRIBUTE_EVENT_LISTENER(beforecopy);
84 DEFINE_ATTRIBUTE_EVENT_LISTENER(beforecut); 115 DEFINE_ATTRIBUTE_EVENT_LISTENER(beforecut);
85 DEFINE_ATTRIBUTE_EVENT_LISTENER(beforepaste); 116 DEFINE_ATTRIBUTE_EVENT_LISTENER(beforepaste);
86 DEFINE_ATTRIBUTE_EVENT_LISTENER(copy); 117 DEFINE_ATTRIBUTE_EVENT_LISTENER(copy);
87 DEFINE_ATTRIBUTE_EVENT_LISTENER(cut); 118 DEFINE_ATTRIBUTE_EVENT_LISTENER(cut);
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 351
321 bool hasAuthorShadowRoot() const { return shadowRoot(); } 352 bool hasAuthorShadowRoot() const { return shadowRoot(); }
322 virtual void didAddShadowRoot(ShadowRoot&); 353 virtual void didAddShadowRoot(ShadowRoot&);
323 ShadowRoot* userAgentShadowRoot() const; 354 ShadowRoot* userAgentShadowRoot() const;
324 ShadowRoot& ensureUserAgentShadowRoot(); 355 ShadowRoot& ensureUserAgentShadowRoot();
325 bool isInDescendantTreeOf(const Element* shadowHost) const; 356 bool isInDescendantTreeOf(const Element* shadowHost) const;
326 357
327 RenderStyle* computedStyle(PseudoId = NOPSEUDO); 358 RenderStyle* computedStyle(PseudoId = NOPSEUDO);
328 359
329 // Methods for indicating the style is affected by dynamic updates (e.g., ch ildren changing, our position changing in our sibling list, etc.) 360 // Methods for indicating the style is affected by dynamic updates (e.g., ch ildren changing, our position changing in our sibling list, etc.)
330 bool styleAffectedByEmpty() const { return hasRareData() && rareDataStyleAff ectedByEmpty(); } 361 bool styleAffectedByEmpty() const { return hasElementFlag(StyleAffectedByEmp ty); }
331 bool childrenAffectedByFocus() const { return hasRareData() && rareDataChild renAffectedByFocus(); } 362 void setStyleAffectedByEmpty() { setElementFlag(StyleAffectedByEmpty); }
332 bool childrenAffectedByHover() const { return hasRareData() && rareDataChild renAffectedByHover(); } 363
333 bool childrenAffectedByActive() const { return hasRareData() && rareDataChil drenAffectedByActive(); } 364 bool childrenAffectedByFocus() const { return hasElementFlag(ChildrenAffecte dByFocus); }
334 bool childrenAffectedByDrag() const { return hasRareData() && rareDataChildr enAffectedByDrag(); } 365 void setChildrenAffectedByFocus() { setElementFlag(ChildrenAffectedByFocus); }
335 bool childrenAffectedByPositionalRules() const { return hasRareData() && (ra reDataChildrenAffectedByForwardPositionalRules() || rareDataChildrenAffectedByBa ckwardPositionalRules()); } 366
336 bool childrenAffectedByFirstChildRules() const { return hasRareData() && rar eDataChildrenAffectedByFirstChildRules(); } 367 bool childrenAffectedByHover() const { return hasElementFlag(ChildrenAffecte dByHover); }
337 bool childrenAffectedByLastChildRules() const { return hasRareData() && rare DataChildrenAffectedByLastChildRules(); } 368 void setChildrenAffectedByHover() { setElementFlag(ChildrenAffectedByHover); }
338 bool childrenAffectedByDirectAdjacentRules() const { return hasRareData() && rareDataChildrenAffectedByDirectAdjacentRules(); } 369
339 bool childrenAffectedByForwardPositionalRules() const { return hasRareData() && rareDataChildrenAffectedByForwardPositionalRules(); } 370 bool childrenAffectedByActive() const { return hasElementFlag(ChildrenAffect edByActive); }
340 bool childrenAffectedByBackwardPositionalRules() const { return hasRareData( ) && rareDataChildrenAffectedByBackwardPositionalRules(); } 371 void setChildrenAffectedByActive() { setElementFlag(ChildrenAffectedByActive ); }
372
373 bool childrenAffectedByDrag() const { return hasElementFlag(ChildrenAffected ByDrag); }
374 void setChildrenAffectedByDrag() { setElementFlag(ChildrenAffectedByDrag); }
375
376 bool childrenAffectedByPositionalRules() const { return hasElementFlag(Child renAffectedByForwardPositionalRules) || hasElementFlag(ChildrenAffectedByBackwar dPositionalRules); }
377
378 bool childrenAffectedByFirstChildRules() const { return hasElementFlag(Child renAffectedByFirstChildRules); }
379 void setChildrenAffectedByFirstChildRules() { setElementFlag(ChildrenAffecte dByFirstChildRules); }
380
381 bool childrenAffectedByLastChildRules() const { return hasElementFlag(Childr enAffectedByLastChildRules); }
382 void setChildrenAffectedByLastChildRules() { setElementFlag(ChildrenAffected ByLastChildRules); }
383
384 bool childrenAffectedByDirectAdjacentRules() const { return hasElementFlag(C hildrenAffectedByDirectAdjacentRules); }
385 void setChildrenAffectedByDirectAdjacentRules() { setElementFlag(ChildrenAff ectedByDirectAdjacentRules); }
386
387 bool childrenAffectedByForwardPositionalRules() const { return hasElementFla g(ChildrenAffectedByForwardPositionalRules); }
388 void setChildrenAffectedByForwardPositionalRules() { setElementFlag(Children AffectedByForwardPositionalRules); }
389
390 bool childrenAffectedByBackwardPositionalRules() const { return hasElementFl ag(ChildrenAffectedByBackwardPositionalRules); }
391 void setChildrenAffectedByBackwardPositionalRules() { setElementFlag(Childre nAffectedByBackwardPositionalRules); }
392
393 void setIsInCanvasSubtree(bool value) { setElementFlag(IsInCanvasSubtree, va lue); }
394 bool isInCanvasSubtree() const { return hasElementFlag(IsInCanvasSubtree); }
395
341 unsigned childIndex() const { return hasRareData() ? rareDataChildIndex() : 0; } 396 unsigned childIndex() const { return hasRareData() ? rareDataChildIndex() : 0; }
342
343 bool childrenSupportStyleSharing() const;
344
345 void setStyleAffectedByEmpty();
346 void setChildrenAffectedByFocus();
347 void setChildrenAffectedByHover();
348 void setChildrenAffectedByActive();
349 void setChildrenAffectedByDrag();
350 void setChildrenAffectedByFirstChildRules();
351 void setChildrenAffectedByLastChildRules();
352 void setChildrenAffectedByDirectAdjacentRules();
353 void setChildrenAffectedByForwardPositionalRules();
354 void setChildrenAffectedByBackwardPositionalRules();
355 void setChildIndex(unsigned); 397 void setChildIndex(unsigned);
356 398
357 void setIsInCanvasSubtree(bool); 399 bool childrenSupportStyleSharing() const { return !hasElementFlag(ElementFla gsPreventingStyleSharing); }
358 bool isInCanvasSubtree() const;
359 400
360 bool isUpgradedCustomElement() { return customElementState() == Upgraded; } 401 bool isUpgradedCustomElement() { return customElementState() == Upgraded; }
361 bool isUnresolvedCustomElement() { return customElementState() == WaitingFor Upgrade; } 402 bool isUnresolvedCustomElement() { return customElementState() == WaitingFor Upgrade; }
362 403
363 AtomicString computeInheritedLanguage() const; 404 AtomicString computeInheritedLanguage() const;
364 Locale& locale() const; 405 Locale& locale() const;
365 406
366 virtual void accessKeyAction(bool /*sendToAnyEvent*/) { } 407 virtual void accessKeyAction(bool /*sendToAnyEvent*/) { }
367 408
368 virtual bool isURLAttribute(const Attribute&) const { return false; } 409 virtual bool isURLAttribute(const Attribute&) const { return false; }
369 virtual bool isHTMLContentAttribute(const Attribute&) const { return false; } 410 virtual bool isHTMLContentAttribute(const Attribute&) const { return false; }
370 411
371 KURL getURLAttribute(const QualifiedName&) const; 412 KURL getURLAttribute(const QualifiedName&) const;
372 KURL getNonEmptyURLAttribute(const QualifiedName&) const; 413 KURL getNonEmptyURLAttribute(const QualifiedName&) const;
373 414
374 virtual const AtomicString imageSourceURL() const; 415 virtual const AtomicString imageSourceURL() const;
375 virtual Image* imageContents() { return 0; } 416 virtual Image* imageContents() { return 0; }
376 417
377 virtual void focus(bool restorePreviousSelection = true, FocusType = FocusTy peNone); 418 virtual void focus(bool restorePreviousSelection = true, FocusType = FocusTy peNone);
378 virtual void updateFocusAppearance(bool restorePreviousSelection); 419 virtual void updateFocusAppearance(bool restorePreviousSelection);
379 virtual void blur(); 420 virtual void blur();
380 // Whether this element can receive focus at all. Most elements are not 421 // Whether this element can receive focus at all. Most elements are not
381 // focusable but some elements, such as form controls and links, are. Unlike 422 // focusable but some elements, such as form controls and links, are. Unlike
382 // rendererIsFocusable(), this method may be called when layout is not up to 423 // rendererIsFocusable(), this method may be called when layout is not up to
383 // date, so it must not use the renderer to determine focusability. 424 // date, so it must not use the renderer to determine focusability.
384 virtual bool supportsFocus() const; 425 virtual bool supportsFocus() const { return hasElementFlag(TabIndexWasSetExp licitly); }
385 // Whether the node can actually be focused. 426 // Whether the node can actually be focused.
386 bool isFocusable() const; 427 bool isFocusable() const;
387 virtual bool isKeyboardFocusable() const; 428 virtual bool isKeyboardFocusable() const;
388 virtual bool isMouseFocusable() const; 429 virtual bool isMouseFocusable() const;
389 virtual void dispatchFocusEvent(Element* oldFocusedElement, FocusType); 430 virtual void dispatchFocusEvent(Element* oldFocusedElement, FocusType);
390 virtual void dispatchBlurEvent(Element* newFocusedElement); 431 virtual void dispatchBlurEvent(Element* newFocusedElement);
391 void dispatchFocusInEvent(const AtomicString& eventType, Element* oldFocused Element); 432 void dispatchFocusInEvent(const AtomicString& eventType, Element* oldFocused Element);
392 void dispatchFocusOutEvent(const AtomicString& eventType, Element* newFocuse dElement); 433 void dispatchFocusOutEvent(const AtomicString& eventType, Element* newFocuse dElement);
393 434
394 String innerText(); 435 String innerText();
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 virtual bool isFrameElementBase() const { return false; } 504 virtual bool isFrameElementBase() const { return false; }
464 virtual bool isPasswordGeneratorButtonElement() const { return false; } 505 virtual bool isPasswordGeneratorButtonElement() const { return false; }
465 virtual bool isClearButtonElement() const { return false; } 506 virtual bool isClearButtonElement() const { return false; }
466 507
467 virtual bool canContainRangeEndPoint() const OVERRIDE { return true; } 508 virtual bool canContainRangeEndPoint() const OVERRIDE { return true; }
468 509
469 // Used for disabled form elements; if true, prevents mouse events from bein g dispatched 510 // Used for disabled form elements; if true, prevents mouse events from bein g dispatched
470 // to event listeners, and prevents DOMActivate events from being sent at al l. 511 // to event listeners, and prevents DOMActivate events from being sent at al l.
471 virtual bool isDisabledFormControl() const { return false; } 512 virtual bool isDisabledFormControl() const { return false; }
472 513
473 bool hasPendingResources() const; 514 bool hasPendingResources() const { return hasElementFlag(HasPendingResources ); }
474 void setHasPendingResources(); 515 void setHasPendingResources() { setElementFlag(HasPendingResources); }
475 void clearHasPendingResources(); 516 void clearHasPendingResources() { clearElementFlag(HasPendingResources); }
476 virtual void buildPendingResource() { }; 517 virtual void buildPendingResource() { };
477 518
478 enum { 519 enum {
479 ALLOW_KEYBOARD_INPUT = 1 << 0, 520 ALLOW_KEYBOARD_INPUT = 1 << 0,
480 LEGACY_MOZILLA_REQUEST = 1 << 1, 521 LEGACY_MOZILLA_REQUEST = 1 << 1,
481 }; 522 };
482 523
483 void webkitRequestFullScreen(unsigned short flags); 524 void webkitRequestFullScreen(unsigned short flags);
484 bool containsFullScreenElement() const; 525 bool containsFullScreenElement() const { return hasElementFlag(ContainsFullS creenElement); }
485 void setContainsFullScreenElement(bool); 526 void setContainsFullScreenElement(bool);
486 void setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(bool); 527 void setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(bool);
487 528
488 // W3C API 529 // W3C API
489 void webkitRequestFullscreen(); 530 void webkitRequestFullscreen();
490 531
491 bool isInTopLayer() const; 532 bool isInTopLayer() const { return hasElementFlag(IsInTopLayer); }
492 void setIsInTopLayer(bool); 533 void setIsInTopLayer(bool);
493 534
494 void webkitRequestPointerLock(); 535 void webkitRequestPointerLock();
495 536
496 bool isSpellCheckingEnabled() const; 537 bool isSpellCheckingEnabled() const;
497 538
498 // FIXME: public for RenderTreeBuilder, we shouldn't expose this though. 539 // FIXME: public for RenderTreeBuilder, we shouldn't expose this though.
499 PassRefPtr<RenderStyle> styleForRenderer(); 540 PassRefPtr<RenderStyle> styleForRenderer();
500 541
501 bool hasID() const; 542 bool hasID() const;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 // classAttributeChanged() exists to share code between 599 // classAttributeChanged() exists to share code between
559 // parseAttribute (called via setAttribute()) and 600 // parseAttribute (called via setAttribute()) and
560 // svgAttributeChanged (called when element.className.baseValue is set) 601 // svgAttributeChanged (called when element.className.baseValue is set)
561 void classAttributeChanged(const AtomicString& newClassString); 602 void classAttributeChanged(const AtomicString& newClassString);
562 603
563 PassRefPtr<RenderStyle> originalStyleForRenderer(); 604 PassRefPtr<RenderStyle> originalStyleForRenderer();
564 605
565 Node* insertAdjacent(const String& where, Node* newChild, ExceptionState&); 606 Node* insertAdjacent(const String& where, Node* newChild, ExceptionState&);
566 607
567 private: 608 private:
609 bool hasElementFlag(ElementFlags mask) const { return hasRareData() && hasEl ementFlagInternal(mask); }
610 void setElementFlag(ElementFlags, bool value = true);
611 void clearElementFlag(ElementFlags);
612 bool hasElementFlagInternal(ElementFlags) const;
613
568 void styleAttributeChanged(const AtomicString& newStyleString, AttributeModi ficationReason); 614 void styleAttributeChanged(const AtomicString& newStyleString, AttributeModi ficationReason);
569 615
570 void updatePresentationAttributeStyle(); 616 void updatePresentationAttributeStyle();
571 617
572 void inlineStyleChanged(); 618 void inlineStyleChanged();
573 PropertySetCSSStyleDeclaration* inlineStyleCSSOMWrapper(); 619 PropertySetCSSStyleDeclaration* inlineStyleCSSOMWrapper();
574 void setInlineStyleFromString(const AtomicString&); 620 void setInlineStyleFromString(const AtomicString&);
575 621
576 StyleRecalcChange recalcOwnStyle(StyleRecalcChange); 622 StyleRecalcChange recalcOwnStyle(StyleRecalcChange);
577 void recalcChildStyle(StyleRecalcChange); 623 void recalcChildStyle(StyleRecalcChange);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
630 inline void updateCallbackSelectors(RenderStyle* oldStyle, RenderStyle* newS tyle); 676 inline void updateCallbackSelectors(RenderStyle* oldStyle, RenderStyle* newS tyle);
631 inline void removeCallbackSelectors(); 677 inline void removeCallbackSelectors();
632 inline void addCallbackSelectors(); 678 inline void addCallbackSelectors();
633 679
634 // cloneNode is private so that non-virtual cloneElementWithChildren and clo neElementWithoutChildren 680 // cloneNode is private so that non-virtual cloneElementWithChildren and clo neElementWithoutChildren
635 // are used instead. 681 // are used instead.
636 virtual PassRefPtr<Node> cloneNode(bool deep) OVERRIDE; 682 virtual PassRefPtr<Node> cloneNode(bool deep) OVERRIDE;
637 virtual PassRefPtr<Element> cloneElementWithoutAttributesAndChildren(); 683 virtual PassRefPtr<Element> cloneElementWithoutAttributesAndChildren();
638 684
639 QualifiedName m_tagName; 685 QualifiedName m_tagName;
640 bool rareDataStyleAffectedByEmpty() const; 686
641 bool rareDataChildrenAffectedByFocus() const;
642 bool rareDataChildrenAffectedByHover() const;
643 bool rareDataChildrenAffectedByActive() const;
644 bool rareDataChildrenAffectedByDrag() const;
645 bool rareDataChildrenAffectedByFirstChildRules() const;
646 bool rareDataChildrenAffectedByLastChildRules() const;
647 bool rareDataChildrenAffectedByDirectAdjacentRules() const;
648 bool rareDataChildrenAffectedByForwardPositionalRules() const;
649 bool rareDataChildrenAffectedByBackwardPositionalRules() const;
650 unsigned rareDataChildIndex() const; 687 unsigned rareDataChildIndex() const;
651 688
652 SpellcheckAttributeState spellcheckAttributeState() const; 689 SpellcheckAttributeState spellcheckAttributeState() const;
653 690
654 void updateNamedItemRegistration(const AtomicString& oldName, const AtomicSt ring& newName); 691 void updateNamedItemRegistration(const AtomicString& oldName, const AtomicSt ring& newName);
655 void updateExtraNamedItemRegistration(const AtomicString& oldName, const Ato micString& newName); 692 void updateExtraNamedItemRegistration(const AtomicString& oldName, const Ato micString& newName);
656 693
657 void createUniqueElementData(); 694 void createUniqueElementData();
658 695
659 bool shouldInvalidateDistributionWhenAttributeChanged(ElementShadow*, const QualifiedName&, const AtomicString&); 696 bool shouldInvalidateDistributionWhenAttributeChanged(ElementShadow*, const QualifiedName&, const AtomicString&);
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
894 template <> inline bool isElementOfType<const thisType>(const Element& eleme nt) { return element.predicate; } \ 931 template <> inline bool isElementOfType<const thisType>(const Element& eleme nt) { return element.predicate; } \
895 DEFINE_NODE_TYPE_CASTS(thisType, predicate) 932 DEFINE_NODE_TYPE_CASTS(thisType, predicate)
896 933
897 #define DEFINE_ELEMENT_TYPE_CASTS_WITH_FUNCTION(thisType) \ 934 #define DEFINE_ELEMENT_TYPE_CASTS_WITH_FUNCTION(thisType) \
898 template <> inline bool isElementOfType<const thisType>(const Element& eleme nt) { return is##thisType(element); } \ 935 template <> inline bool isElementOfType<const thisType>(const Element& eleme nt) { return is##thisType(element); } \
899 DEFINE_NODE_TYPE_CASTS_WITH_FUNCTION(thisType) 936 DEFINE_NODE_TYPE_CASTS_WITH_FUNCTION(thisType)
900 937
901 } // namespace 938 } // namespace
902 939
903 #endif 940 #endif
OLDNEW
« no previous file with comments | « no previous file | Source/core/dom/Element.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698