On Wed, May 6, 2009 at 16:24, vmassol <platform-notifications(a)xwiki.org> wrote:
Author: vmassol
Date: 2009-05-06 16:24:58 +0200 (Wed, 06 May 2009)
New Revision: 19431
Added:
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/src/test/java/org/xwiki/rendering/HTMLMacroTest.java
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/src/test/java/org/xwiki/rendering/MockDocumentAccessBridge.java
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/src/test/java/org/xwiki/rendering/MockDocumentNameSerializer.java
Modified:
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/pom.xml
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/src/main/java/org/xwiki/rendering/internal/macro/html/HTMLMacro.java
Log:
XWIKI-3764: Modify behavior of HTML macro when it's set to contain wiki syntax
* Fixed regression where non inline content in inline context was allowed to go through
Merged from trunk (rev 19430)
Modified:
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/pom.xml
===================================================================
---
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/pom.xml
2009-05-06 14:23:02 UTC (rev 19430)
+++
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/pom.xml
2009-05-06 14:24:58 UTC (rev 19431)
@@ -42,6 +42,19 @@
<groupId>org.wikimodel</groupId>
<artifactId>org.wikimodel.wem</artifactId>
</dependency>
+ <!-- Testing dependencies -->
+ <dependency>
+ <groupId>org.xwiki.platform</groupId>
+ <artifactId>xwiki-core-shared-tests</artifactId>
+ <version>${pom.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>jmock</groupId>
+ <artifactId>jmock</artifactId>
+ <version>1.1.0</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
<plugins>
@@ -49,9 +62,9 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
- <includes>
- <include>**/RenderingTests.java</include>
- </includes>
+ <excludes>
+ <exclude>**/Mock*.java</exclude>
+ </excludes>
</configuration>
</plugin>
<plugin>
Modified:
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/src/main/java/org/xwiki/rendering/internal/macro/html/HTMLMacro.java
===================================================================
---
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/src/main/java/org/xwiki/rendering/internal/macro/html/HTMLMacro.java
2009-05-06 14:23:02 UTC (rev 19430)
+++
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/src/main/java/org/xwiki/rendering/internal/macro/html/HTMLMacro.java
2009-05-06 14:24:58 UTC (rev 19431)
@@ -26,6 +26,8 @@
import org.apache.commons.lang.StringUtils;
import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
import org.xwiki.bridge.DocumentAccessBridge;
import org.xwiki.bridge.DocumentNameSerializer;
import org.xwiki.component.annotation.Component;
@@ -193,8 +195,9 @@
* @param isInline true if the content is inline and thus if we need to remove the
top level paragraph
* element created by the cleaner
* @return the cleaned HTML as a string representing valid XHTML
+ * @throws MacroExecutionException if the macro is inline and the content is not
inline HTML
*/
- private String cleanHTML(String content, boolean isInline)
+ private String cleanHTML(String content, boolean isInline) throws
MacroExecutionException
{
String cleanedContent = content;
@@ -216,9 +219,20 @@
// HTML envelope when rendered. We remove it so that the HTML <head> tag
isn't output.
HTMLUtils.stripHTMLEnvelope(document);
- // If in inline mode remove the top level paragraph if there's one.
+ // If in inline mode verify we have inline HTML content and remove the top level
paragraph if there's one
if (isInline) {
- HTMLUtils.stripFirstElementInside(document, HTMLConstants.TAG_HTML,
HTMLConstants.TAG_P);
+ // TODO: Improve this since when're inside a table cell or a list item
we can allow non inline items too
+ Element root = document.getDocumentElement();
+ if (root.getChildNodes().getLength() == 1 &&
root.getFirstChild().getNodeType() == Node.ELEMENT_NODE
+ &&
root.getFirstChild().getNodeName().equalsIgnoreCase("p"))
+ {
+ HTMLUtils.stripFirstElementInside(document, HTMLConstants.TAG_HTML,
HTMLConstants.TAG_P);
+ } else {
+ throw new MacroExecutionException(
+ "When using the HTML macro inline, you can only use inline HTML
content."
+ + " Block HTML content (such as tables) cannot be
displayed."
+ + " Try leaving an empty line before and after the HTML
macro.");
+ }
}
// Don't print the XML declaration nor the XHTML DocType.
Added:
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/src/test/java/org/xwiki/rendering/HTMLMacroTest.java
===================================================================
---
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/src/test/java/org/xwiki/rendering/HTMLMacroTest.java
(rev 0)
+++
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/src/test/java/org/xwiki/rendering/HTMLMacroTest.java
2009-05-06 14:24:58 UTC (rev 19431)
@@ -0,0 +1,69 @@
+/*
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.xwiki.rendering;
+
+import org.xwiki.rendering.internal.macro.html.HTMLMacro;
+import org.xwiki.rendering.macro.Macro;
+import org.xwiki.rendering.macro.MacroExecutionException;
+import org.xwiki.rendering.macro.html.HTMLMacroParameters;
+import org.xwiki.rendering.scaffolding.MockDocumentNameSerializer;
+import org.xwiki.rendering.transformation.MacroTransformationContext;
+import org.xwiki.test.AbstractXWikiComponentTestCase;
+
+/**
+ * Unit tests for {@link HTMLMacro} that cannot be performed using the Rendering Test
framework.
+ *
+ * @version $Id: $
+ * @since 1.8.3
+ */
+public class HTMLMacroTest extends AbstractXWikiComponentTestCase
+{
+ /**
+ * {@inheritDoc}
+ *
+ * @see com.xpn.xwiki.test.AbstractXWikiComponentTestCase#setUp()
+ */
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
getComponentManager().registerComponent(MockDocumentAccessBridge.getComponentDescriptor());
+
getComponentManager().registerComponent(MockDocumentNameSerializer.getComponentDescriptor());
+ }
+
+ /**
+ * Verify that inline HTML macros with non inline content generate an exception.
+ */
+ public void testHTMLMacroWhenNonInlineContentInInlineContext() throws Exception
+ {
+ HTMLMacro macro = (HTMLMacro)
getComponentManager().lookup(Macro.class.getName(), "html");
+ HTMLMacroParameters parameters = new HTMLMacroParameters();
+ MacroTransformationContext context = new MacroTransformationContext();
+ context.setInline(true);
+ try {
+ macro.execute(parameters,
"<ul><li>item</li></ul>", context);
+ fail("Should have thrown an exception here");
+ } catch (MacroExecutionException expected) {
+ assertEquals("When using the HTML macro inline, you can only use inline
HTML content. Block HTML "
+ + "content (such as tables) cannot be displayed. Try leaving an
empty line before and after the "
+ + "HTML macro.", expected.getMessage());
+ }
+ }
+}
Added:
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/src/test/java/org/xwiki/rendering/MockDocumentAccessBridge.java
===================================================================
---
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/src/test/java/org/xwiki/rendering/MockDocumentAccessBridge.java
(rev 0)
+++
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/src/test/java/org/xwiki/rendering/MockDocumentAccessBridge.java
2009-05-06 14:24:58 UTC (rev 19431)
@@ -0,0 +1,271 @@
+/*
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.xwiki.rendering;
+
+import java.util.Map;
+
+import org.xwiki.bridge.DocumentAccessBridge;
+import org.xwiki.bridge.DocumentModelBridge;
+import org.xwiki.bridge.DocumentName;
+import org.xwiki.component.descriptor.ComponentDescriptor;
+import org.xwiki.component.descriptor.DefaultComponentDescriptor;
+
+/**
+ * Mock {@link DocumentAccessBridge} implementation used for testing, since we don't
want to pull any dependency on the
+ * Model/Skin/etc for the Rendering module's unit tests.
+ *
+ * @version $Id: $
+ * @since 1.8.3
+ */
+public class MockDocumentAccessBridge implements DocumentAccessBridge
+{
+ /**
+ * Create and return a descriptor for this component.
+ *
+ * @return the descriptor of the component.
+ */
+ public static ComponentDescriptor getComponentDescriptor()
+ {
+ DefaultComponentDescriptor componentDescriptor = new
DefaultComponentDescriptor();
+
+ componentDescriptor.setRole(DocumentAccessBridge.class);
+
componentDescriptor.setImplementation(MockDocumentAccessBridge.class.getName());
+
+ return componentDescriptor;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getDocumentContent(String documentName) throws Exception
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getDocumentContent(String documentName, String language) throws
Exception
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean exists(String documentName)
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getURL(String documentName, String action, String queryString, String
anchor)
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getAttachmentURL(String documentName, String attachmentName)
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getProperty(String documentName, String className, int objectNumber,
String propertyName)
+ throws Exception
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getProperty(String documentName, String className, String
propertyName) throws Exception
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getProperty(String documentName, String propertyName) throws
Exception
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getPropertyType(String className, String propertyName) throws
Exception
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isPropertyCustomMapped(String className, String propertyName) throws
Exception
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setProperty(String documentName, String className, String propertyName,
Object propertyValue)
+ throws Exception
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public byte[] getAttachmentContent(String documentName, String attachmentName)
throws Exception
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean hasProgrammingRights()
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getDocumentContentForDefaultLanguage(String arg0) throws Exception
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isDocumentViewable(String arg0)
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getCurrentUser()
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getDefaultEncoding()
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getDocumentSyntaxId(String arg0) throws Exception
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isDocumentEditable(String arg0)
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setAttachmentContent(String arg0, String arg1, byte[] arg2) throws
Exception
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setDocumentContent(String arg0, String arg1, String arg2, boolean arg3)
throws Exception
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setDocumentSyntaxId(String arg0, String arg1) throws Exception
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public DocumentModelBridge getDocument(String documentName) throws Exception
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public DocumentName getDocumentName(String documentName)
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public DocumentName getCurrentDocumentName()
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void popDocumentFromContext(Map<String, Object> backupObjects)
+ {
+ throw new RuntimeException("Not implemented");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void pushDocumentInContext(Map<String, Object> backupObjects, String
documentName) throws Exception
+ {
+ throw new RuntimeException("Not implemented");
+ }
+}
Added:
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/src/test/java/org/xwiki/rendering/MockDocumentNameSerializer.java
===================================================================
---
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/src/test/java/org/xwiki/rendering/MockDocumentNameSerializer.java
(rev 0)
+++
platform/core/branches/xwiki-core-1.8/xwiki-rendering/xwiki-rendering-macros/xwiki-rendering-macro-html/src/test/java/org/xwiki/rendering/MockDocumentNameSerializer.java
2009-05-06 14:24:58 UTC (rev 19431)
@@ -0,0 +1,61 @@
+/*
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.xwiki.rendering;
+
+import org.xwiki.bridge.DocumentAccessBridge;
+import org.xwiki.bridge.DocumentName;
+import org.xwiki.bridge.DocumentNameSerializer;
+import org.xwiki.component.descriptor.ComponentDescriptor;
+import org.xwiki.component.descriptor.DefaultComponentDescriptor;
+
+/**
+ * Mock {@link DocumentAccessBridge} implementation used for testing, since we don't
want to pull any dependency on the
+ * Model/Skin/etc for the Rendering module's unit tests.
+ *
+ * @version $Id: MockDocumentNameSerializer.java 19152 2009-04-27 21:02:41Z tmortagne $
+ * @since 1.9M2
+ */
+public class MockDocumentNameSerializer implements DocumentNameSerializer
+{
+ /**
+ * Create and return a descriptor for this component.
+ *
+ * @return the descriptor of the component.
+ */
+ public static ComponentDescriptor getComponentDescriptor()
+ {
+ DefaultComponentDescriptor componentDescriptor = new
DefaultComponentDescriptor();
+
+ componentDescriptor.setRole(DocumentNameSerializer.class);
+
componentDescriptor.setImplementation(MockDocumentNameSerializer.class.getName());
+
+ return componentDescriptor;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see
org.xwiki.bridge.DocumentNameSerializer#serialize(org.xwiki.bridge.DocumentName)
+ */
+ public String serialize(DocumentName documentName)
+ {
+ throw new RuntimeException("Not implemented");
+ }
+}
_______________________________________________
notifications mailing list
notifications(a)xwiki.org
http://lists.xwiki.org/mailman/listinfo/notifications