Skip to content

Commit

Permalink
fix: remove href attribute for disabled Anchor (#11121) (#11202)
Browse files Browse the repository at this point in the history
fixes #10924
  • Loading branch information
Denis committed Jun 14, 2021
1 parent 3e66d0a commit 8112b77
Show file tree
Hide file tree
Showing 2 changed files with 168 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ public class Anchor extends HtmlContainer implements Focusable<Anchor> {

private static final String ROUTER_IGNORE_ATTRIBUTE = "router-ignore";

private String disabledHref;
private AbstractStreamResource resource;

/**
* Creates a new empty anchor component.
*/
Expand Down Expand Up @@ -134,6 +137,7 @@ public void removeHref() {
* the resource value, not null
*/
public void setHref(AbstractStreamResource href) {
resource = href;
getElement().setAttribute("href", href);
getElement().setAttribute(ROUTER_IGNORE_ATTRIBUTE, true);
}
Expand Down Expand Up @@ -183,4 +187,36 @@ public Optional<String> getTarget() {
return get(targetDescriptor);
}

@Override
public void onEnabledStateChanged(boolean enabled) {
super.onEnabledStateChanged(enabled);
if (enabled) {
if (resource == null) {
restoreHref();
} else {
restoreResource();
}
disabledHref = null;
} else {
disabledHref = getHref();
removeHref();
}
}

private void restoreHref() {
if (!getElement().hasAttribute("href")) {
// only set attribute value back if attribute has not been set
// somehow when component was disabled
setHref(disabledHref);
}
}

private void restoreResource() {
if (!getElement().hasAttribute("href")) {
// only set attribute value back if attribute has not been set
// somehow when component was disabled
setHref(resource);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,24 @@
*/
package com.vaadin.flow.component.html;

import com.vaadin.flow.component.Text;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;

import com.vaadin.flow.component.Text;
import com.vaadin.flow.component.UI;
import com.vaadin.flow.server.AbstractStreamResource;

public class AnchorTest extends ComponentTest {

private UI ui;

@After
public void tearDown() {
ui = null;
UI.setCurrent(null);
}

@Test
public void removeHref() {
Anchor anchor = new Anchor();
Expand Down Expand Up @@ -60,6 +72,120 @@ public void shouldNotBreakBehaviorIfSetHrefWhenHavingRouterIgnoreAttributeBefore
anchor.getElement().getAttribute("router-ignore"));
}

@Test
public void disabledAnchor_hrefIsRemoved_enableAnchor_hrefIsRestored() {
Anchor anchor = new Anchor("foo", "bar");
anchor.setEnabled(false);

Assert.assertFalse(anchor.getElement().hasAttribute("href"));

anchor.setEnabled(true);
Assert.assertTrue(anchor.getElement().hasAttribute("href"));
Assert.assertEquals("foo", anchor.getHref());
}

@Test
public void disabledAnchor_setHrefWhenDisabled_enableAnchor_hrefIsPreserved() {
Anchor anchor = new Anchor("foo", "bar");
anchor.setEnabled(false);

anchor.setHref("baz");

anchor.setEnabled(true);

Assert.assertTrue(anchor.getElement().hasAttribute("href"));
Assert.assertEquals("baz", anchor.getHref());
}

@Test
public void disabledAnchor_setResourceWhenDisabled_enableAnchor_resourceIsPreserved() {
Anchor anchor = new Anchor("foo", "bar");
anchor.setEnabled(false);

mockUI();
anchor.setHref(new AbstractStreamResource() {

@Override
public String getName() {
return "baz";
}
});
String href = anchor.getHref();

anchor.setEnabled(true);

Assert.assertTrue(anchor.getElement().hasAttribute("href"));
Assert.assertEquals(href, anchor.getHref());
}

@Test
public void disabledAnchor_setResource_hrefIsRemoved_enableAnchor_hrefIsRestored() {
mockUI();
AbstractStreamResource resource = new AbstractStreamResource() {

@Override
public String getName() {
return "foo";
}

};
Anchor anchor = new Anchor(resource, "bar");
String href = anchor.getHref();
anchor.setEnabled(false);

Assert.assertFalse(anchor.getElement().hasAttribute("href"));

anchor.setEnabled(true);
Assert.assertEquals(href, anchor.getHref());
}

@Test
public void disabledAnchor_setResourceWhenDisabled_hrefIsPreserved() {
mockUI();
AbstractStreamResource resource = new AbstractStreamResource() {

@Override
public String getName() {
return "foo";
}

};
Anchor anchor = new Anchor(resource, "bar");
String href = anchor.getHref();
anchor.setEnabled(false);

anchor.setHref(new AbstractStreamResource() {

@Override
public String getName() {
return "baz";
}
});

Assert.assertTrue(anchor.getElement().hasAttribute("href"));
Assert.assertNotEquals(href, anchor.getHref());
}

@Test
public void disabledAnchor_setResource_setHrefViaElementWhenDisabled_enableAnchor_hrefIsRestored() {
mockUI();
AbstractStreamResource resource = new AbstractStreamResource() {

@Override
public String getName() {
return "foo";
}

};
Anchor anchor = new Anchor(resource, "bar");
anchor.setEnabled(false);

anchor.getElement().setAttribute("href", "baz");

anchor.setEnabled(true);
Assert.assertEquals("baz", anchor.getHref());
}

// Other test methods in super class

@Override
Expand All @@ -68,4 +194,9 @@ protected void addProperties() {
addOptionalStringProperty("target");
}

private void mockUI() {
ui = new UI();
UI.setCurrent(ui);
}

}

0 comments on commit 8112b77

Please sign in to comment.