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

Side by Side Diff: Source/core/svg/SVGSVGElement.cpp

Issue 23819007: Have Node::document() return a reference instead of a pointer (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase on master Created 7 years, 3 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 | « Source/core/svg/SVGRadialGradientElement.cpp ('k') | Source/core/svg/SVGScriptElement.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) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org> 2 * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Rob Buis <buis@kde.org> 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Rob Buis <buis@kde.org>
4 * Copyright (C) 2007 Apple Inc. All rights reserved. 4 * Copyright (C) 2007 Apple Inc. All rights reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 { 98 {
99 return adoptRef(new SVGSVGElement(tagName, document)); 99 return adoptRef(new SVGSVGElement(tagName, document));
100 } 100 }
101 101
102 SVGSVGElement::~SVGSVGElement() 102 SVGSVGElement::~SVGSVGElement()
103 { 103 {
104 if (m_viewSpec) 104 if (m_viewSpec)
105 m_viewSpec->resetContextElement(); 105 m_viewSpec->resetContextElement();
106 // There are cases where removedFromDocument() is not called. 106 // There are cases where removedFromDocument() is not called.
107 // see ContainerNode::removeAllChildren, called by its destructor. 107 // see ContainerNode::removeAllChildren, called by its destructor.
108 document()->accessSVGExtensions()->removeTimeContainer(this); 108 document().accessSVGExtensions()->removeTimeContainer(this);
109 } 109 }
110 110
111 const AtomicString& SVGSVGElement::contentScriptType() const 111 const AtomicString& SVGSVGElement::contentScriptType() const
112 { 112 {
113 DEFINE_STATIC_LOCAL(const AtomicString, defaultValue, ("text/ecmascript", At omicString::ConstructFromLiteral)); 113 DEFINE_STATIC_LOCAL(const AtomicString, defaultValue, ("text/ecmascript", At omicString::ConstructFromLiteral));
114 const AtomicString& n = fastGetAttribute(SVGNames::contentScriptTypeAttr); 114 const AtomicString& n = fastGetAttribute(SVGNames::contentScriptTypeAttr);
115 return n.isNull() ? defaultValue : n; 115 return n.isNull() ? defaultValue : n;
116 } 116 }
117 117
118 void SVGSVGElement::setContentScriptType(const AtomicString& type) 118 void SVGSVGElement::setContentScriptType(const AtomicString& type)
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 if (!m_viewSpec) 166 if (!m_viewSpec)
167 m_viewSpec = SVGViewSpec::create(this); 167 m_viewSpec = SVGViewSpec::create(this);
168 return m_viewSpec.get(); 168 return m_viewSpec.get();
169 } 169 }
170 170
171 float SVGSVGElement::currentScale() const 171 float SVGSVGElement::currentScale() const
172 { 172 {
173 if (!inDocument() || !isOutermostSVGSVGElement()) 173 if (!inDocument() || !isOutermostSVGSVGElement())
174 return 1; 174 return 1;
175 175
176 Frame* frame = document()->frame(); 176 Frame* frame = document().frame();
177 if (!frame) 177 if (!frame)
178 return 1; 178 return 1;
179 179
180 FrameTree* frameTree = frame->tree(); 180 FrameTree* frameTree = frame->tree();
181 ASSERT(frameTree); 181 ASSERT(frameTree);
182 182
183 // The behaviour of currentScale() is undefined, when we're dealing with non -standalone SVG documents. 183 // The behaviour of currentScale() is undefined, when we're dealing with non -standalone SVG documents.
184 // If the svg is embedded, the scaling is handled by the host renderer, so w hen asking from inside 184 // If the svg is embedded, the scaling is handled by the host renderer, so w hen asking from inside
185 // the SVG document, a scale value of 1 seems reasonable, as it doesn't know anything about the parent scale. 185 // the SVG document, a scale value of 1 seems reasonable, as it doesn't know anything about the parent scale.
186 return frameTree->parent() ? 1 : frame->pageZoomFactor(); 186 return frameTree->parent() ? 1 : frame->pageZoomFactor();
187 } 187 }
188 188
189 void SVGSVGElement::setCurrentScale(float scale) 189 void SVGSVGElement::setCurrentScale(float scale)
190 { 190 {
191 if (!inDocument() || !isOutermostSVGSVGElement()) 191 if (!inDocument() || !isOutermostSVGSVGElement())
192 return; 192 return;
193 193
194 Frame* frame = document()->frame(); 194 Frame* frame = document().frame();
195 if (!frame) 195 if (!frame)
196 return; 196 return;
197 197
198 FrameTree* frameTree = frame->tree(); 198 FrameTree* frameTree = frame->tree();
199 ASSERT(frameTree); 199 ASSERT(frameTree);
200 200
201 // The behaviour of setCurrentScale() is undefined, when we're dealing with non-standalone SVG documents. 201 // The behaviour of setCurrentScale() is undefined, when we're dealing with non-standalone SVG documents.
202 // We choose the ignore this call, it's pretty useless to support calling se tCurrentScale() from within 202 // We choose the ignore this call, it's pretty useless to support calling se tCurrentScale() from within
203 // an embedded SVG document, for the same reasons as in currentScale() - nee ds resolution by SVG WG. 203 // an embedded SVG document, for the same reasons as in currentScale() - nee ds resolution by SVG WG.
204 if (frameTree->parent()) 204 if (frameTree->parent())
205 return; 205 return;
206 206
207 frame->setPageZoomFactor(scale); 207 frame->setPageZoomFactor(scale);
208 } 208 }
209 209
210 void SVGSVGElement::setCurrentTranslate(const FloatPoint& translation) 210 void SVGSVGElement::setCurrentTranslate(const FloatPoint& translation)
211 { 211 {
212 m_translation = translation; 212 m_translation = translation;
213 updateCurrentTranslate(); 213 updateCurrentTranslate();
214 } 214 }
215 215
216 void SVGSVGElement::updateCurrentTranslate() 216 void SVGSVGElement::updateCurrentTranslate()
217 { 217 {
218 if (RenderObject* object = renderer()) 218 if (RenderObject* object = renderer())
219 object->setNeedsLayout(); 219 object->setNeedsLayout();
220 220
221 if (parentNode() == document() && document()->renderer()) 221 if (parentNode() == &document() && document().renderer())
222 document()->renderer()->repaint(); 222 document().renderer()->repaint();
223 } 223 }
224 224
225 void SVGSVGElement::parseAttribute(const QualifiedName& name, const AtomicString & value) 225 void SVGSVGElement::parseAttribute(const QualifiedName& name, const AtomicString & value)
226 { 226 {
227 SVGParsingError parseError = NoError; 227 SVGParsingError parseError = NoError;
228 228
229 if (!nearestViewportElement()) { 229 if (!nearestViewportElement()) {
230 bool setListener = true; 230 bool setListener = true;
231 231
232 // Only handle events if we're the outermost <svg> element 232 // Only handle events if we're the outermost <svg> element
233 if (name == HTMLNames::onunloadAttr) 233 if (name == HTMLNames::onunloadAttr)
234 document()->setWindowAttributeEventListener(eventNames().unloadEvent , createAttributeEventListener(document()->frame(), name, value)); 234 document().setWindowAttributeEventListener(eventNames().unloadEvent, createAttributeEventListener(document().frame(), name, value));
235 else if (name == HTMLNames::onresizeAttr) 235 else if (name == HTMLNames::onresizeAttr)
236 document()->setWindowAttributeEventListener(eventNames().resizeEvent , createAttributeEventListener(document()->frame(), name, value)); 236 document().setWindowAttributeEventListener(eventNames().resizeEvent, createAttributeEventListener(document().frame(), name, value));
237 else if (name == HTMLNames::onscrollAttr) 237 else if (name == HTMLNames::onscrollAttr)
238 document()->setWindowAttributeEventListener(eventNames().scrollEvent , createAttributeEventListener(document()->frame(), name, value)); 238 document().setWindowAttributeEventListener(eventNames().scrollEvent, createAttributeEventListener(document().frame(), name, value));
239 else if (name == SVGNames::onzoomAttr) 239 else if (name == SVGNames::onzoomAttr)
240 document()->setWindowAttributeEventListener(eventNames().zoomEvent, createAttributeEventListener(document()->frame(), name, value)); 240 document().setWindowAttributeEventListener(eventNames().zoomEvent, c reateAttributeEventListener(document().frame(), name, value));
241 else 241 else
242 setListener = false; 242 setListener = false;
243 243
244 if (setListener) 244 if (setListener)
245 return; 245 return;
246 } 246 }
247 247
248 if (name == HTMLNames::onabortAttr) 248 if (name == HTMLNames::onabortAttr)
249 document()->setWindowAttributeEventListener(eventNames().abortEvent, cre ateAttributeEventListener(document()->frame(), name, value)); 249 document().setWindowAttributeEventListener(eventNames().abortEvent, crea teAttributeEventListener(document().frame(), name, value));
250 else if (name == HTMLNames::onerrorAttr) 250 else if (name == HTMLNames::onerrorAttr)
251 document()->setWindowAttributeEventListener(eventNames().errorEvent, cre ateAttributeEventListener(document()->frame(), name, value)); 251 document().setWindowAttributeEventListener(eventNames().errorEvent, crea teAttributeEventListener(document().frame(), name, value));
252 else if (name == SVGNames::xAttr) 252 else if (name == SVGNames::xAttr)
253 setXBaseValue(SVGLength::construct(LengthModeWidth, value, parseError)); 253 setXBaseValue(SVGLength::construct(LengthModeWidth, value, parseError));
254 else if (name == SVGNames::yAttr) 254 else if (name == SVGNames::yAttr)
255 setYBaseValue(SVGLength::construct(LengthModeHeight, value, parseError)) ; 255 setYBaseValue(SVGLength::construct(LengthModeHeight, value, parseError)) ;
256 else if (name == SVGNames::widthAttr) 256 else if (name == SVGNames::widthAttr)
257 setWidthBaseValue(SVGLength::construct(LengthModeWidth, value, parseErro r, ForbidNegativeLengths)); 257 setWidthBaseValue(SVGLength::construct(LengthModeWidth, value, parseErro r, ForbidNegativeLengths));
258 else if (name == SVGNames::heightAttr) 258 else if (name == SVGNames::heightAttr)
259 setHeightBaseValue(SVGLength::construct(LengthModeHeight, value, parseEr ror, ForbidNegativeLengths)); 259 setHeightBaseValue(SVGLength::construct(LengthModeHeight, value, parseEr ror, ForbidNegativeLengths));
260 else if (SVGLangSpace::parseAttribute(name, value) 260 else if (SVGLangSpace::parseAttribute(name, value)
261 || SVGExternalResourcesRequired::parseAttribute(name, value) 261 || SVGExternalResourcesRequired::parseAttribute(name, value)
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 368
369 bool SVGSVGElement::checkEnclosure(SVGElement* element, const SVGRect& rect) con st 369 bool SVGSVGElement::checkEnclosure(SVGElement* element, const SVGRect& rect) con st
370 { 370 {
371 if (!element) 371 if (!element)
372 return false; 372 return false;
373 return RenderSVGModelObject::checkEnclosure(element->renderer(), rect); 373 return RenderSVGModelObject::checkEnclosure(element->renderer(), rect);
374 } 374 }
375 375
376 void SVGSVGElement::deselectAll() 376 void SVGSVGElement::deselectAll()
377 { 377 {
378 if (Frame* frame = document()->frame()) 378 if (Frame* frame = document().frame())
379 frame->selection()->clear(); 379 frame->selection()->clear();
380 } 380 }
381 381
382 float SVGSVGElement::createSVGNumber() 382 float SVGSVGElement::createSVGNumber()
383 { 383 {
384 return 0.0f; 384 return 0.0f;
385 } 385 }
386 386
387 SVGLength SVGSVGElement::createSVGLength() 387 SVGLength SVGSVGElement::createSVGLength()
388 { 388 {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 // Translate in our CSS parent coordinate space 448 // Translate in our CSS parent coordinate space
449 // FIXME: This doesn't work correctly with CSS transforms. 449 // FIXME: This doesn't work correctly with CSS transforms.
450 location = renderer->localToAbsolute(location, UseTransforms); 450 location = renderer->localToAbsolute(location, UseTransforms);
451 location.scale(zoomFactor, zoomFactor); 451 location.scale(zoomFactor, zoomFactor);
452 452
453 // Be careful here! localToBorderBoxTransform() included the x/y off set coming from the viewBoxToViewTransform(), 453 // Be careful here! localToBorderBoxTransform() included the x/y off set coming from the viewBoxToViewTransform(),
454 // so we have to subtract it here (original cause of bug #27183) 454 // so we have to subtract it here (original cause of bug #27183)
455 transform.translate(location.x() - viewBoxTransform.e(), location.y( ) - viewBoxTransform.f()); 455 transform.translate(location.x() - viewBoxTransform.e(), location.y( ) - viewBoxTransform.f());
456 456
457 // Respect scroll offset. 457 // Respect scroll offset.
458 if (FrameView* view = document()->view()) { 458 if (FrameView* view = document().view()) {
459 LayoutSize scrollOffset = view->scrollOffset(); 459 LayoutSize scrollOffset = view->scrollOffset();
460 scrollOffset.scale(zoomFactor); 460 scrollOffset.scale(zoomFactor);
461 transform.translate(-scrollOffset.width(), -scrollOffset.height( )); 461 transform.translate(-scrollOffset.width(), -scrollOffset.height( ));
462 } 462 }
463 } 463 }
464 } 464 }
465 465
466 return transform.multiply(viewBoxTransform); 466 return transform.multiply(viewBoxTransform);
467 } 467 }
468 468
469 bool SVGSVGElement::rendererIsNeeded(const NodeRenderingContext& context) 469 bool SVGSVGElement::rendererIsNeeded(const NodeRenderingContext& context)
470 { 470 {
471 // FIXME: We should respect display: none on the documentElement svg element 471 // FIXME: We should respect display: none on the documentElement svg element
472 // but many things in FrameView and SVGImage depend on the RenderSVGRoot whe n 472 // but many things in FrameView and SVGImage depend on the RenderSVGRoot whe n
473 // they should instead depend on the RenderView. 473 // they should instead depend on the RenderView.
474 // https://bugs.webkit.org/show_bug.cgi?id=103493 474 // https://bugs.webkit.org/show_bug.cgi?id=103493
475 if (document()->documentElement() == this) 475 if (document().documentElement() == this)
476 return true; 476 return true;
477 return Element::rendererIsNeeded(context); 477 return Element::rendererIsNeeded(context);
478 } 478 }
479 479
480 RenderObject* SVGSVGElement::createRenderer(RenderStyle*) 480 RenderObject* SVGSVGElement::createRenderer(RenderStyle*)
481 { 481 {
482 if (isOutermostSVGSVGElement()) 482 if (isOutermostSVGSVGElement())
483 return new RenderSVGRoot(this); 483 return new RenderSVGRoot(this);
484 484
485 return new RenderSVGViewportContainer(this); 485 return new RenderSVGViewportContainer(this);
486 } 486 }
487 487
488 Node::InsertionNotificationRequest SVGSVGElement::insertedInto(ContainerNode* ro otParent) 488 Node::InsertionNotificationRequest SVGSVGElement::insertedInto(ContainerNode* ro otParent)
489 { 489 {
490 if (rootParent->inDocument()) { 490 if (rootParent->inDocument()) {
491 document()->accessSVGExtensions()->addTimeContainer(this); 491 document().accessSVGExtensions()->addTimeContainer(this);
492 492
493 // Animations are started at the end of document parsing and after firin g the load event, 493 // Animations are started at the end of document parsing and after firin g the load event,
494 // but if we miss that train (deferred programmatic element insertion fo r example) we need 494 // but if we miss that train (deferred programmatic element insertion fo r example) we need
495 // to initialize the time container here. 495 // to initialize the time container here.
496 if (!document()->parsing() && !document()->processingLoadEvent() && docu ment()->loadEventFinished() && !timeContainer()->isStarted()) 496 if (!document().parsing() && !document().processingLoadEvent() && docume nt().loadEventFinished() && !timeContainer()->isStarted())
497 timeContainer()->begin(); 497 timeContainer()->begin();
498 } 498 }
499 return SVGGraphicsElement::insertedInto(rootParent); 499 return SVGGraphicsElement::insertedInto(rootParent);
500 } 500 }
501 501
502 void SVGSVGElement::removedFrom(ContainerNode* rootParent) 502 void SVGSVGElement::removedFrom(ContainerNode* rootParent)
503 { 503 {
504 if (rootParent->inDocument()) 504 if (rootParent->inDocument())
505 document()->accessSVGExtensions()->removeTimeContainer(this); 505 document().accessSVGExtensions()->removeTimeContainer(this);
506 SVGGraphicsElement::removedFrom(rootParent); 506 SVGGraphicsElement::removedFrom(rootParent);
507 } 507 }
508 508
509 void SVGSVGElement::pauseAnimations() 509 void SVGSVGElement::pauseAnimations()
510 { 510 {
511 if (!m_timeContainer->isPaused()) 511 if (!m_timeContainer->isPaused())
512 m_timeContainer->pause(); 512 m_timeContainer->pause();
513 } 513 }
514 514
515 void SVGSVGElement::unpauseAnimations() 515 void SVGSVGElement::unpauseAnimations()
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 // - the SVG content is a separately stored resource that is embedded by ref erence (such as the ‘object’ element in XHTML [XHTML]), or 597 // - the SVG content is a separately stored resource that is embedded by ref erence (such as the ‘object’ element in XHTML [XHTML]), or
598 // the SVG content is embedded inline within a containing document; 598 // the SVG content is embedded inline within a containing document;
599 // - and the referencing element or containing document is styled using CSS [CSS2] or XSL [XSL]; 599 // - and the referencing element or containing document is styled using CSS [CSS2] or XSL [XSL];
600 // - and there are CSS-compatible positioning properties ([CSS2], section 9. 3) specified on the referencing element (e.g., the ‘object’ element) 600 // - and there are CSS-compatible positioning properties ([CSS2], section 9. 3) specified on the referencing element (e.g., the ‘object’ element)
601 // or on the containing document's outermost svg element that are sufficie nt to establish the width of the viewport. Under these conditions, 601 // or on the containing document's outermost svg element that are sufficie nt to establish the width of the viewport. Under these conditions,
602 // the positioning properties establish the viewport's width. 602 // the positioning properties establish the viewport's width.
603 RenderSVGRoot* root = toRenderSVGRoot(renderer()); 603 RenderSVGRoot* root = toRenderSVGRoot(renderer());
604 604
605 // SVG embedded through object/embed/iframe. 605 // SVG embedded through object/embed/iframe.
606 if (root->isEmbeddedThroughFrameContainingSVGDocument()) 606 if (root->isEmbeddedThroughFrameContainingSVGDocument())
607 return !root->hasReplacedLogicalWidth() && !document()->frame()->ownerRe nderer()->hasReplacedLogicalWidth(); 607 return !root->hasReplacedLogicalWidth() && !document().frame()->ownerRen derer()->hasReplacedLogicalWidth();
608 608
609 // SVG embedded via SVGImage (background-image/border-image/etc) / Inline SV G. 609 // SVG embedded via SVGImage (background-image/border-image/etc) / Inline SV G.
610 if (root->isEmbeddedThroughSVGImage() || document()->documentElement() != th is) 610 if (root->isEmbeddedThroughSVGImage() || document().documentElement() != thi s)
611 return !root->hasReplacedLogicalWidth(); 611 return !root->hasReplacedLogicalWidth();
612 612
613 return true; 613 return true;
614 } 614 }
615 615
616 bool SVGSVGElement::heightAttributeEstablishesViewport() const 616 bool SVGSVGElement::heightAttributeEstablishesViewport() const
617 { 617 {
618 if (!renderer() || renderer()->isSVGViewportContainer()) 618 if (!renderer() || renderer()->isSVGViewportContainer())
619 return true; 619 return true;
620 620
621 // Spec: http://www.w3.org/TR/SVG/coords.html#IntrinsicSizing 621 // Spec: http://www.w3.org/TR/SVG/coords.html#IntrinsicSizing
622 // Similarly, if there are positioning properties specified on the referenci ng element or on the outermost svg element 622 // Similarly, if there are positioning properties specified on the referenci ng element or on the outermost svg element
623 // that are sufficient to establish the height of the viewport, then these p ositioning properties establish the viewport's 623 // that are sufficient to establish the height of the viewport, then these p ositioning properties establish the viewport's
624 // height; otherwise, the ‘height’ attribute on the outermost svg element es tablishes the viewport's height. 624 // height; otherwise, the ‘height’ attribute on the outermost svg element es tablishes the viewport's height.
625 RenderSVGRoot* root = toRenderSVGRoot(renderer()); 625 RenderSVGRoot* root = toRenderSVGRoot(renderer());
626 626
627 // SVG embedded through object/embed/iframe. 627 // SVG embedded through object/embed/iframe.
628 if (root->isEmbeddedThroughFrameContainingSVGDocument()) 628 if (root->isEmbeddedThroughFrameContainingSVGDocument())
629 return !root->hasReplacedLogicalHeight() && !document()->frame()->ownerR enderer()->hasReplacedLogicalHeight(); 629 return !root->hasReplacedLogicalHeight() && !document().frame()->ownerRe nderer()->hasReplacedLogicalHeight();
630 630
631 // SVG embedded via SVGImage (background-image/border-image/etc) / Inline SV G. 631 // SVG embedded via SVGImage (background-image/border-image/etc) / Inline SV G.
632 if (root->isEmbeddedThroughSVGImage() || document()->documentElement() != th is) 632 if (root->isEmbeddedThroughSVGImage() || document().documentElement() != thi s)
633 return !root->hasReplacedLogicalHeight(); 633 return !root->hasReplacedLogicalHeight();
634 634
635 return true; 635 return true;
636 } 636 }
637 637
638 Length SVGSVGElement::intrinsicWidth(ConsiderCSSMode mode) const 638 Length SVGSVGElement::intrinsicWidth(ConsiderCSSMode mode) const
639 { 639 {
640 if (widthAttributeEstablishesViewport() || mode == IgnoreCSSProperties) { 640 if (widthAttributeEstablishesViewport() || mode == IgnoreCSSProperties) {
641 if (widthCurrentValue().unitType() == LengthTypePercentage) 641 if (widthCurrentValue().unitType() == LengthTypePercentage)
642 return Length(widthCurrentValue().valueAsPercentage() * 100, Percent ); 642 return Length(widthCurrentValue().valueAsPercentage() * 100, Percent );
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
769 continue; 769 continue;
770 770
771 Element* element = toElement(node); 771 Element* element = toElement(node);
772 if (element->getIdAttribute() == id) 772 if (element->getIdAttribute() == id)
773 return element; 773 return element;
774 } 774 }
775 return 0; 775 return 0;
776 } 776 }
777 777
778 } 778 }
OLDNEW
« no previous file with comments | « Source/core/svg/SVGRadialGradientElement.cpp ('k') | Source/core/svg/SVGScriptElement.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698