Uploaded image for project: 'Wicket'
  1. Wicket
  2. WICKET-4061

Invalid listener url generated for nested components that have an id which starts with a dash

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Minor
    • Resolution: Fixed
    • Affects Version/s: 1.5.0
    • Fix Version/s: 1.5.1
    • Component/s: wicket
    • Labels:
      None

      Description

      I have a very simple hierarchy:

      WebMarkupContainer with id "-nav-container"
      nested RepeatingView with id "-nav"
      ... which contains a link with id "link"

      HTML:
      <div id="layout-nav" wicket:id="-nav-container">
      <ul>
      <li wicket:id="-nav"><a href="#" wicket:id="link"><span wicket:id="name">Tab name</span></a></li>
      </ul>
      </div>

      On page render I get a link like "wicket/page?3-1.ILinkListener--navcontainer--nav-1-link".
      When clicking this link I get:

      Could not find component 'nav-container:nav:1:link' on page x.y.Z

      Note the dash after -nav-container, which should not be there.
      Also note the missing dash before nav.

      It appears the dash shifts to the left in the encoding or decoding phase of the code that generates/handles a url for ILinkListener.INTERFACE.

      Removing the starting dash from the RepeatingView's id solves the problem.
      However, if this is considered normal behaviour (dashed not allowed in componend ids) it needs to be documented.

        Activity

        Hide
        bgooren Sebastian Gooren added a comment -

        Ok, I found the problem. It's the way ComponentInfo handles encoding and decoding the component path.

        During the encode phase "ILinkListener:-nav-container:-nav:1:link" becomes the above.

        However, on decode a set of three dashes causes a problem. The decoder no longer sees the difference between the encoded version of:

        (a) :-
        (b) -:

        Both become three dashes when encoding, and on decoding always become (b).
        This only occurs for nested components which have an id that starts with a dash.

        In most of my apps one or more dashes in component ids are not uncommon, so this causes applications to break when upgrading to 1.5.

        Show
        bgooren Sebastian Gooren added a comment - Ok, I found the problem. It's the way ComponentInfo handles encoding and decoding the component path. During the encode phase "ILinkListener:-nav-container:-nav:1:link" becomes the above. However, on decode a set of three dashes causes a problem. The decoder no longer sees the difference between the encoded version of: (a) :- (b) -: Both become three dashes when encoding, and on decoding always become (b). This only occurs for nested components which have an id that starts with a dash. In most of my apps one or more dashes in component ids are not uncommon, so this causes applications to break when upgrading to 1.5.
        Hide
        ivaynberg Igor Vaynberg added a comment -

        ~ is now used to encode -
        ~ is allowed not-encoded in the query string and is a lot less likely to be used by the user in component ids compared to the dash

        Show
        ivaynberg Igor Vaynberg added a comment - ~ is now used to encode - ~ is allowed not-encoded in the query string and is a lot less likely to be used by the user in component ids compared to the dash

          People

          • Assignee:
            ivaynberg Igor Vaynberg
            Reporter:
            bgooren Sebastian Gooren
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development