Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

V8 bugfix/4035 #8898

Merged
merged 11 commits into from
Mar 22, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 82 additions & 7 deletions client/src/main/java/com/vaadin/client/ui/VFlash.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ public class VFlash extends HTML {
protected String width;
protected String height;

private int slotOffsetHeight = -1;
private int slotOffsetWidth = -1;

public VFlash() {
setStyleName(CLASSNAME);
}
Expand Down Expand Up @@ -103,8 +106,7 @@ public void rebuildIfNeeded() {

@Override
public void setWidth(String width) {
// super.setWidth(height);

// explicitly not calling super here
if (this.width != width) {
this.width = width;
needsRebuild = true;
Expand All @@ -113,8 +115,7 @@ public void setWidth(String width) {

@Override
public void setHeight(String height) {
// super.setHeight(height);

// explicitly not calling super here
if (this.height != height) {
this.height = height;
needsRebuild = true;
Expand All @@ -136,13 +137,34 @@ public void setEmbedParams(Map<String, String> params) {
}
}

/**
* Set dimensions of the containing layout slot so that the size of the
* embed object can be calculated from percentages if needed.
*
* Triggers embed resizing if percentage sizes are in use.
*
* @since 7.7.8
* @param slotOffsetHeight
* offset height of the layout slot
* @param slotOffsetWidth
* offset width of the layout slot
*/
public void setSlotHeightAndWidth(int slotOffsetHeight,
int slotOffsetWidth) {
this.slotOffsetHeight = slotOffsetHeight;
this.slotOffsetWidth = slotOffsetWidth;
if (hasPercentageHeight() || hasPercentageWidth()) {
resizeEmbedElement();
}

}

protected String createFlashEmbed() {
/*
* To ensure cross-browser compatibility we are using the twice-cooked
* method to embed flash i.e. we add a OBJECT tag for IE ActiveX and
* inside it a EMBED for all other browsers.
*/

StringBuilder html = new StringBuilder();

// Start the object tag
Expand Down Expand Up @@ -223,8 +245,19 @@ protected String createFlashEmbed() {
// Build inner EMBED tag
html.append("<embed ");
html.append("src=\"" + WidgetUtil.escapeAttribute(source) + "\" ");
html.append("width=\"" + WidgetUtil.escapeAttribute(width) + "\" ");
html.append("height=\"" + WidgetUtil.escapeAttribute(height) + "\" ");
if (hasPercentageWidth() && slotOffsetWidth >= 0) {
html.append("width=\"" + getRelativePixelWidth() + "\" ");
} else {
html.append("width=\"" + WidgetUtil.escapeAttribute(width) + "\" ");
}

if (hasPercentageHeight() && slotOffsetHeight >= 0) {
html.append("height=\"" + getRelativePixelHeight() + "px\" ");
} else {
html.append(
"height=\"" + WidgetUtil.escapeAttribute(height) + "\" ");
}

html.append("type=\"application/x-shockwave-flash\" ");

// Add the parameters to the Embed
Expand All @@ -250,4 +283,46 @@ protected String createFlashEmbed() {
return html.toString();
}

private void resizeEmbedElement() {
// find <embed> element
com.google.gwt.dom.client.Element objectElem = getElement()
.getFirstChildElement();
com.google.gwt.dom.client.Element objectChild = objectElem
.getFirstChildElement();
while (!"EMBED".equalsIgnoreCase(objectChild.getTagName())) {
objectChild = objectChild.getNextSiblingElement();
if (objectChild == null) {
return;
}
}
// update height & width from slot offset, if percentage size is given
if (hasPercentageHeight() && slotOffsetHeight >= 0) {
objectChild.setAttribute("height", getRelativePixelHeight());
}
if (hasPercentageWidth() && slotOffsetWidth >= 0) {
objectChild.setAttribute("width", getRelativePixelWidth());
}

}

private String getRelativePixelWidth() {
float relative = WidgetUtil.parseRelativeSize(width);
int widthInPixels = (int) (relative / 100) * slotOffsetWidth;
return widthInPixels + "px";
}

private String getRelativePixelHeight() {
float relative = WidgetUtil.parseRelativeSize(height);
int heightInPixels = (int) (relative / 100) * slotOffsetHeight;
return heightInPixels + "px";
}

private boolean hasPercentageHeight() {
return ((height != null) && (height.indexOf('%') > 0));
}

private boolean hasPercentageWidth() {
return ((width != null) && (width.indexOf('%') > 0));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,12 @@
*/
package com.vaadin.client.ui.flash;

import com.google.gwt.dom.client.Element;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.ui.AbstractComponentConnector;
import com.vaadin.client.ui.VFlash;
import com.vaadin.client.ui.layout.ElementResizeEvent;
import com.vaadin.client.ui.layout.ElementResizeListener;
import com.vaadin.shared.ui.AbstractEmbeddedState;
import com.vaadin.shared.ui.Connect;
import com.vaadin.shared.ui.flash.FlashState;
Expand All @@ -39,7 +42,6 @@ public FlashState getState() {
public void onStateChanged(StateChangeEvent stateChangeEvent) {

super.onStateChanged(stateChangeEvent);

getWidget().setSource(
getResourceUrl(AbstractEmbeddedState.SOURCE_RESOURCE));
getWidget().setArchive(getState().archive);
Expand All @@ -52,4 +54,26 @@ public void onStateChanged(StateChangeEvent stateChangeEvent) {

getWidget().rebuildIfNeeded();
}

private final ElementResizeListener listener = new ElementResizeListener() {
public void onElementResize(ElementResizeEvent e) {
Element slot = e.getElement().getParentElement();
getWidget().setSlotHeightAndWidth(slot.getOffsetHeight(),
slot.getOffsetWidth());
}
};

@Override
protected void init() {
super.init();
getLayoutManager().addElementResizeListener(getWidget().getElement(),
listener);
}

@Override
public void onUnregister() {
getLayoutManager().removeElementResizeListener(getWidget().getElement(),
listener);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* Copyright 2000-2017 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.tests.components.flash;

import com.vaadin.server.ClassResource;
import com.vaadin.tests.components.TestBase;
import com.vaadin.ui.Button;
import com.vaadin.ui.Flash;

public class FlashExpansion extends TestBase {

Flash player = new Flash();

@Override
protected void setup() {

player.setWidth("400px");
player.setHeight("300px");
player.setSource(new ClassResource("simple.swf"));
addComponent(player);
Button button = new Button("click", e -> player.setSizeFull());
addComponent(button);
}

@Override
protected String getDescription() {
return "Flash object should expand according to percentile sizes";
}

@Override
protected Integer getTicketNumber() {
return 4035;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.vaadin.tests.components.flash;

import java.util.List;

import org.junit.Assert;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;

import com.vaadin.testbench.elements.ButtonElement;
import com.vaadin.testbench.elements.FlashElement;
import com.vaadin.testbench.parallel.Browser;
import com.vaadin.tests.tb3.MultiBrowserTest;

public class FlashExpansionTest extends MultiBrowserTest {

@Override
public List<DesiredCapabilities> getBrowsersToTest() {
return getBrowsersSupportingFlash();
}

private final By locator = By.tagName("embed");

@Test
public void testFlashIsExpanded() throws Exception {
openTestURL();
/* Allow the flash plugin to load */
waitForElementPresent(locator);
WebElement embed = $(FlashElement.class).first().findElement(locator);
String width = embed.getAttribute("width");
Assert.assertTrue("Width is not 400.0px initially",
"400.0px".equals(width));
$(ButtonElement.class).first().click();
String widthAfterExpansion = embed.getAttribute("width");
Assert.assertFalse("Width is still 400.0px after expansion",
"400.0px".equals(widthAfterExpansion));
}

private List<DesiredCapabilities> getBrowsersSupportingFlash() {
// No Flash support in Chrome, FF, PhantomJS
return getBrowserCapabilities(Browser.IE8, Browser.IE9, Browser.IE10,
Browser.IE11);
}
}