From: <rb...@us...> - 2013-03-23 10:12:14
|
Revision: 8192 http://sourceforge.net/p/htmlunit/code/8192 Author: rbri Date: 2013-03-23 10:12:11 +0000 (Sat, 23 Mar 2013) Log Message: ----------- Removing frame tag removes the associated FrameWindow also (2nd attempt) Issue 1497 Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebWindowImpl.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/BaseFrameElement.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/DomNode.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/FrameWindow.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLIFrameElementTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-03-23 08:15:31 UTC (rev 8191) +++ trunk/htmlunit/src/changes/changes.xml 2013-03-23 10:12:11 UTC (rev 8192) @@ -8,6 +8,9 @@ <body> <release version="2.13" date="???" description="Bugfixes"> + <action type="fix" dev="rbri" issue="1497"> + JavaScript: Removing frame tag removes the associated FrameWindow also. + </action> <action type="fix" dev="mguillem"> HtmlPage.getElementById: always return the first element in document order (and not the first parsed one). </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebWindowImpl.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebWindowImpl.java 2013-03-23 08:15:31 UTC (rev 8191) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebWindowImpl.java 2013-03-23 10:12:11 UTC (rev 8192) @@ -165,7 +165,10 @@ childWindows_.add(child); } - void destroyChildren() { + /** + * Destroy our childs. + */ + protected void destroyChildren() { if (LOG.isDebugEnabled()) { LOG.debug("destroyChildren"); } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/BaseFrameElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/BaseFrameElement.java 2013-03-23 08:15:31 UTC (rev 8191) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/BaseFrameElement.java 2013-03-23 10:12:11 UTC (rev 8192) @@ -408,4 +408,14 @@ ((BaseFrameElement) node).init(); return node; } + + /** + * Remove our window also. + * {@inheritDoc} + */ + @Override + public void remove() { + super.remove(); + ((FrameWindow) getEnclosedWindow()).close(); + } } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/DomNode.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/DomNode.java 2013-03-23 08:15:31 UTC (rev 8191) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/DomNode.java 2013-03-23 10:12:11 UTC (rev 8192) @@ -899,7 +899,7 @@ else { // clean up the new node, in case it is being moved if (domNode != this && domNode.getParentNode() != null) { - domNode.remove(); + domNode.detach(); } // move the node basicAppend(domNode); @@ -1098,9 +1098,12 @@ } /** - * Removes this node from all relationships with other nodes. + * <span style="color:red">INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.</span><br/> + * + * Detach this node from all relationships with other nodes. + * This is the first step of an move. */ - public void remove() { + protected void detach() { final DomNode exParent = parent_; basicRemove(); @@ -1116,6 +1119,14 @@ } /** + * Removes this node from all relationships with other nodes. + */ + public void remove() { + // same as detach for the moment + detach(); + } + + /** * Cuts off all relationships this node has with siblings and parents. */ private void basicRemove() { Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/FrameWindow.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/FrameWindow.java 2013-03-23 08:15:31 UTC (rev 8191) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/FrameWindow.java 2013-03-23 10:12:11 UTC (rev 8192) @@ -131,4 +131,18 @@ public String toString() { return "FrameWindow[name=\"" + getName() + "\"]"; } + + /** + * Closes this frame window. + */ + public void close() { + setClosed(); + final Page page = getEnclosedPage(); + if (page != null) { + page.cleanUp(); + } + getJobManager().shutdown(); + destroyChildren(); + getWebClient().deregisterWebWindow(this); + } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLIFrameElementTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLIFrameElementTest.java 2013-03-23 08:15:31 UTC (rev 8191) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLIFrameElementTest.java 2013-03-23 10:12:11 UTC (rev 8192) @@ -600,7 +600,6 @@ * @throws Exception if the test fails */ @Test - @NotYetImplemented public void testRemoveFrameWindow() throws Exception { final String index = "<html><head></head><body>" + "<div id='content'>" @@ -633,7 +632,7 @@ assertEquals("new content", page.getElementById("content").asText()); - // frame is still there + // frame has to be gone frames = page.getFrames(); assertEquals(0, frames.size()); } |