[Httpunit-commit] CVS: httpunit/src/com/meterware/httpunit RequestContext.java,NONE,1.1 FrameHolder.
Brought to you by:
russgold
|
From: Russell G. <rus...@us...> - 2002-11-17 00:17:10
|
Update of /cvsroot/httpunit/httpunit/src/com/meterware/httpunit
In directory usw-pr-cvs1:/tmp/cvs-serv30543/src/com/meterware/httpunit
Modified Files:
FrameHolder.java WebClient.java WebResponse.java
WebWindow.java
Added Files:
RequestContext.java
Log Message:
Wait until all frames are loaded before running embedded JavaScripts
***** Error reading new file[Errno 2] No such file or directory: 'RequestContext.java'
Index: FrameHolder.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/httpunit/FrameHolder.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- FrameHolder.java 24 Oct 2002 13:28:53 -0000 1.6
+++ FrameHolder.java 17 Nov 2002 00:17:06 -0000 1.7
@@ -74,15 +74,19 @@
}
- void updateFrames( WebResponse response, String target ) throws MalformedURLException, IOException, SAXException {
+ void updateFrames( WebResponse response, String target, RequestContext requestContext ) throws MalformedURLException, IOException, SAXException {
removeSubFrames( target );
_contents.put( target, response );
if (response.isHTML()) {
- HttpUnitOptions.getScriptingEngine().associate( response );
- createSubFrames( target, response.getFrameNames() );
- WebRequest[] requests = response.getFrameRequests();
- for (int i = 0; i < requests.length; i++) response.getWindow().getResponse( requests[ i ] );
+ if (!response.hasSubframes()) {
+ requestContext.addNewResponse( response );
+ } else {
+ HttpUnitOptions.getScriptingEngine().associate( response );
+ createSubFrames( target, response.getFrameNames() );
+ WebRequest[] requests = response.getFrameRequests();
+ for (int i = 0; i < requests.length; i++) response.getWindow().getSubframeResponse( requests[ i ], requestContext );
+ }
}
}
Index: WebClient.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/httpunit/WebClient.java,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -r1.46 -r1.47
--- WebClient.java 8 Nov 2002 02:18:54 -0000 1.46
+++ WebClient.java 17 Nov 2002 00:17:07 -0000 1.47
@@ -140,67 +140,6 @@
}
- WebResponse getResourceForWindow( WebRequest request, WebWindow window ) throws IOException {
- tellListeners( request );
- WebResponse response = getResource( request, window );
- if (response != null) tellListeners( response );
- return response;
- }
-
-
- private WebResponse getResource( WebRequest request, final WebWindow window ) throws IOException {
- final String frameName = getTargetFrame( request.getTarget() );
- String urlString = request.getURLString().trim();
- if (urlString.startsWith( "about:" )) {
- return WebResponse.BLANK_RESPONSE;
- } else if (!urlString.startsWith( "javascript:" )) {
- return newResponse( request, frameName );
- } else {
- WebRequestSource wrs = request.getWebRequestSource();
- String result = (wrs == null) ? window.getCurrentPage().getScriptableObject().evaluateURL( urlString )
- : wrs.getScriptableDelegate().evaluateURL( urlString );
- if (result == null) return null;
-
- return new DefaultWebResponse( this, frameName, request.getURL(), result );
- }
- }
-
-
- private String getTargetFrame( String target ) {
- if (WebRequest.NEW_WINDOW.equalsIgnoreCase( target )) {
- return WebRequest.TOP_FRAME;
- } else {
- return target;
- }
- }
-
-
- private void tellListeners( WebRequest request ) {
- List listeners;
-
- synchronized (_clientListeners) {
- listeners = new ArrayList( _clientListeners );
- }
-
- for (Iterator i = listeners.iterator(); i.hasNext();) {
- ((WebClientListener) i.next()).requestSent( this, request );
- }
- }
-
-
- private void tellListeners( WebResponse response ) {
- List listeners;
-
- synchronized (_clientListeners) {
- listeners = new ArrayList( _clientListeners );
- }
-
- for (Iterator i = listeners.iterator(); i.hasNext();) {
- ((WebClientListener) i.next()).responseReceived( this, response );
- }
- }
-
-
/**
* Resets the state of this client, removing all cookies, frames, and per-client headers. This does not affect
* any listeners or preferences which may have been set.
@@ -452,11 +391,40 @@
/**
* Updates this web client based on a received response. This includes updating
- * cookies and frames.
+ * cookies and frames. This method is required by ServletUnit, which cannot call the updateWindow method directly.
**/
final
protected void updateMainWindow( String target, WebResponse response ) throws MalformedURLException, IOException, SAXException {
- _mainWindow.updateWindow( target, response );
+ getMainWindow().updateWindow( target, response, new RequestContext() );
+ }
+
+
+//------------------------------------------------- package members ----------------------------------------------------
+
+
+ void tellListeners( WebRequest request ) {
+ List listeners;
+
+ synchronized (_clientListeners) {
+ listeners = new ArrayList( _clientListeners );
+ }
+
+ for (Iterator i = listeners.iterator(); i.hasNext();) {
+ ((WebClientListener) i.next()).requestSent( this, request );
+ }
+ }
+
+
+ void tellListeners( WebResponse response ) {
+ List listeners;
+
+ synchronized (_clientListeners) {
+ listeners = new ArrayList( _clientListeners );
+ }
+
+ for (Iterator i = listeners.iterator(); i.hasNext();) {
+ ((WebClientListener) i.next()).responseReceived( this, response );
+ }
}
@@ -466,13 +434,13 @@
}
- void updateFrameContents( WebWindow requestWindow, String requestTarget, WebResponse response ) throws IOException, SAXException {
+ void updateFrameContents( WebWindow requestWindow, String requestTarget, WebResponse response, RequestContext requestContext ) throws IOException, SAXException {
WebWindow window = getTargetWindow( requestWindow, requestTarget );
if (window != null) {
- window.updateFrameContents( response );
+ window.updateFrameContents( response, requestContext );
} else {
window = new WebWindow( this );
- window.updateFrameContents( response );
+ window.updateFrameContents( response, requestContext );
_openWindows.add( window );
reportWindowOpened( window );
}
Index: WebResponse.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/httpunit/WebResponse.java,v
retrieving revision 1.99
retrieving revision 1.100
diff -u -r1.99 -r1.100
--- WebResponse.java 13 Nov 2002 14:01:23 -0000 1.99
+++ WebResponse.java 17 Nov 2002 00:17:07 -0000 1.100
@@ -48,6 +48,8 @@
abstract
public class WebResponse implements HTMLSegment, CookieSource {
private String _refreshHeader;
+ private boolean _hasSubframes;
+
/**
* Returns a web response built from a URL connection. Provided to allow
@@ -797,7 +799,7 @@
} while (count != -1);
byte[] bytes = outputStream.toByteArray();
- readMetaTags( bytes );
+ readTags( bytes );
_responseText = new String( bytes, getCharacterSet() );
_inputStream = new ByteArrayInputStream( bytes );
@@ -811,11 +813,12 @@
}
- private void readMetaTags( byte[] rawMessage ) throws UnsupportedEncodingException {
+ private void readTags( byte[] rawMessage ) throws UnsupportedEncodingException {
ByteTagParser parser = new ByteTagParser( rawMessage );
ByteTag tag = parser.getNextTag();
while (tag != null && !tag.getName().equalsIgnoreCase( "body" )) {
if (tag.getName().equalsIgnoreCase( "meta" )) processMetaTag( tag );
+ if (tag.getName().equalsIgnoreCase( "frameset" )) _hasSubframes = true;
tag = parser.getNextTag();
}
}
@@ -969,6 +972,11 @@
} catch (UnsupportedEncodingException e) {
_characterSet = getDefaultEncoding();
}
+ }
+
+
+ boolean hasSubframes() {
+ return _hasSubframes;
}
Index: WebWindow.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/httpunit/WebWindow.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- WebWindow.java 11 Oct 2002 01:26:22 -0000 1.7
+++ WebWindow.java 17 Nov 2002 00:17:07 -0000 1.8
@@ -106,12 +106,72 @@
* @exception SAXException thrown if there is an error parsing the retrieved page
**/
public WebResponse getResponse( WebRequest request ) throws MalformedURLException, IOException, SAXException {
- WebResponse response = _client.getResourceForWindow( request, this );
+ final RequestContext requestContext = new RequestContext();
+ final WebResponse response = getSubframeResponse( request, requestContext );
+ requestContext.runScripts();
+ return response;
+ }
+
+
+ WebResponse getSubframeResponse( WebRequest request, RequestContext requestContext ) throws IOException, SAXException {
+ WebResponse response = getResource( request );
+
+ return response == null ? null : updateWindow( request.getTarget(), response, requestContext );
+ }
+
+
+ /**
+ * Updates this web client based on a received response. This includes updating
+ * cookies and frames.
+ **/
+ WebResponse updateWindow( String requestTarget, WebResponse response, RequestContext requestContext ) throws MalformedURLException, IOException, SAXException {
+ _client.updateClient( response );
+ if (HttpUnitOptions.getAutoRefresh() && response.getRefreshRequest() != null) {
+ return getResponse( response.getRefreshRequest() );
+ } else if (shouldFollowRedirect( response )) {
+ delay( HttpUnitOptions.getRedirectDelay() );
+ return getResponse( new RedirectWebRequest( response ) );
+ } else {
+ _client.updateFrameContents( this, requestTarget, response, requestContext );
+ return response;
+ }
+ }
+
+
+ /**
+ * Returns the resource specified by the request. Does not update the window or load included framesets.
+ * May return null if the resource is a JavaScript URL which would normally leave the client unchanged.
+ */
+ public WebResponse getResource( WebRequest request ) throws IOException {
+ _client.tellListeners( request );
+
+ WebResponse response = null;
+ final String frameName = getTargetFrame( request.getTarget() );
+ String urlString = request.getURLString().trim();
+ if (urlString.startsWith( "about:" )) {
+ response = WebResponse.BLANK_RESPONSE;
+ } else if (!urlString.startsWith( "javascript:" )) {
+ response = _client.newResponse( request, frameName );
+ } else {
+ WebRequestSource wrs = request.getWebRequestSource();
+ String result = (wrs == null) ? getCurrentPage().getScriptableObject().evaluateURL( urlString )
+ : wrs.getScriptableDelegate().evaluateURL( urlString );
+ if (result != null) response = new DefaultWebResponse( _client, frameName, request.getURL(), result );
+ }
- return response == null ? null : updateWindow( request.getTarget(), response );
+ if (response != null) _client.tellListeners( response );
+ return response;
}
+ private String getTargetFrame( String target ) {
+ if (WebRequest.NEW_WINDOW.equalsIgnoreCase( target )) {
+ return WebRequest.TOP_FRAME;
+ } else {
+ return target;
+ }
+ }
+
/**
* Returns the name of the currently active frames.
**/
@@ -126,7 +186,7 @@
* Throws a runtime exception if no matching frame is defined.
**/
public WebResponse getFrameContents( String frameName ) {
- WebResponse response = (WebResponse) _frameContents.get( frameName );
+ WebResponse response = _frameContents.get( frameName );
if (response == null) throw new NoSuchFrameException( frameName );
return response;
}
@@ -152,36 +212,9 @@
}
- /**
- * Updates this web client based on a received response. This includes updating
- * cookies and frames.
- **/
- WebResponse updateWindow( String requestTarget, WebResponse response ) throws MalformedURLException, IOException, SAXException {
- _client.updateClient( response );
- if (HttpUnitOptions.getAutoRefresh() && response.getRefreshRequest() != null) {
- return getResponse( response.getRefreshRequest() );
- } else if (shouldFollowRedirect( response )) {
- delay( HttpUnitOptions.getRedirectDelay() );
- return getResponse( new RedirectWebRequest( response ) );
- } else {
- _client.updateFrameContents( this, requestTarget, response );
- return response;
- }
- }
-
-
- /**
- * Returns the resource specified by the request. Does not update the client or load included framesets.
- * May return null if the resource is a JavaScript URL which would normally leave the client unchanged.
- */
- WebResponse getResource( WebRequest request ) throws IOException {
- return _client.getResourceForWindow( request, this );
- }
-
-
- void updateFrameContents( WebResponse response ) throws IOException, SAXException {
+ void updateFrameContents( WebResponse response, RequestContext requestContext ) throws IOException, SAXException {
response.setWindow( this );
- _frameContents.updateFrames( response, response.getFrameName() );
+ _frameContents.updateFrames( response, response.getFrameName(), requestContext );
}
@@ -209,7 +242,6 @@
&& response.getResponseCode() <= HttpURLConnection.HTTP_MOVED_TEMP
&& response.getHeaderField( "Location" ) != null;
}
-
}
|