Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: EE-3.3.0.GA_P02, 4.0
    • Fix Version/s: EE-4.0.0.GA, EE-3.3.0.GA_P03, 4.1
    • Component/s: Framework
    • Labels:
      None
    • Environment:
      IE8
    • Assignee Priority:
      P2
    • Support Case References:
    • Workaround Exists:
      Yes
    • Workaround Description:
      Use redirect navigation, or possibly add ice: components to the page to avoid the HEAD region update (ice comps could be hidden).

      Description

      IE8 is crashing when doing a forward navigation to a page that has an outputText with escape=false. This outputText does have a special character in it "<".

      This happens with both the ice:outputText and the h:outputText. There are no errors or exceptions thrown, just IE crashes.

        Activity

        Hide
        Arran Mccullough added a comment -

        Attached test case that shows this issue.

        Steps:

        • Load test.jsf in IE8
        • Click the button on the page to execute a forward.
        • IE8 will now crash.
        Show
        Arran Mccullough added a comment - Attached test case that shows this issue. Steps: Load test.jsf in IE8 Click the button on the page to execute a forward. IE8 will now crash.
        Hide
        Mircea Toma added a comment -

        The crash is triggered by a call to the body element's hasAttribute method in Mojarra's client code. The crash occurs only when the body element is not yet part of the page's document.
        To avoid this crash one should make sure the DOM diff update would not propagate to the document's body. This can be easily achieved by wrapping the markup that changes during the forward with a div element that has an ID attribute defined.

        Show
        Mircea Toma added a comment - The crash is triggered by a call to the body element's hasAttribute method in Mojarra's client code. The crash occurs only when the body element is not yet part of the page's document. To avoid this crash one should make sure the DOM diff update would not propagate to the document's body. This can be easily achieved by wrapping the markup that changes during the forward with a div element that has an ID attribute defined.
        Hide
        Mircea Toma added a comment - - edited

        test.xhtml page

        <h:body>
            <div id="an-id">
                <h:form id="form" >
                    <h:commandButton value="Set attribs" 												
                                     action="/test2.jsf"></h:commandButton>        
                </h:form>     
            </div>   
        </h:body>
        

        test2.xhtml page

        <h:body>
            <div id="an-id">
                <!--<ice:outputText value="#{testBean.value}" escape="false" />-->
                <h:outputText value="#{testBean.value}" escape="false" />
            </div>
        </h:body>
        
        Show
        Mircea Toma added a comment - - edited test.xhtml page <h:body> <div id= "an-id" > <h:form id= "form" > <h:commandButton value= "Set attribs" action= "/test2.jsf" ></h:commandButton> </h:form> </div> </h:body> test2.xhtml page <h:body> <div id= "an-id" > <!--<ice:outputText value= "#{testBean.value}" escape= " false " />--> <h:outputText value= "#{testBean.value}" escape= " false " /> </div> </h:body>
        Hide
        Arran Mccullough added a comment -

        Issue still remains when using an ice:commandButton in test.xhtml instead of the h:commandButton.

            <h:body >
                <div id="an-id">
                    <h:form id="form" >
                        <ice:commandButton value="Set attribs" 												
                                         action="/test2.jsf"></ice:commandButton>        
                    </h:form>
                </div>
            </h:body>
        
        Show
        Arran Mccullough added a comment - Issue still remains when using an ice:commandButton in test.xhtml instead of the h:commandButton. <h:body > <div id= "an-id" > <h:form id= "form" > <ice:commandButton value= "Set attribs" action= "/test2.jsf" ></ice:commandButton> </h:form> </div> </h:body>
        Hide
        Mircea Toma added a comment -

        Did you make sure the div is added to both test.xhtml and test2.xhtml?

        Show
        Mircea Toma added a comment - Did you make sure the div is added to both test.xhtml and test2.xhtml ?
        Hide
        Arran Mccullough added a comment -

        I did and it is. I'll upload the current source code.

        Show
        Arran Mccullough added a comment - I did and it is. I'll upload the current source code.
        Hide
        Mircea Toma added a comment -

        Arran, is the workaround I proposed functional for you? I re-tested and it works well on my machine.

        Show
        Mircea Toma added a comment - Arran, is the workaround I proposed functional for you? I re-tested and it works well on my machine.
        Hide
        Arran Mccullough added a comment -

        It is functional only with the standard JSF components. When using the same ICE compat components I still see the issue. I just checked and I also changed the h:outputText on test2.xhtml to an ice:outputText, the zip attachment should have this code change.

        Show
        Arran Mccullough added a comment - It is functional only with the standard JSF components. When using the same ICE compat components I still see the issue. I just checked and I also changed the h:outputText on test2.xhtml to an ice:outputText, the zip attachment should have this code change.
        Hide
        Mircea Toma added a comment -

        Defined icefaces-compat.js and compat.js resources as dependencies for ice:outputText component. This ensures that whenever an ice:* component is used the basic set of resources are loaded and thus full document updates are avoided during forward navigation.

        Show
        Mircea Toma added a comment - Defined icefaces-compat.js and compat.js resources as dependencies for ice:outputText component. This ensures that whenever an ice:* component is used the basic set of resources are loaded and thus full document updates are avoided during forward navigation.
        Hide
        Arran Mccullough added a comment -

        Thanks Mircea for this fix. I just tested the code and it looks good for the ice:commandButton forward to an ice:outputText scenario.

        It is still crashing for an ice:commanButton to h:outputText scenario. Here is the code used:

        test.xhtml

        <h:body >
        <div id="an-id">
        <h:form id="form" >
        <ice:commandButton value="Set attribs"
        action="/test2.jsf"></ice:commandButton>
        </h:form>
        </div>
        </h:body>

        test2.xhtml

        <h:body>
        <div id="an-id">
        <h:outputText value="#

        {testBean.value}

        " escape="false" />
        </div>
        </h:body>

        Show
        Arran Mccullough added a comment - Thanks Mircea for this fix. I just tested the code and it looks good for the ice:commandButton forward to an ice:outputText scenario. It is still crashing for an ice:commanButton to h:outputText scenario. Here is the code used: test.xhtml <h:body > <div id="an-id"> <h:form id="form" > <ice:commandButton value="Set attribs" action="/test2.jsf"></ice:commandButton> </h:form> </div> </h:body> test2.xhtml <h:body> <div id="an-id"> <h:outputText value="# {testBean.value} " escape="false" /> </div> </h:body>
        Hide
        Mircea Toma added a comment - - edited

        Well, the last commit was not made to fix a problem but more for convenience, to avoid running in this corner case. The reason why you still see the crash is due once again to the update of the entire 'body' element in the page. This makes IE crash. When you navigate from one page that has ice:* components to one that doesn't an update is generated for the 'head' element to remove icefaces-compat.js and compat.js resources (same thing happened for ice:outputText which used to not require the compat resources). A 'head' element update will in turn trigger an update for the entire document, but in 3.3 we send only the update for the 'body' and optionally a separate update for the 'head'.
        In conclusion I cannot fix this issue entirely, you (or the client) will have to setup the pages to avoid generating 'body' element updates. This might mean inserting ice:* components in the destination page just to avoid the changing the list of referenced resources in the 'head'. Defining mandatory resources would be another workaround.

        Show
        Mircea Toma added a comment - - edited Well, the last commit was not made to fix a problem but more for convenience, to avoid running in this corner case. The reason why you still see the crash is due once again to the update of the entire 'body' element in the page. This makes IE crash. When you navigate from one page that has ice:* components to one that doesn't an update is generated for the 'head' element to remove icefaces-compat.js and compat.js resources (same thing happened for ice:outputText which used to not require the compat resources). A 'head' element update will in turn trigger an update for the entire document, but in 3.3 we send only the update for the 'body' and optionally a separate update for the 'head' . In conclusion I cannot fix this issue entirely, you (or the client) will have to setup the pages to avoid generating 'body' element updates. This might mean inserting ice:* components in the destination page just to avoid the changing the list of referenced resources in the 'head'. Defining mandatory resources would be another workaround.

          People

          • Assignee:
            Mircea Toma
            Reporter:
            Arran Mccullough
          • Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: