Bug 120297

Summary: Need to check if some HTML child elements are HTMLUnknownElement
Product: WebKit Reporter: Gyuyoung Kim <gyuyoung.kim>
Component: DOMAssignee: Darin Adler <darin>
Status: RESOLVED FIXED    
Severity: Normal CC: cdumez, commit-queue, darin, esprehn+autocc, ggaren, gyuyoung.kim, kangil.han, kling, rniwa, xqhuang.webkit, zan
Priority: P1    
Version: 528+ (Nightly build)   
Hardware: Unspecified   
OS: Unspecified   
Bug Depends on: 120584    
Bug Blocks:    
Attachments:
Description Flags
Patch without test case
none
WIP suggestion according to comment #18
none
WIP
none
Patch kling: review+

Gyuyoung Kim
Reported 2013-08-26 03:33:02 PDT
As mentioned in https://bugs.webkit.org/show_bug.cgi?id=119951#c13, HTMLUnknownElement can own specific tag(e.g. audiotag, videoTag and so on) though it isn't correct element class. In this case, isHTMLXXXElement() returns "true" though it is HTMLUnknowElement. PassRefPtr<HTMLElement> HTMLElementFactory::createHTMLElement(const QualifiedName& qName, Document* document, HTMLFormElement* formElement, bool createdByParser) { if (!document) return 0; #if ENABLE(CUSTOM_ELEMENTS) if (document->registry()) { if (RefPtr<CustomElementConstructor> constructor = document->registry()->find(nullQName(), qName)) { RefPtr<Element> element = constructor->createElement(); ASSERT(element->isHTMLElement()); return static_pointer_cast<HTMLElement>(element.release()); } } #endif if (!gFunctionMap) createFunctionMap(); if (ConstructorFunction function = gFunctionMap->get(qName.localName().impl())) { if (PassRefPtr<HTMLElement> element = function(qName, document, formElement, createdByParser)) return element; } return HTMLUnknownElement::create(qName, document);
Attachments
Patch without test case (3.56 KB, patch)
2013-08-26 07:35 PDT, Gyuyoung Kim
no flags
WIP suggestion according to comment #18 (3.90 KB, patch)
2013-08-27 01:48 PDT, Gyuyoung Kim
no flags
WIP (3.90 KB, patch)
2013-10-04 06:03 PDT, Gyuyoung Kim
no flags
Patch (5.22 KB, patch)
2013-10-05 00:22 PDT, Darin Adler
kling: review+
Gyuyoung Kim
Comment 1 2013-08-26 03:36:13 PDT
I wonder if we can add "unknownTag" for HTMLUnknownElement. Does anyone know if we can add it ?
Zan Dobersek
Comment 2 2013-08-26 04:42:24 PDT
I was later thinking of simply checking that, for the problematic elements, the HTMLElement is not a HTMLUnknownElement: inline bool isHTMLAudioElement(Node* node) { return node->hasTagName(HTMLNames::audioTag) && !toHTMLElement(node)->isHTMLUnknownElement(); }
Gyuyoung Kim
Comment 3 2013-08-26 05:21:25 PDT
(In reply to comment #2) > I was later thinking of simply checking that, for the problematic elements, the HTMLElement is not a HTMLUnknownElement: > > inline bool isHTMLAudioElement(Node* node) > { > return node->hasTagName(HTMLNames::audioTag) && !toHTMLElement(node)->isHTMLUnknownElement(); > } Yes, I also think we can fix this issue by using it. However, it that case, we may need to add additional condition to many isHTMLXXXElement() functions. If we can't add unknownTag, it would be alternative solution. :)
Gyuyoung Kim
Comment 4 2013-08-26 06:33:58 PDT
(In reply to comment #3) > (In reply to comment #2) > > I was later thinking of simply checking that, for the problematic elements, the HTMLElement is not a HTMLUnknownElement: > > > > inline bool isHTMLAudioElement(Node* node) > > { > > return node->hasTagName(HTMLNames::audioTag) && !toHTMLElement(node)->isHTMLUnknownElement(); > > } > > Yes, I also think we can fix this issue by using it. However, it that case, we may need to add additional condition to many isHTMLXXXElement() functions. If we can't add unknownTag, it would be alternative solution. :) It looks we can't add "unknown" attribute because it should own a tag which is defined in a page. Even if we define new "unknown" attribute, we make a new attribute without spec definition. So, I think we can fix this issue using adding additional condition to isHTMLXXXElement() functions.
Zan Dobersek
Comment 5 2013-08-26 06:50:04 PDT
The methods that need changing are not that many - only the ones that cast to an element of which the constructor in HTMLElementFactory can return 0.
Gyuyoung Kim
Comment 6 2013-08-26 07:04:06 PDT
(In reply to comment #5) > The methods that need changing are not that many - only the ones that cast to an element of which the constructor in HTMLElementFactory can return 0. Yes, right. Even three HTMLElement classes only have isHTMLXXXElement() functions. - HTMLSourceElement.h - HTMLTrackElement.h - HTMLContentElement.h I don't think we need to add isHTMLXXXElement() to other "return 0" classes which don't have the isHTMLXXXElement() in order to fix this problem at the moment.
Gyuyoung Kim
Comment 7 2013-08-26 07:35:28 PDT
Created attachment 209654 [details] Patch without test case
Gyuyoung Kim
Comment 8 2013-08-26 07:36:19 PDT
Let me try to add a test tomorrow.
Zan Dobersek
Comment 9 2013-08-26 07:50:52 PDT
I've posted one test case (for the audio element) back in bug #119951.
Gyuyoung Kim
Comment 10 2013-08-26 08:04:10 PDT
(In reply to comment #9) > I've posted one test case (for the audio element) back in bug #119951. If you don't mind, can I use it ? I will add your name to ChangeLog as well.
Zan Dobersek
Comment 11 2013-08-26 08:31:17 PDT
(In reply to comment #10) > (In reply to comment #9) > > I've posted one test case (for the audio element) back in bug #119951. > > If you don't mind, can I use it ? I will add your name to ChangeLog as well. Sure. Test cases for other elements (source, track) should work pretty much the same. I haven't looked into how the crash with HTMLContentElement could be produced.
Geoffrey Garen
Comment 12 2013-08-26 09:29:40 PDT
There are 1305 uses of hasTagName() in WebKit. Are all of them wrong, since they might accidentally be true for an HTMLUnknownElement? What patch introduced this behavior?
Geoffrey Garen
Comment 13 2013-08-26 09:31:45 PDT
Patching this in just one or two places is probably the wrong solution, since it doesn't address the fundamental problem that any line of code that tests for tag name might allow an HTMLUnknownElement through.
Chris Dumez
Comment 14 2013-08-26 09:43:47 PDT
Comment on attachment 209654 [details] Patch without test case View in context: https://bugs.webkit.org/attachment.cgi?id=209654&action=review > Source/WebCore/html/HTMLSourceElement.h:-67 > - return element->hasTagName(HTMLNames::sourceTag); We can only get an HTMLUnknownElement for sourceTag if VIDEO is disabled at compile time. Why not simply do: #if (VIDEO) return element->hasTagName(HTMLNames::sourceTag) #else UNUSED_PARAM(element); return false; #endif > Source/WebCore/html/HTMLTrackElement.h:102 > + return node->hasTagName(HTMLNames::trackTag) && !toHTMLElement(node)->isHTMLUnknownElement(); Ditto with VIDEO_TRACK flag > Source/WebCore/html/HTMLTrackElement.h:107 > + return element->hasTagName(HTMLNames::trackTag) && !toHTMLElement(element)->isHTMLUnknownElement(); Ditto
Chris Dumez
Comment 15 2013-08-26 09:58:41 PDT
Comment on attachment 209654 [details] Patch without test case View in context: https://bugs.webkit.org/attachment.cgi?id=209654&action=review >> Source/WebCore/html/HTMLSourceElement.h:-67 >> - return element->hasTagName(HTMLNames::sourceTag); > > We can only get an HTMLUnknownElement for sourceTag if VIDEO is disabled at compile time. Why not simply do: > #if (VIDEO) > return element->hasTagName(HTMLNames::sourceTag) > #else > UNUSED_PARAM(element); > return false; > #endif BTW, this looks like a good reason to generate those isXXXElement functions. It is bug prone otherwise.
Gyuyoung Kim
Comment 16 2013-08-26 18:57:17 PDT
(In reply to comment #13) > Patching this in just one or two places is probably the wrong solution, since it doesn't address the fundamental problem that any line of code that tests for tag name might allow an HTMLUnknownElement through. I wanted to solve this issue by fixing root cause. So, I thought that HTMLUnknownElement() needs to have own tag name in order to do fix it. However, it looks it is spec violation. In this case, problem is that HTMLUnknownElement can have valid element. (It only can have audioTag, sourceTag, trackTag, videoTag, contentElement and dialogTag.) Then, how about setting qName as null as below ?, or do you think we can define new tag for this case ? if (ConstructorFunction function = gFunctionMap->get(qName.localName().impl())) { if (PassRefPtr<HTMLElement> element = function(qName, document, formElement, createdByParser)) return element; else qName = 0 or new tag; } return HTMLUnknownElement::create(qName, document);
Gyuyoung Kim
Comment 17 2013-08-26 19:05:04 PDT
Comment on attachment 209654 [details] Patch without test case View in context: https://bugs.webkit.org/attachment.cgi?id=209654&action=review >>> Source/WebCore/html/HTMLSourceElement.h:-67 >>> - return element->hasTagName(HTMLNames::sourceTag); >> >> We can only get an HTMLUnknownElement for sourceTag if VIDEO is disabled at compile time. Why not simply do: >> #if (VIDEO) >> return element->hasTagName(HTMLNames::sourceTag) >> #else >> UNUSED_PARAM(element); >> return false; >> #endif > > BTW, this looks like a good reason to generate those isXXXElement functions. It is bug prone otherwise. We need to consider HTMLElementFactory return 0 with a tag. However, it looks some ctor functions can return 0 when the macro is enabled at compile time. So, It don't think we can avoid this problem when using ENABLE() macro. In WebKitBuild/Release/DerivedSources/WebCore/HTMLElementFactory.cpp #if ENABLE(SHADOW_DOM) static PassRefPtr<HTMLElement> contentConstructor(const QualifiedName& tagName, Document* document, HTMLFormElement*, bool) { if (!RuntimeEnabledFeatures::shadowDOMEnabled()) return 0; return HTMLContentElement::create(tagName, document); } #endif #if ENABLE(DIALOG_ELEMENT) static PassRefPtr<HTMLElement> dialogConstructor(const QualifiedName& tagName, Document* document, HTMLFormElement*, bool) { if (!ContextFeatures::dialogElementEnabled(document)) return 0; return HTMLDialogElement::create(tagName, document); } #endif #if ENABLE(VIDEO) static PassRefPtr<HTMLElement> sourceConstructor(const QualifiedName& tagName, Document* document, HTMLFormElement*, bool) { Settings* settings = document->settings(); if (!MediaPlayer::isAvailable() || (settings && !settings->mediaEnabled())) return 0; return HTMLSourceElement::create(tagName, document); } #endif ...
Gyuyoung Kim
Comment 18 2013-08-26 21:26:21 PDT
(In reply to comment #16) > Then, how about setting qName as null as below ?, or do you think we can define new tag for this case ? > > if (ConstructorFunction function = gFunctionMap->get(qName.localName().impl())) { > if (PassRefPtr<HTMLElement> element = function(qName, document, formElement, createdByParser)) > return element; > else > qName = 0 or new tag; > } > > return HTMLUnknownElement::create(qName, document); qName can't be changed because it is const. So, we may try to return HTMLUnknownElement with a null QualifiedName() as below, else return HTMLUnknownElement::create(QualifiedName(nullAtom, nullAtom, nullAtom), document); return HTMLUnknownElement::create(qName, document);
Chris Dumez
Comment 19 2013-08-26 23:53:27 PDT
(In reply to comment #17) > (From update of attachment 209654 [details]) > View in context: https://bugs.webkit.org/attachment.cgi?id=209654&action=review > > >>> Source/WebCore/html/HTMLSourceElement.h:-67 > >>> - return element->hasTagName(HTMLNames::sourceTag); > >> > >> We can only get an HTMLUnknownElement for sourceTag if VIDEO is disabled at compile time. Why not simply do: > >> #if (VIDEO) > >> return element->hasTagName(HTMLNames::sourceTag) > >> #else > >> UNUSED_PARAM(element); > >> return false; > >> #endif > > > > BTW, this looks like a good reason to generate those isXXXElement functions. It is bug prone otherwise. > > We need to consider HTMLElementFactory return 0 with a tag. However, it looks some ctor functions can return 0 when the macro is enabled at compile time. So, It don't think we can avoid this problem when using ENABLE() macro. > > In WebKitBuild/Release/DerivedSources/WebCore/HTMLElementFactory.cpp > > #if ENABLE(SHADOW_DOM) > > static PassRefPtr<HTMLElement> contentConstructor(const QualifiedName& tagName, Document* document, HTMLFormElement*, bool) > { > if (!RuntimeEnabledFeatures::shadowDOMEnabled()) > return 0; > return HTMLContentElement::create(tagName, document); > } > > #endif > > #if ENABLE(DIALOG_ELEMENT) > > static PassRefPtr<HTMLElement> dialogConstructor(const QualifiedName& tagName, Document* document, HTMLFormElement*, bool) > { > if (!ContextFeatures::dialogElementEnabled(document)) > return 0; > return HTMLDialogElement::create(tagName, document); > } > > #endif > > #if ENABLE(VIDEO) > > static PassRefPtr<HTMLElement> sourceConstructor(const QualifiedName& tagName, Document* document, HTMLFormElement*, bool) > { > Settings* settings = document->settings(); > if (!MediaPlayer::isAvailable() || (settings && !settings->mediaEnabled())) > return 0; > > return HTMLSourceElement::create(tagName, document); > } > > #endif > > ... Right, is some cases the feature is enabled at runtime, not simply compile time. However, since this factory is generated, this means we already have all the information we need to generate the isHTML*Element() functions, rignt?
Gyuyoung Kim
Comment 20 2013-08-27 00:02:24 PDT
(In reply to comment #19) > > Right, is some cases the feature is enabled at runtime, not simply compile time. However, since this factory is generated, this means we already have all the information we need to generate the isHTML*Element() functions, rignt? I'm not sure if we should generate isHTML*Element() for all tags at the moment. However, I think we need to support isHTML*Element() for 'return 0' ctor at least.
Chris Dumez
Comment 21 2013-08-27 00:13:24 PDT
(In reply to comment #20) > (In reply to comment #19) > > > > Right, is some cases the feature is enabled at runtime, not simply compile time. However, since this factory is generated, this means we already have all the information we need to generate the isHTML*Element() functions, rignt? > > I'm not sure if we should generate isHTML*Element() for all tags at the moment. However, I think we need to support isHTML*Element() for 'return 0' ctor at least. Can you explain why you don't want to generate them? From what I can see, the isHTML*Element() functions code needs to match what is in an already generated file (the HTMLElementFactory). Since we are able to generate the HTMLElementFactory already, it should be trivial to generate the isHTML*Element() functions. However, doing this work manually seems risky, bug prone and difficult to maintain.
Gyuyoung Kim
Comment 22 2013-08-27 00:20:52 PDT
(In reply to comment #21) > (In reply to comment #20) > > (In reply to comment #19) > > > > > > Right, is some cases the feature is enabled at runtime, not simply compile time. However, since this factory is generated, this means we already have all the information we need to generate the isHTML*Element() functions, rignt? > > > > I'm not sure if we should generate isHTML*Element() for all tags at the moment. However, I think we need to support isHTML*Element() for 'return 0' ctor at least. > > Can you explain why you don't want to generate them? There was concerns when we contributed isFooElement() to blink. One is some C++ Element subclasses represent multiple tag names. e.g. HTMLQuoteElement represents <blockquote> and <q>, however, hasTagName(blockquoteTag) and hasTagName(qTag) are not always checked together. We can't replace all of hasTagName(blockquoteTag) with isHTMLQuoteElement() Other is to add "#include "FooElement.h" cause unnecessary dependency. HTML parser should avoid to depend on C++ element implementation class if possible.
Chris Dumez
Comment 23 2013-08-27 00:38:57 PDT
(In reply to comment #22) > (In reply to comment #21) > > (In reply to comment #20) > > > (In reply to comment #19) > > > > > > > > Right, is some cases the feature is enabled at runtime, not simply compile time. However, since this factory is generated, this means we already have all the information we need to generate the isHTML*Element() functions, rignt? > > > > > > I'm not sure if we should generate isHTML*Element() for all tags at the moment. However, I think we need to support isHTML*Element() for 'return 0' ctor at least. > > > > Can you explain why you don't want to generate them? > > There was concerns when we contributed isFooElement() to blink. > > One is some C++ Element subclasses represent multiple tag names. e.g. HTMLQuoteElement represents <blockquote> and <q>, however, hasTagName(blockquoteTag) and hasTagName(qTag) are not always checked together. We can't replace all of hasTagName(blockquoteTag) with isHTMLQuoteElement() This seems like an argument not to use the isHTML*Element() in some cases, not an argument against generating the isHTML*Element() functions. I mean, does this statement ever affect the code you write for isHTML*Element()? > Other is to add "#include "FooElement.h" cause unnecessary dependency. HTML parser should avoid to depend on C++ element implementation class if possible. Actually, if you generate those isHTML*element() functions, they will likely all be in the same file. e.g. HTMLElementHelpers.h or something like that. And as far as I can see, this file would not need to include any FooElement.h, only HTMLNames.h and likely RuntimeEnabledFeatures.h. And again, if we don't want to add include in one place, well, we don't have to use the generated isHTML*Element() functions. The fact that they are generated and available does not mandate that you need to use them everywhere. I am adding a few people in CC as I am curious what WebKit people think about generating these.
Zan Dobersek
Comment 24 2013-08-27 01:01:58 PDT
I'm all for generating the is*Element() and to*Element() functions. Since there are elements for which these helpers are not required, perhaps we could specifically annotate the elements in HTMLTagNames.in that should have them generated. I guess similar could be done for the SVG elements, in svgtags.in.
Gyuyoung Kim
Comment 25 2013-08-27 01:13:44 PDT
(In reply to comment #24) > I'm all for generating the is*Element() and to*Element() functions. Since there are elements for which these helpers are not required, perhaps we could specifically annotate the elements in HTMLTagNames.in that should have them generated. If we can specify which element needs to have isFooElement() or toFooElement(), we may generate the needed isFooElement() and toFooElement(). > I guess similar could be done for the SVG elements, in svgtags.in. If we can adjust the generation into HTML elements, IMHO, we can do it on SVG as well.
Gyuyoung Kim
Comment 26 2013-08-27 01:48:40 PDT
Created attachment 209726 [details] WIP suggestion according to comment #18
Gyuyoung Kim
Comment 27 2013-08-27 01:50:39 PDT
(In reply to comment #26) > Created an attachment (id=209726) [details] > WIP suggestion according to comment #18 I would like to know how do you think to use this suggestion instead of modifying isHTML*Element().
Chris Dumez
Comment 28 2013-08-27 02:19:42 PDT
Comment on attachment 209726 [details] WIP suggestion according to comment #18 View in context: https://bugs.webkit.org/attachment.cgi?id=209726&action=review > Source/WebCore/dom/make_names.pl:955 > + return $parameters{fallbackInterfaceName}::create(QualifiedName(nullAtom, nullAtom, nullAtom), document); what does the factory code look like with this change? It is not obvious for me.
Gyuyoung Kim
Comment 29 2013-08-27 05:08:48 PDT
(In reply to comment #28) > (From update of attachment 209726 [details]) > View in context: https://bugs.webkit.org/attachment.cgi?id=209726&action=review > > > Source/WebCore/dom/make_names.pl:955 > > + return $parameters{fallbackInterfaceName}::create(QualifiedName(nullAtom, nullAtom, nullAtom), document); > > what does the factory code look like with this change? It is not obvious for me. In HTMLElementFactory::createHTMLElement(), the factory function creates new element. However, as I said many times, some creation functions can return 0. In that case, element is null. then the factory function returns a HTMLUnknownElement instance with valid tags(e.g. audioTag, videoTag, trackTag and so on) if (ConstructorFunction function = gFunctionMap->get(qName.localName().impl())) { if (PassRefPtr<HTMLElement> element = function(qName, document, formElement, createdByParser)) return element; } return HTMLUnknownElement::create(qName, document); // audioConstructor static PassRefPtr<HTMLElement> audioConstructor(const QualifiedName& tagName, Document* document, HTMLFormElement*, bool createdByParser) { Settings* settings = document->settings(); if (!MediaPlayer::isAvailable() || (settings && !settings->mediaEnabled())) return 0; // audioConstructor may return 0. My second suggestion is that we return HTMLUnknownElement with null tag name because this isn't an unknown situation. This case is that element creation is failed. So, my suggestion is to consider to return HTMLUnknownElement() with null tag. As far as I understand, HTMLUnknownElement supports tags out of specification, for example, <foo1></foo1>, <stupid></stupid> and so on. But, this case is not the situation for it.
Zan Dobersek
Comment 30 2013-09-02 03:11:25 PDT
Bug #120584 is working on generating the is*Element() checks. I think we should work on top of that.
Gyuyoung Kim
Comment 31 2013-09-02 03:29:59 PDT
(In reply to comment #30) > Bug #120584 is working on generating the is*Element() checks. I think we should work on top of that. ok, let's work on this after landing it. BTW, current test case doesn't make a crash on EFL port. I'm taking a look it.
Xueqing Huang
Comment 32 2013-09-23 02:43:39 PDT
(In reply to comment #31) > (In reply to comment #30) > > Bug #120584 is working on generating the is*Element() checks. I think we should work on top of that. > > ok, let's work on this after landing it. BTW, current test case doesn't make a crash on EFL port. I'm taking a look it. Windows port could reproduce the crash caused by this issue. HTMLUnknownElement override |isHTMLUnknownElement| and return true, I suggest check whether an element was a HTMLUnknownElement or not via isHTMLUnknownElement in |isHTML*Element()|. e.g: bool isHTMLAudioElement(const Element& element) { return element.hasTagName(HTMLNames::audioTag) && !isHTMLUnknownElement(element); }
Xueqing Huang
Comment 33 2013-09-23 02:45:04 PDT
*** Bug 121537 has been marked as a duplicate of this bug. ***
Darin Adler
Comment 34 2013-09-23 09:32:59 PDT
(In reply to comment #2) > I was later thinking of simply checking that, for the problematic elements, the HTMLElement is not a HTMLUnknownElement: > > inline bool isHTMLAudioElement(Node* node) > { > return node->hasTagName(HTMLNames::audioTag) && !toHTMLElement(node)->isHTMLUnknownElement(); > } Yes, I think this is exactly what we want to do, only for the elements that can be affected by this.
Darin Adler
Comment 35 2013-09-23 09:34:11 PDT
(In reply to comment #29) > However, as I said many times, some creation functions can return 0. In that case, element is null. Exactly. We will need code to check for unknown elements in the isXXX function for any of the creation functions that can return nullptr. And we should minimize our use of this technique. It’s not really a good pattern.
Gyuyoung Kim
Comment 36 2013-10-03 08:49:27 PDT
Hmm, crash doesn't occurs on existing test. It looks this crash was fixed indirectly. I will check if this crash is really fixed. Can anyone reproduce this crash now ?
Darin Adler
Comment 37 2013-10-03 12:35:06 PDT
I don’t see evidence that the isHTMLAudioElement function has been fixed. The script that generates constructors and isHTMLAudioElement functions still seems to be checking MediaPlayer::isAvailable and settings && !settings->mediaEnabled() in the audio element constructor and in the audio element createWrapper function, but not in the isHTMLAudioElement function. From what I see from code inspection, this still needs to be fixed.
Zan Dobersek
Comment 38 2013-10-03 13:57:19 PDT
I can still reproduce this crash on the GTK port with running the test case I've attached in bug #119951 through either DumpRenderTree or WebKitTestRunner. Things basically go FUBAR when WebCore::JSNodeOwner::isReachableFromOpaqueRoots is reached during the GC and the isHTMLAudioElement() check returns a false positive in the isReachableFromDOM function.
Gyuyoung Kim
Comment 39 2013-10-04 06:03:42 PDT
Gyuyoung Kim
Comment 40 2013-10-04 06:08:47 PDT
First of all, sorry for too late update. BTW, I'm suspecting if we need to return a fallback element when MediaPlayer isn't available. Besides there was a similar patch for V8 binding. https://bugs.webkit.org/show_bug.cgi?id=103431 Unfortunately, I have a reproduce problem because of my env problem. I will re-submit a new patch after fixing my env problem.
Darin Adler
Comment 41 2013-10-05 00:02:32 PDT
I’ll fix this.
Darin Adler
Comment 42 2013-10-05 00:22:30 PDT
WebKit Commit Bot
Comment 43 2013-10-05 00:24:59 PDT
Attachment 213445 [details] did not pass style-queue: Failed to run "['Tools/Scripts/check-webkit-style', '--diff-files', u'Source/WebCore/ChangeLog', u'Source/WebCore/dom/make_names.pl', u'Source/WebCore/html/HTMLElement.h']" exit_code: 1 Source/WebCore/html/HTMLElement.h:147: Alphabetical sorting problem. [build/include_order] [4] Total errors found: 1 in 3 files If any of these errors are false positives, please file a bug against check-webkit-style.
Andreas Kling
Comment 44 2013-10-05 00:53:17 PDT
Comment on attachment 213445 [details] Patch r=me The previous patch on this bug had a layout test. We should make sure to add it as well, assuming it works.
Gyuyoung Kim
Comment 45 2013-10-05 06:48:58 PDT
Darin, please land after fixing style error.
Darin Adler
Comment 46 2013-10-05 06:52:13 PDT
(In reply to comment #45) > Darin, please land after fixing style error. That’s not a style error. That’s the style script incorrectly complaining about an include that is not not part of the normal includes at the top of the file.
Darin Adler
Comment 47 2013-10-05 06:52:53 PDT
(In reply to comment #44) > The previous patch on this bug had a layout test. We should make sure to add it as well, assuming it works. I’ll add the layout test and check that it demonstrates the bug before I land.
Darin Adler
Comment 48 2013-10-05 08:00:33 PDT
Note You need to log in before you can comment on or make changes to this bug.