Uploaded image for project: 'ZK'
  1. ZK
  2. ZK-3554

Tooltip/Popup/Context ignoring usage errors

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Normal
    • Resolution: Fixed
    • Affects Version/s: 8.0.3
    • Fix Version/s: 8.5.0
    • Component/s: Components
    • Security Level: Jimmy
    • Labels:
      None

      Description

      Steps to Reproduce

      run the example
      right-click the buttons to show context menus

      Actual Result

      the button labeled "EL context id WRONG usage" does not show up a context menu
      other buttons work

      Expected Result

      if a component is used incorrectly the user should get an error message or coerce the context/popup/tooltip ID to a string if not an instance of Popup

      Debug Info

      in this example the ID for the context menu is created from an integer variable
      While the menupopup receives the correct ID (int is coerced to string) the context attribute of the button ignores the integer value without converting or showing an error message

      Root Cause

      side effect of the implementation for since ZK-3044
      https://github.com/zkoss/zk/commit/20a7ac1c16ebacb58e163f71a5d41ed499487b78#diff-f7e7e86e183d469645504277a38176d5R356

      The implementation correctly handles the types String and Popup but ignores anything else without warning or error message.
      On the other hand when setting the menupopup ID using the same EL it the conversion to String happens automatically.
      So instead of producing a warning the implementation could also do something like this:

      _properties.put("context", new ObjectPropertyAccess() {
      	public void setValue(Component cmp, Object context) {
      		if (context instanceof Popup)
      			((XulElement) cmp).setContext((Popup) context);
      		else ((XulElement) cmp).setContext(String.valueOf(context)); //maybe requires a null-check too
      	}
      
      	public String getValue(Component cmp) {
      		return ((XulElement) cmp).getContext();
      	}
      });
      
      

      Workaround

      convert the value to a String manually
      e.g. by string concatenation:

      <button context="${('' += contextId)}"/>
      

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              bobpeng bobpeng
              Reporter:
              cor3000 cor3000
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved:

                  Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - 0 minutes
                  0m
                  Logged:
                  Time Spent - 4 hours
                  4h