ICEfaces
  1. ICEfaces
  2. ICE-8922

Implement server-side determination of 'onElementUpdate' callback lists for each DOM update

    Details

    • Type: Improvement Improvement
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: EE-3.3.0.GA, 4.0.BETA, 4.0
    • Component/s: Bridge, Framework
    • Labels:
      None
    • Environment:
      ICEfaces framework, bridge
    • Assignee Priority:
      P2
    • Affects:
      Documentation (User Guide, Ref. Guide, etc.)

      Description

      Currently (3.2), when the bridge applies DOM updates it then scans all components looking for components with 'onElementUpdate' callbacks defined that are affected by the updated DOM region. This process occurs in JavaScript on the browser, and can be very expensive/slow particularly on IE7/8 browsers. This performance issue is preventing wide-scale adoption of the the onElementUpdate callback to improve JS memory cleanup in the ACE components.

      An improved implementation may be to compile a list of the components affected by a particular DOM update on the server, such that the bridge could then simply call each one's onElementUpdate callback in sequence and avoid the expensive searching through the component list on the browser. Presumably the callback list would be sent to the bridge as part of each DOM update message.

        Activity

        Ken Fyten created issue -
        Ken Fyten made changes -
        Field Original Value New Value
        Assignee Mircea Toma [ mircea.toma ]
        Fix Version/s 3.3 [ 10370 ]
        Assignee Priority P2 [ 10011 ]
        Hide
        Ted Goddard added a comment -

        This appears to directly defeat a variety of optimizations:
        client-side, it defeats the use of innerHTML, server-side it defeats
        DOM diff short circuits.

        If the number of listeners is "small", then for each listener we
        could store the DOM node before the update and check its DOM status
        (walk up to root) after the update is applied. If it is not in the DOM, the listener would be called. (The question is whether this works on IE; if there are difficulties, perhaps checking the root node for identity against the current root node would work.)

        Essentially we're trying to do this:

        https://developer.mozilla.org/en-US/docs/DOM/Mutation_events

        1.5x - 7x slowdown in DOM operations

        A server-side implementation of this would require substantial interaction with the "old" DOM, which is likely to be inefficient (this requirement was not realized when the server-side technique was originally proposed).

        The main point is that this listener technique should be avoided as much as possible.

        Show
        Ted Goddard added a comment - This appears to directly defeat a variety of optimizations: client-side, it defeats the use of innerHTML, server-side it defeats DOM diff short circuits. If the number of listeners is "small", then for each listener we could store the DOM node before the update and check its DOM status (walk up to root) after the update is applied. If it is not in the DOM, the listener would be called. (The question is whether this works on IE; if there are difficulties, perhaps checking the root node for identity against the current root node would work.) Essentially we're trying to do this: https://developer.mozilla.org/en-US/docs/DOM/Mutation_events 1.5x - 7x slowdown in DOM operations A server-side implementation of this would require substantial interaction with the "old" DOM, which is likely to be inefficient (this requirement was not realized when the server-side technique was originally proposed). The main point is that this listener technique should be avoided as much as possible.
        Hide
        Ted Goddard added a comment -

        The worst case for the server-side implementation is likely the cost of serializing the old DOM, so approximately 10% CPU overhead. This would be acceptable for some applications and would make client-side performance more deterministic in some cases.
        Note, however, that if a large number of components make use of onElementUpdate, even if the callbacks are determined server-side, iteration through these callbacks will remain a serious performance issue on some browsers.

        I am currently looking at two algorithm variants, either using attributes in old DOM or by using an auxiliary data structure and will add details shortly.

        Show
        Ted Goddard added a comment - The worst case for the server-side implementation is likely the cost of serializing the old DOM, so approximately 10% CPU overhead. This would be acceptable for some applications and would make client-side performance more deterministic in some cases. Note, however, that if a large number of components make use of onElementUpdate, even if the callbacks are determined server-side, iteration through these callbacks will remain a serious performance issue on some browsers. I am currently looking at two algorithm variants, either using attributes in old DOM or by using an auxiliary data structure and will add details shortly.
        Hide
        Mark Collette added a comment -

        A few weeks ago, Ted and I discussed a means of components writing a note into the server DOM where they register their client-side onElementUpdate callbacks. Each note would cause a count to increment for the ancestor elements. When a DOM update or delete is detected, then the server could recurse down into the update, collecting the element ids within it that are noted, and earlying out of the recursion when the counts drop to zero. The collected ids would be sent to the browser, where there would be a Map<id -> callback array>. If context param was set disabling the server acceleration feature, or the list was too long, then the server could send no list, and the browser would proceed with it's own existing detection mechanism.

        Show
        Mark Collette added a comment - A few weeks ago, Ted and I discussed a means of components writing a note into the server DOM where they register their client-side onElementUpdate callbacks. Each note would cause a count to increment for the ancestor elements. When a DOM update or delete is detected, then the server could recurse down into the update, collecting the element ids within it that are noted, and earlying out of the recursion when the counts drop to zero. The collected ids would be sent to the browser, where there would be a Map<id -> callback array>. If context param was set disabling the server acceleration feature, or the list was too long, then the server could send no list, and the browser would proceed with it's own existing detection mechanism.
        Ken Fyten made changes -
        Fix Version/s 3.4 [ 10770 ]
        Fix Version/s 3.3 [ 10370 ]
        Hide
        Ted Goddard added a comment -

        The following strategy would be straightforward to implement:

        • when a component requires onElementUpdate notification, data-onElementUpdate="true" is written to the root node of the component.
        • keep the old DOM for the duration of the duration of the current request (currently it is discarded once the diff is calculated)
        • for each update ajax edit operation, scan the old DOM for data-onElementUpdate and collect the IDs

        On the client we have two options. Use data-onElementUpdate="callback" where callback(id, context) would be invoked. This is the most memory efficient. Alternatively, maintain an id/callback table on the client where onElementUpdate IDs in the list invoke the stored callback. The storage of these callbacks is potentially large (due to DOM references) and has the potential to leak, so the declarative callback would be preferred.

        Show
        Ted Goddard added a comment - The following strategy would be straightforward to implement: when a component requires onElementUpdate notification, data-onElementUpdate="true" is written to the root node of the component. keep the old DOM for the duration of the duration of the current request (currently it is discarded once the diff is calculated) for each update ajax edit operation, scan the old DOM for data-onElementUpdate and collect the IDs On the client we have two options. Use data-onElementUpdate="callback" where callback(id, context) would be invoked. This is the most memory efficient. Alternatively, maintain an id/callback table on the client where onElementUpdate IDs in the list invoke the stored callback. The storage of these callbacks is potentially large (due to DOM references) and has the potential to leak, so the declarative callback would be preferred.
        Ken Fyten made changes -
        Assignee Priority P2 [ 10011 ] P3 [ 10012 ]
        Ken Fyten made changes -
        Assignee Priority P3 [ 10012 ] P2 [ 10011 ]
        Hide
        Mircea Toma added a comment - - edited

        Assuming we are going to use the marking of component root elements with data-onElementUpdate we still might run into performance problems:

        Lets say we have the following DOM update:

        .
              e1
            / | \
           e2 e3 e4 <-- component root
                 /\
                e5 e6
                |   |
                e7  e8
                    /\
                   e9 e10
        

        It seems there are two kind of searches that need to be executed in order to collect the IDs of the elements that are updated:

        a) If the entire markup of a component is included by the update a search needs to be made from the e1 down, e4 would be found as the marked root of a component. We then need to collect the IDs of all its children and send them to the bridge. On the bridge the IDs will be used to lookup the corresponding onElementUpdate callbacks (if there are any), and then execute them.

        b) If the update is just for the component subtree, lets say e6 then we need to check if e6 has a parent marked with data-onElementUpdate. If it does then once again collect the IDs of e6 children and send them to the bridge.

        As Ted mentioned the searches will need the old DOM document to find the IDs of the children elements of the root element in the update.

        We have cases when the old DOM does not exist but we still prepare a partial update. It is not clear how we would handle this, simply sending all the IDs in the update is expensive and still might mis certain elements since the previous DOM held by the browser could be different.

        The type of searches mentioned above will generate additional updates (the ones containing the IDs) proportional with the size of the update (bigger natural updates, more IDs sent).

        Avoiding the searches by using the data-onElementUpdate markers only for the elements that have a corresponding callback will put a lot of burden on the component developer to remember which element needs to be marked.

        Show
        Mircea Toma added a comment - - edited Assuming we are going to use the marking of component root elements with data-onElementUpdate we still might run into performance problems: Lets say we have the following DOM update: . e1 / | \ e2 e3 e4 <-- component root /\ e5 e6 | | e7 e8 /\ e9 e10 It seems there are two kind of searches that need to be executed in order to collect the IDs of the elements that are updated: a) If the entire markup of a component is included by the update a search needs to be made from the e1 down, e4 would be found as the marked root of a component. We then need to collect the IDs of all its children and send them to the bridge. On the bridge the IDs will be used to lookup the corresponding onElementUpdate callbacks (if there are any), and then execute them. b) If the update is just for the component subtree, lets say e6 then we need to check if e6 has a parent marked with data-onElementUpdate . If it does then once again collect the IDs of e6 children and send them to the bridge. As Ted mentioned the searches will need the old DOM document to find the IDs of the children elements of the root element in the update. We have cases when the old DOM does not exist but we still prepare a partial update. It is not clear how we would handle this, simply sending all the IDs in the update is expensive and still might mis certain elements since the previous DOM held by the browser could be different. The type of searches mentioned above will generate additional updates (the ones containing the IDs) proportional with the size of the update (bigger natural updates, more IDs sent). Avoiding the searches by using the data-onElementUpdate markers only for the elements that have a corresponding callback will put a lot of burden on the component developer to remember which element needs to be marked.
        Hide
        Ted Goddard added a comment -

        The complexity for the update of e6 arises because the onElementUpdate callback is expected for the update of e4 or any child of e4. Can the components be implemented so that they do not require the onElementUpdate if their child is modified, only if their root node is modified? Also, can the components be implemented so that they can perform appropriate cleanup given only the onElementUpdate callback with the ID of the component?

        Show
        Ted Goddard added a comment - The complexity for the update of e6 arises because the onElementUpdate callback is expected for the update of e4 or any child of e4. Can the components be implemented so that they do not require the onElementUpdate if their child is modified, only if their root node is modified? Also, can the components be implemented so that they can perform appropriate cleanup given only the onElementUpdate callback with the ID of the component?
        Hide
        Mircea Toma added a comment - - edited

        "Also, can the components be implemented so that they can perform appropriate cleanup given only the onElementUpdate callback with the ID of the component?"

        Well, in the component that use onElementUpdate callbacks I already see that they are used to a finer detail. Constraining how the callbacks to cover more coarse detail might very cause decrease performance.

        Anyway, this is a question for the component team...

        Show
        Mircea Toma added a comment - - edited "Also, can the components be implemented so that they can perform appropriate cleanup given only the onElementUpdate callback with the ID of the component?" Well, in the component that use onElementUpdate callbacks I already see that they are used to a finer detail. Constraining how the callbacks to cover more coarse detail might very cause decrease performance. Anyway, this is a question for the component team...
        Hide
        Mark Collette added a comment -

        Components might register their onElementUpdate on their root, or on their script's wrapper span, so don't make assumptions that it will be on the root element.

        Show
        Mark Collette added a comment - Components might register their onElementUpdate on their root, or on their script's wrapper span, so don't make assumptions that it will be on the root element.
        Hide
        Mark Collette added a comment -

        When components register their onElementUpdate for an element id, they could place an object that has a destroy() function inside the element's data-destroy attribute. These same components would render with the data-onElementUpdate marker in the server DOM. This way the framework could transmit the list of element ids that were updated which had data-onElementUpdate markers set, and the bridge could simply do the getElementById, find the data-destroy attribute's object and call destroy() on it, with no need for looking through lists. These components should probably pass some parameter into their onElementUpdate registration, so that they'd only be added to the lists when the server side acceleration is not available.

        Show
        Mark Collette added a comment - When components register their onElementUpdate for an element id, they could place an object that has a destroy() function inside the element's data-destroy attribute. These same components would render with the data-onElementUpdate marker in the server DOM. This way the framework could transmit the list of element ids that were updated which had data-onElementUpdate markers set, and the bridge could simply do the getElementById, find the data-destroy attribute's object and call destroy() on it, with no need for looking through lists. These components should probably pass some parameter into their onElementUpdate registration, so that they'd only be added to the lists when the server side acceleration is not available.
        Hide
        Ted Goddard added a comment -

        Naming this attribute data-component where the object has a destroy() method would allow a component state object for other purposes as well.

        Show
        Ted Goddard added a comment - Naming this attribute data-component where the object has a destroy() method would allow a component state object for other purposes as well.
        Hide
        Mark Collette added a comment -

        Depending on the time available to re-write components, data-destroy might contain the component object itself, or it might just be a separate enclosure object, and so be different than what we store for our widgetVar replacement.

        Show
        Mark Collette added a comment - Depending on the time available to re-write components, data-destroy might contain the component object itself, or it might just be a separate enclosure object, and so be different than what we store for our widgetVar replacement.
        Hide
        Mircea Toma added a comment - - edited

        Implemented server-side determination of the updated elements that potentially can have onElementUpdate callbacks registered on the client side. The method used is already described above, the only difference is that if the search through the parents succeeds in finding a marked element then the DSF starting from the updated element is no longer necessary.

        The components that are known to use onElementUpdate callbacks need now to mark the root of the generated markup by using ComponentUtils.enableOnElementUpdateNotify method.

        Show
        Mircea Toma added a comment - - edited Implemented server-side determination of the updated elements that potentially can have onElementUpdate callbacks registered on the client side. The method used is already described above, the only difference is that if the search through the parents succeeds in finding a marked element then the DSF starting from the updated element is no longer necessary. The components that are known to use onElementUpdate callbacks need now to mark the root of the generated markup by using ComponentUtils.enableOnElementUpdateNotify method.
        Hide
        Mircea Toma added a comment -

        The following components were modified so that their renderers mark the root element as being eligible (with all its children) for element update notifications: ace:checkboxButton, ace:linkButton, ace:dateTimeEntry, ace:dataTable, ace:submitMonitor, ace:themeSelect, ace:pushButton, ace:tableConfigPanel, ace:tree.

        Show
        Mircea Toma added a comment - The following components were modified so that their renderers mark the root element as being eligible (with all its children) for element update notifications: ace:checkboxButton, ace:linkButton, ace:dateTimeEntry, ace:dataTable, ace:submitMonitor, ace:themeSelect, ace:pushButton, ace:tableConfigPanel, ace:tree.
        Mircea Toma made changes -
        Status Open [ 1 ] Resolved [ 5 ]
        Resolution Fixed [ 1 ]
        Hide
        Mircea Toma added a comment -

        Here's is the algorithm used for collecting the IDs belonging to the elements that are updated:

        When an replace or remove update is detected the ID element of the update is used to lookup the original element into the old DOM. From this element a search is started down through its ancestors.

        If one of these ancestors is marked with data-elementupdate attribute then Element.getElementByTagName("*") is executed on the start element to eventually filter and collect the IDs of all children (regardless of depth).

        If the first type of search reaches the document root then it is assumed that the update includes the whole generated markup of one or more components. From the start element then a depth-first-search is executed until one or more children are found as being marked with data-elementupdate attribute. If marked elements are found their ID and the IDs of their children are collected to be sent to the bridge.

        Show
        Mircea Toma added a comment - Here's is the algorithm used for collecting the IDs belonging to the elements that are updated: When an replace or remove update is detected the ID element of the update is used to lookup the original element into the old DOM. From this element a search is started down through its ancestors. If one of these ancestors is marked with data-elementupdate attribute then Element.getElementByTagName("*") is executed on the start element to eventually filter and collect the IDs of all children (regardless of depth). If the first type of search reaches the document root then it is assumed that the update includes the whole generated markup of one or more components. From the start element then a depth-first-search is executed until one or more children are found as being marked with data-elementupdate attribute. If marked elements are found their ID and the IDs of their children are collected to be sent to the bridge.
        Repository Revision Date User Message
        ICEsoft Public SVN Repository #34473 Fri Apr 19 14:03:43 MDT 2013 mircea.toma ICE-8922 Revert changes until further test prove that everything works well.
        Files Changed
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/pushbutton/PushButtonRenderer.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/tree/TreeRenderer.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/themeselect/ThemeSelectRenderer.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/core/src/main/javascript/application.js
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/linkbutton/LinkButtonRenderer.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/datatable/DataTableRenderer.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/checkboxbutton/CheckboxButtonRenderer.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/core/src/main/java/org/icefaces/impl/context/DOMPartialViewContext.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/tableconfigpanel/TableConfigPanelRenderer.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/util/ComponentUtils.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/submitmonitor/SubmitMonitorRenderer.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/datetimeentry/DateTimeEntryRenderer.java
        Hide
        Ted Goddard added a comment -

        This sounds like a component is notified if the DOM is modified for any of the component's children. Isn't it sufficient to notify a component just when its root node is modified?

        Show
        Ted Goddard added a comment - This sounds like a component is notified if the DOM is modified for any of the component's children. Isn't it sufficient to notify a component just when its root node is modified?
        Hide
        Mark Collette added a comment -

        Components need only be notified when their registered element or an ancestor of it is updated/removed, not when a child is.

        Show
        Mark Collette added a comment - Components need only be notified when their registered element or an ancestor of it is updated/removed, not when a child is.
        Hide
        Ted Goddard added a comment -

        Re-opening the JIRA just to be clear on the ancestor/child aspect of notification.

        Show
        Ted Goddard added a comment - Re-opening the JIRA just to be clear on the ancestor/child aspect of notification.
        Ted Goddard made changes -
        Resolution Fixed [ 1 ]
        Status Resolved [ 5 ] Reopened [ 4 ]
        Repository Revision Date User Message
        ICEsoft Public SVN Repository #34502 Tue Apr 23 04:09:08 MDT 2013 mircea.toma ICE-8922 Implemented server-side determination of the updated elements that potentially can have onElementUpdate callbacks registered on the client side. The method used is already described above, the only difference is that if the search through the parents succeeds in finding a marked element then the DSF starting from the updated element is no longer necessary. The components that are known to use onElementUpdate callbacks need now to mark the root of the generated markup by using ComponentUtils.enableOnElementUpdateNotify method. Modified search algorithm to give up when starting element cannot be found into the oldDOM.
        Files Changed
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/pushbutton/PushButtonRenderer.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/tree/TreeRenderer.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/themeselect/ThemeSelectRenderer.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/core/src/main/javascript/application.js
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/linkbutton/LinkButtonRenderer.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/datatable/DataTableRenderer.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/checkboxbutton/CheckboxButtonRenderer.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/core/src/main/java/org/icefaces/impl/context/DOMPartialViewContext.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/tableconfigpanel/TableConfigPanelRenderer.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/util/ComponentUtils.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/submitmonitor/SubmitMonitorRenderer.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/datetimeentry/DateTimeEntryRenderer.java
        Hide
        Mircea Toma added a comment -

        Mark, I don't understand your last comment. The components are not notified, the elements renderer by a certain component might have their onElementUpdate callbacks invoked.

        Ted, what exactly is not clear in ancestor/child aspect? I did explain in here in my previous comment plus you can always look for more details into the code.

        Show
        Mircea Toma added a comment - Mark, I don't understand your last comment. The components are not notified, the elements renderer by a certain component might have their onElementUpdate callbacks invoked. Ted, what exactly is not clear in ancestor/child aspect? I did explain in here in my previous comment plus you can always look for more details into the code.
        Mircea Toma made changes -
        Status Reopened [ 4 ] Resolved [ 5 ]
        Resolution Fixed [ 1 ]
        Repository Revision Date User Message
        ICEsoft Public SVN Repository #34503 Tue Apr 23 04:19:50 MDT 2013 mircea.toma ICE-8922 Removed algorithm timing.
        Files Changed
        Commit graph MODIFY /icefaces3/trunk/icefaces/core/src/main/java/org/icefaces/impl/context/DOMPartialViewContext.java
        Repository Revision Date User Message
        ICEsoft Public SVN Repository #34526 Thu Apr 25 06:17:15 MDT 2013 mircea.toma ICE-8922 Specify "id" attribute as the attribute used for looking up elements in the document.
        Files Changed
        Commit graph MODIFY /icefaces3/trunk/icefaces/compat/core/src/main/java/com/icesoft/faces/context/DOMContext.java
        Ken Fyten made changes -
        Resolution Fixed [ 1 ]
        Status Resolved [ 5 ] Reopened [ 4 ]
        Repository Revision Date User Message
        ICEsoft Public SVN Repository #34543 Thu Apr 25 16:14:33 MDT 2013 mircea.toma ICE-9219, ICE-8922 Revert previous "improvement" since it's causing regressions.
        Files Changed
        Commit graph MODIFY /icefaces3/trunk/icefaces/compat/core/src/main/java/com/icesoft/faces/context/DOMContext.java
        Hide
        Mircea Toma added a comment -

        Test for the existence of the looked up element before trying to assign its corresponding onElementUpdate callback. If not found a warning is logged.

        Show
        Mircea Toma added a comment - Test for the existence of the looked up element before trying to assign its corresponding onElementUpdate callback. If not found a warning is logged.
        Repository Revision Date User Message
        ICEsoft Public SVN Repository #34560 Fri Apr 26 14:00:16 MDT 2013 mircea.toma ICE-8922 Test for the existence of the looked up element before trying to assign its corresponding onElementUpdate callback. If not found a warning is logged.
        Files Changed
        Commit graph MODIFY /icefaces3/trunk/icefaces/core/src/main/javascript/application.js
        Hide
        Mircea Toma added a comment - - edited

        Modified server-side algorithm of finding elements marked as requiring onElementUpdate notification. Now the search starts from the updated elements and sends only the IDs of the marked child elements. Introduced org.icefaces.clientSideElementUpdateDetermination context parameter that can be used to switch the implementation of finding the elements with onElementUpdate callbacks to client or server side.

        org.icefaces.clientSideElementUpdateDetermination is set to false by default.

        Show
        Mircea Toma added a comment - - edited Modified server-side algorithm of finding elements marked as requiring onElementUpdate notification. Now the search starts from the updated elements and sends only the IDs of the marked child elements. Introduced org.icefaces.clientSideElementUpdateDetermination context parameter that can be used to switch the implementation of finding the elements with onElementUpdate callbacks to client or server side. org.icefaces.clientSideElementUpdateDetermination is set to false by default.
        Mircea Toma made changes -
        Status Reopened [ 4 ] Resolved [ 5 ]
        Affects Documentation (User Guide, Ref. Guide, etc.) [ 10003 ]
        Resolution Fixed [ 1 ]
        Repository Revision Date User Message
        ICEsoft Public SVN Repository #34590 Mon Apr 29 16:34:58 MDT 2013 mircea.toma ICE-8922 Modified server-side algorithm of finding elements marked as requiring onElementUpdate notification. Now the search starts from the updated elements and sends only the IDs of the marked child elements. Introduced org.icefaces.clientSideOnElementUpdateDetermination context parameter that can be used to switch the implementation of finding the elements with onElementUpdate callbacks to client or server side.
        Files Changed
        Commit graph MODIFY /icefaces3/trunk/icefaces/core/src/main/java/org/icefaces/impl/event/BridgeSetup.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/core/src/main/javascript/application.js
        Commit graph MODIFY /icefaces3/trunk/icefaces/core/src/main/java/org/icefaces/impl/context/DOMPartialViewContext.java
        Commit graph MODIFY /icefaces3/trunk/icefaces/core/src/main/java/org/icefaces/util/EnvUtils.java
        Repository Revision Date User Message
        ICEsoft Public SVN Repository #34636 Wed May 01 13:41:09 MDT 2013 mircea.toma ICE-9219 Register 'id' attribute as being the attribute name used to lookup elements in the document (thus helping with the element lookup on the server, such as in ICE-8922 feature).
        Files Changed
        Commit graph MODIFY /icefaces3/trunk/icefaces/compat/core/src/main/java/com/icesoft/faces/renderkit/dom_html_basic/DomBasicRenderer.java
        Repository Revision Date User Message
        ICEsoft Public SVN Repository #34647 Wed May 01 16:45:46 MDT 2013 mircea.toma ICE-8922 Use same attribut name constant when markin or querying the element.
        Files Changed
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/util/ComponentUtils.java
        Repository Revision Date User Message
        ICEsoft Public SVN Repository #34648 Wed May 01 17:26:09 MDT 2013 mircea.toma ICE-8922 Use the same data-elementupdate marker on client and server.
        Files Changed
        Commit graph MODIFY /icefaces3/trunk/icefaces/core/src/main/javascript/application.js
        Commit graph MODIFY /icefaces3/trunk/icefaces/core/src/main/java/org/icefaces/impl/context/DOMPartialViewContext.java
        Ken Fyten made changes -
        Link This issue blocks ICE-8477 [ ICE-8477 ]
        Ken Fyten made changes -
        Link This issue blocks MOBI-314 [ MOBI-314 ]
        Ken Fyten made changes -
        Fix Version/s EE-3.3.0.GA [ 10572 ]
        Hide
        Mark Collette added a comment -

        ACE SubmitMonitor now supported.

        icefaces3 trunk
        Subversion 34997

        Show
        Mark Collette added a comment - ACE SubmitMonitor now supported. icefaces3 trunk Subversion 34997
        Repository Revision Date User Message
        ICEsoft Public SVN Repository #34997 Mon May 13 16:10:43 MDT 2013 mark.collette ICE-8922 : Implement server-side determination of 'onElementUpdate' callback lists for each DOM update
        Files Changed
        Commit graph MODIFY /icefaces3/trunk/icefaces/ace/component/src/org/icefaces/ace/component/submitmonitor/SubmitMonitorRenderer.java
        Hide
        Mark Collette added a comment -

        ICE PanelTabSet now supported.

        icefaces3 trunk
        Subversion 34998

        Show
        Mark Collette added a comment - ICE PanelTabSet now supported. icefaces3 trunk Subversion 34998
        Repository Revision Date User Message
        ICEsoft Public SVN Repository #34998 Mon May 13 16:21:32 MDT 2013 mark.collette ICE-8922 : Implement server-side determination of 'onElementUpdate' callback lists for each DOM update
        Files Changed
        Commit graph MODIFY /icefaces3/trunk/icefaces/compat/components/src/main/java/com/icesoft/faces/component/paneltabset/PanelTabSetRenderer.java
        Ken Fyten made changes -
        Fix Version/s 4.0 [ 11382 ]
        Ken Fyten made changes -
        Status Resolved [ 5 ] Closed [ 6 ]

          People

          • Assignee:
            Mircea Toma
            Reporter:
            Ken Fyten
          • Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: