jmeter-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From pmoua...@apache.org
Subject svn commit: r1845696 - in /jmeter/trunk: ./ bin/testfiles/ src/components/org/apache/jmeter/control/ src/core/org/apache/jmeter/control/ xdocs/
Date Sat, 03 Nov 2018 22:05:46 GMT
Author: pmouawad
Date: Sat Nov  3 22:05:46 2018
New Revision: 1845696

URL: http://svn.apache.org/viewvc?rev=1845696&view=rev
Log:
Bug 62847 - If Controller cannot use variable for index exposed by LoopController/WhileController/ForEachController
Bugzilla Id: 62847

Added:
    jmeter/trunk/bin/testfiles/BUG_62847.csv
    jmeter/trunk/bin/testfiles/BUG_62847.jmx   (with props)
    jmeter/trunk/bin/testfiles/BUG_62847.xml   (with props)
Modified:
    jmeter/trunk/build.xml
    jmeter/trunk/src/components/org/apache/jmeter/control/ForeachController.java
    jmeter/trunk/src/core/org/apache/jmeter/control/LoopController.java
    jmeter/trunk/src/core/org/apache/jmeter/control/WhileController.java
    jmeter/trunk/xdocs/changes.xml

Added: jmeter/trunk/bin/testfiles/BUG_62847.csv
URL: http://svn.apache.org/viewvc/jmeter/trunk/bin/testfiles/BUG_62847.csv?rev=1845696&view=auto
==============================================================================
--- jmeter/trunk/bin/testfiles/BUG_62847.csv (added)
+++ jmeter/trunk/bin/testfiles/BUG_62847.csv Sat Nov  3 22:05:46 2018
@@ -0,0 +1,7 @@
+label,responseCode,responseMessage,threadName,success
+SuccessLoop,200,OK,TG 1-1,true
+DS_after_loop,200,OK,TG 1-1,true
+SuccessWhile,200,OK,TG 2-1,true
+DS_after_while,200,OK,TG 2-1,true
+Success_FEC,200,OK,TG 3-1,true
+DS_after_fec,200,OK,TG 3-1,true

Added: jmeter/trunk/bin/testfiles/BUG_62847.jmx
URL: http://svn.apache.org/viewvc/jmeter/trunk/bin/testfiles/BUG_62847.jmx?rev=1845696&view=auto
==============================================================================
--- jmeter/trunk/bin/testfiles/BUG_62847.jmx (added)
+++ jmeter/trunk/bin/testfiles/BUG_62847.jmx Sat Nov  3 22:05:46 2018
@@ -0,0 +1,322 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.1-SNAPSHOT.20181103">
+  <hashTree>
+    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
+      <stringProp name="TestPlan.comments"></stringProp>
+      <boolProp name="TestPlan.functional_mode">false</boolProp>
+      <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
+      <boolProp name="TestPlan.serialize_threadgroups">true</boolProp>
+      <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel"
testclass="Arguments" testname="User Defined Variables" enabled="true">
+        <collectionProp name="Arguments.arguments"/>
+      </elementProp>
+      <stringProp name="TestPlan.user_define_classpath"></stringProp>
+    </TestPlan>
+    <hashTree>
+      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="TG" enabled="true">
+        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
+        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel"
testclass="LoopController" testname="Loop Controller" enabled="true">
+          <boolProp name="LoopController.continue_forever">false</boolProp>
+          <stringProp name="LoopController.loops">1</stringProp>
+        </elementProp>
+        <stringProp name="ThreadGroup.num_threads">1</stringProp>
+        <stringProp name="ThreadGroup.ramp_time">1</stringProp>
+        <boolProp name="ThreadGroup.scheduler">false</boolProp>
+        <stringProp name="ThreadGroup.duration"></stringProp>
+        <stringProp name="ThreadGroup.delay"></stringProp>
+      </ThreadGroup>
+      <hashTree>
+        <LoopController guiclass="LoopControlPanel" testclass="LoopController" testname="loop"
enabled="true">
+          <boolProp name="LoopController.continue_forever">true</boolProp>
+          <stringProp name="LoopController.loops">8</stringProp>
+        </LoopController>
+        <hashTree>
+          <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If
Controller" enabled="true">
+            <stringProp name="IfController.condition">${__jm__loop__idx} == 3</stringProp>
+            <boolProp name="IfController.evaluateAll">false</boolProp>
+          </IfController>
+          <hashTree>
+            <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="SuccessLoop"
enabled="true">
+              <boolProp name="displayJMeterProperties">false</boolProp>
+              <boolProp name="displayJMeterVariables">true</boolProp>
+              <boolProp name="displaySystemProperties">false</boolProp>
+            </DebugSampler>
+            <hashTree/>
+          </hashTree>
+        </hashTree>
+        <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="DS_after_loop"
enabled="true">
+          <boolProp name="displayJMeterProperties">false</boolProp>
+          <boolProp name="displayJMeterVariables">true</boolProp>
+          <boolProp name="displaySystemProperties">false</boolProp>
+        </DebugSampler>
+        <hashTree/>
+      </hashTree>
+      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="TG" enabled="true">
+        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
+        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel"
testclass="LoopController" testname="Loop Controller" enabled="true">
+          <boolProp name="LoopController.continue_forever">false</boolProp>
+          <stringProp name="LoopController.loops">1</stringProp>
+        </elementProp>
+        <stringProp name="ThreadGroup.num_threads">1</stringProp>
+        <stringProp name="ThreadGroup.ramp_time">1</stringProp>
+        <boolProp name="ThreadGroup.scheduler">false</boolProp>
+        <stringProp name="ThreadGroup.duration"></stringProp>
+        <stringProp name="ThreadGroup.delay"></stringProp>
+      </ThreadGroup>
+      <hashTree>
+        <TestAction guiclass="TestActionGui" testclass="TestAction" testname="Flow Control
Action" enabled="true">
+          <intProp name="ActionProcessor.action">1</intProp>
+          <intProp name="ActionProcessor.target">0</intProp>
+          <stringProp name="ActionProcessor.duration">0</stringProp>
+        </TestAction>
+        <hashTree>
+          <UserParameters guiclass="UserParametersGui" testclass="UserParameters" testname="User
Parameters" enabled="true">
+            <collectionProp name="UserParameters.names">
+              <stringProp name="-1877925060">continue_loop</stringProp>
+            </collectionProp>
+            <collectionProp name="UserParameters.thread_values">
+              <collectionProp name="1902774694">
+                <stringProp name="3569038">true</stringProp>
+              </collectionProp>
+            </collectionProp>
+            <boolProp name="UserParameters.per_iteration">false</boolProp>
+          </UserParameters>
+          <hashTree/>
+        </hashTree>
+        <WhileController guiclass="WhileControllerGui" testclass="WhileController" testname="while"
enabled="true">
+          <stringProp name="WhileController.condition">${continue_loop}</stringProp>
+        </WhileController>
+        <hashTree>
+          <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If
Controller" enabled="true">
+            <stringProp name="IfController.condition">${__jm__while__idx} == 3</stringProp>
+            <boolProp name="IfController.evaluateAll">false</boolProp>
+          </IfController>
+          <hashTree>
+            <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="SuccessWhile"
enabled="true">
+              <boolProp name="displayJMeterProperties">false</boolProp>
+              <boolProp name="displayJMeterVariables">true</boolProp>
+              <boolProp name="displaySystemProperties">false</boolProp>
+            </DebugSampler>
+            <hashTree/>
+            <TestAction guiclass="TestActionGui" testclass="TestAction" testname="Flow
Control Action" enabled="true">
+              <intProp name="ActionProcessor.action">1</intProp>
+              <intProp name="ActionProcessor.target">0</intProp>
+              <stringProp name="ActionProcessor.duration">0</stringProp>
+            </TestAction>
+            <hashTree>
+              <UserParameters guiclass="UserParametersGui" testclass="UserParameters"
testname="User Parameters" enabled="true">
+                <collectionProp name="UserParameters.names">
+                  <stringProp name="-1877925060">continue_loop</stringProp>
+                </collectionProp>
+                <collectionProp name="UserParameters.thread_values">
+                  <collectionProp name="-544885953">
+                    <stringProp name="97196323">false</stringProp>
+                  </collectionProp>
+                </collectionProp>
+                <boolProp name="UserParameters.per_iteration">false</boolProp>
+              </UserParameters>
+              <hashTree/>
+            </hashTree>
+          </hashTree>
+        </hashTree>
+        <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="DS_after_while"
enabled="true">
+          <boolProp name="displayJMeterProperties">false</boolProp>
+          <boolProp name="displayJMeterVariables">true</boolProp>
+          <boolProp name="displaySystemProperties">false</boolProp>
+        </DebugSampler>
+        <hashTree/>
+      </hashTree>
+      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="TG" enabled="true">
+        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
+        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel"
testclass="LoopController" testname="Loop Controller" enabled="true">
+          <boolProp name="LoopController.continue_forever">false</boolProp>
+          <stringProp name="LoopController.loops">1</stringProp>
+        </elementProp>
+        <stringProp name="ThreadGroup.num_threads">1</stringProp>
+        <stringProp name="ThreadGroup.ramp_time">1</stringProp>
+        <boolProp name="ThreadGroup.scheduler">false</boolProp>
+        <stringProp name="ThreadGroup.duration"></stringProp>
+        <stringProp name="ThreadGroup.delay"></stringProp>
+      </ThreadGroup>
+      <hashTree>
+        <TestAction guiclass="TestActionGui" testclass="TestAction" testname="Flow Control
Action" enabled="true">
+          <intProp name="ActionProcessor.action">1</intProp>
+          <intProp name="ActionProcessor.target">0</intProp>
+          <stringProp name="ActionProcessor.duration">0</stringProp>
+        </TestAction>
+        <hashTree>
+          <UserParameters guiclass="UserParametersGui" testclass="UserParameters" testname="User
Parameters" enabled="true">
+            <collectionProp name="UserParameters.names">
+              <stringProp name="-1119897881">idx_matchNr</stringProp>
+              <stringProp name="100067119">idx_1</stringProp>
+              <stringProp name="100067120">idx_2</stringProp>
+              <stringProp name="100067121">idx_3</stringProp>
+              <stringProp name="100067122">idx_4</stringProp>
+              <stringProp name="100067123">idx_5</stringProp>
+              <stringProp name="100067124">idx_6</stringProp>
+              <stringProp name="100067125">idx_7</stringProp>
+              <stringProp name="100067126">idx_8</stringProp>
+            </collectionProp>
+            <collectionProp name="UserParameters.thread_values">
+              <collectionProp name="-1846294202">
+                <stringProp name="56">8</stringProp>
+                <stringProp name="49">1</stringProp>
+                <stringProp name="50">2</stringProp>
+                <stringProp name="51">3</stringProp>
+                <stringProp name="52">4</stringProp>
+                <stringProp name="53">5</stringProp>
+                <stringProp name="54">6</stringProp>
+                <stringProp name="55">7</stringProp>
+                <stringProp name="56">8</stringProp>
+              </collectionProp>
+            </collectionProp>
+            <boolProp name="UserParameters.per_iteration">false</boolProp>
+          </UserParameters>
+          <hashTree/>
+        </hashTree>
+        <ForeachController guiclass="ForeachControlPanel" testclass="ForeachController"
testname="for_idx" enabled="true">
+          <stringProp name="ForeachController.inputVal">idx</stringProp>
+          <stringProp name="ForeachController.returnVal">currentIdx</stringProp>
+          <boolProp name="ForeachController.useSeparator">true</boolProp>
+        </ForeachController>
+        <hashTree>
+          <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If
Controller" enabled="true">
+            <stringProp name="IfController.condition">${__jm__for_idx__idx} == 3</stringProp>
+            <boolProp name="IfController.evaluateAll">false</boolProp>
+          </IfController>
+          <hashTree>
+            <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="Success_FEC"
enabled="true">
+              <boolProp name="displayJMeterProperties">false</boolProp>
+              <boolProp name="displayJMeterVariables">true</boolProp>
+              <boolProp name="displaySystemProperties">false</boolProp>
+            </DebugSampler>
+            <hashTree/>
+            <TestAction guiclass="TestActionGui" testclass="TestAction" testname="Flow
Control Action" enabled="true">
+              <intProp name="ActionProcessor.action">1</intProp>
+              <intProp name="ActionProcessor.target">0</intProp>
+              <stringProp name="ActionProcessor.duration">0</stringProp>
+            </TestAction>
+            <hashTree>
+              <UserParameters guiclass="UserParametersGui" testclass="UserParameters"
testname="User Parameters" enabled="true">
+                <collectionProp name="UserParameters.names">
+                  <stringProp name="-1877925060">continue_loop</stringProp>
+                </collectionProp>
+                <collectionProp name="UserParameters.thread_values">
+                  <collectionProp name="-544885953">
+                    <stringProp name="97196323">false</stringProp>
+                  </collectionProp>
+                </collectionProp>
+                <boolProp name="UserParameters.per_iteration">false</boolProp>
+              </UserParameters>
+              <hashTree/>
+            </hashTree>
+          </hashTree>
+        </hashTree>
+        <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="DS_after_fec"
enabled="true">
+          <boolProp name="displayJMeterProperties">false</boolProp>
+          <boolProp name="displayJMeterVariables">true</boolProp>
+          <boolProp name="displaySystemProperties">false</boolProp>
+        </DebugSampler>
+        <hashTree/>
+      </hashTree>
+      <ResultCollector guiclass="TableVisualizer" testclass="ResultCollector" testname="View
Results in Table" enabled="true">
+        <boolProp name="ResultCollector.error_logging">false</boolProp>
+        <objProp>
+          <name>saveConfig</name>
+          <value class="SampleSaveConfiguration">
+            <time>false</time>
+            <latency>false</latency>
+            <timestamp>false</timestamp>
+            <success>true</success>
+            <label>true</label>
+            <code>true</code>
+            <message>true</message>
+            <threadName>true</threadName>
+            <dataType>false</dataType>
+            <encoding>false</encoding>
+            <assertions>false</assertions>
+            <subresults>false</subresults>
+            <responseData>false</responseData>
+            <samplerData>false</samplerData>
+            <xml>false</xml>
+            <fieldNames>true</fieldNames>
+            <responseHeaders>false</responseHeaders>
+            <requestHeaders>false</requestHeaders>
+            <responseDataOnError>false</responseDataOnError>
+            <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
+            <assertionsResultsToSave>0</assertionsResultsToSave>
+          </value>
+        </objProp>
+        <stringProp name="filename">BUG_62847.csv</stringProp>
+      </ResultCollector>
+      <hashTree/>
+      <ResultCollector guiclass="SimpleDataWriter" testclass="ResultCollector" testname="Simple
Data Writer" enabled="true">
+        <boolProp name="ResultCollector.error_logging">false</boolProp>
+        <objProp>
+          <name>saveConfig</name>
+          <value class="SampleSaveConfiguration">
+            <time>false</time>
+            <latency>false</latency>
+            <timestamp>false</timestamp>
+            <success>true</success>
+            <label>true</label>
+            <code>true</code>
+            <message>true</message>
+            <threadName>true</threadName>
+            <dataType>false</dataType>
+            <encoding>false</encoding>
+            <assertions>true</assertions>
+            <subresults>true</subresults>
+            <responseData>false</responseData>
+            <samplerData>false</samplerData>
+            <xml>true</xml>
+            <fieldNames>false</fieldNames>
+            <responseHeaders>false</responseHeaders>
+            <requestHeaders>false</requestHeaders>
+            <responseDataOnError>false</responseDataOnError>
+            <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
+            <assertionsResultsToSave>0</assertionsResultsToSave>
+          </value>
+        </objProp>
+        <stringProp name="filename">BUG_62847.xml</stringProp>
+      </ResultCollector>
+      <hashTree/>
+      <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector"
testname="View Results Tree" enabled="true">
+        <boolProp name="ResultCollector.error_logging">false</boolProp>
+        <objProp>
+          <name>saveConfig</name>
+          <value class="SampleSaveConfiguration">
+            <time>true</time>
+            <latency>true</latency>
+            <timestamp>true</timestamp>
+            <success>true</success>
+            <label>true</label>
+            <code>true</code>
+            <message>true</message>
+            <threadName>true</threadName>
+            <dataType>true</dataType>
+            <encoding>false</encoding>
+            <assertions>true</assertions>
+            <subresults>true</subresults>
+            <responseData>false</responseData>
+            <samplerData>false</samplerData>
+            <xml>false</xml>
+            <fieldNames>true</fieldNames>
+            <responseHeaders>false</responseHeaders>
+            <requestHeaders>false</requestHeaders>
+            <responseDataOnError>false</responseDataOnError>
+            <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
+            <assertionsResultsToSave>0</assertionsResultsToSave>
+            <bytes>true</bytes>
+            <sentBytes>true</sentBytes>
+            <url>true</url>
+            <threadCounts>true</threadCounts>
+            <idleTime>true</idleTime>
+            <connectTime>true</connectTime>
+          </value>
+        </objProp>
+        <stringProp name="filename"></stringProp>
+      </ResultCollector>
+      <hashTree/>
+    </hashTree>
+  </hashTree>
+</jmeterTestPlan>

Propchange: jmeter/trunk/bin/testfiles/BUG_62847.jmx
------------------------------------------------------------------------------
    svn:eol-style = LF

Added: jmeter/trunk/bin/testfiles/BUG_62847.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/bin/testfiles/BUG_62847.xml?rev=1845696&view=auto
==============================================================================
--- jmeter/trunk/bin/testfiles/BUG_62847.xml (added)
+++ jmeter/trunk/bin/testfiles/BUG_62847.xml Sat Nov  3 22:05:46 2018
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<testResults version="1.2">
+<sample s="true" lb="SuccessLoop" rc="200" rm="OK" tn="TG 1-1"/>
+<sample s="true" lb="DS_after_loop" rc="200" rm="OK" tn="TG 1-1"/>
+<sample s="true" lb="SuccessWhile" rc="200" rm="OK" tn="TG 2-1"/>
+<sample s="true" lb="DS_after_while" rc="200" rm="OK" tn="TG 2-1"/>
+<sample s="true" lb="Success_FEC" rc="200" rm="OK" tn="TG 3-1"/>
+<sample s="true" lb="DS_after_fec" rc="200" rm="OK" tn="TG 3-1"/>
+
+</testResults>

Propchange: jmeter/trunk/bin/testfiles/BUG_62847.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jmeter/trunk/bin/testfiles/BUG_62847.xml
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: jmeter/trunk/build.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/build.xml?rev=1845696&r1=1845695&r2=1845696&view=diff
==============================================================================
--- jmeter/trunk/build.xml (original)
+++ jmeter/trunk/build.xml Sat Nov  3 22:05:46 2018
@@ -2824,6 +2824,11 @@ run JMeter unless all the JMeter jars ar
   <!-- Additional test scripts -->
   <target name="batch_scripts">
       <antcall target="batchtest">
+        <param name="batchtest.name" value="BUG_62847"/>
+        <param name="batchtest.jmx" value="BUG_62847.jmx"/>
+      </antcall>
+      
+      <antcall target="batchtest">
         <param name="batchtest.name" value="TestResultStatusAction"/>
         <param name="batchtest.jmx" value="TestResultStatusAction.jmx"/>
       </antcall>

Modified: jmeter/trunk/src/components/org/apache/jmeter/control/ForeachController.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/control/ForeachController.java?rev=1845696&r1=1845695&r2=1845696&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/control/ForeachController.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/control/ForeachController.java Sat Nov 
3 22:05:46 2018
@@ -199,6 +199,7 @@ public class ForeachController extends G
     // Prevent entry if nothing to do
     @Override
     public Sampler next() {
+        updateIterationIndex(getName(), loopCount);
         try {
             if (breakLoop || emptyList()) {
                 resetBreakLoop();

Modified: jmeter/trunk/src/core/org/apache/jmeter/control/LoopController.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/control/LoopController.java?rev=1845696&r1=1845695&r2=1845696&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/control/LoopController.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/control/LoopController.java Sat Nov  3 22:05:46
2018
@@ -123,6 +123,7 @@ public class LoopController extends Gene
      */
     @Override
     public Sampler next() {
+        updateIterationIndex(getName(), loopCount);
         try {
             if(endOfLoop()) {
                 if (!getContinueForever()) {

Modified: jmeter/trunk/src/core/org/apache/jmeter/control/WhileController.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/control/WhileController.java?rev=1845696&r1=1845695&r2=1845696&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/control/WhileController.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/control/WhileController.java Sat Nov  3 22:05:46
2018
@@ -108,6 +108,7 @@ public class WhileController extends Gen
      */
     @Override
     public Sampler next(){
+        updateIterationIndex(getName(), getIterCount());
         try {
             if (isFirst() && endOfLoop(false)) {
                 resetBreakLoop();

Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1845696&r1=1845695&r2=1845696&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml [utf-8] (original)
+++ jmeter/trunk/xdocs/changes.xml [utf-8] Sat Nov  3 22:05:46 2018
@@ -147,6 +147,7 @@ Summary
 <h3>Controllers</h3>
 <ul>
     <li><bug>62806</bug>ModuleController cloning by Run behaves differently
wether in GUI or Non GUI mode. Contributed by Ubik Load Pack (support at ubikloadpack.com)</li>
+    <li><bug>62847</bug>If Controller cannot use variable for index exposed
by LoopController/WhileController/ForEachController</li>
 </ul>
 
 <h3>Listeners</h3>



Mime
View raw message