use of com.gargoylesoftware.htmlunit.javascript.host.html.HTMLBodyElement in project htmlunit by HtmlUnit.
the class HtmlUnitNekoDOMBuilder method copyAttributes.
private static void copyAttributes(final DomElement to, final XMLAttributes attrs) {
final int length = attrs.getLength();
for (int i = 0; i < length; i++) {
final String attrName = attrs.getLocalName(i).toLowerCase(Locale.ROOT);
if (to.getAttributes().getNamedItem(attrName) == null) {
to.setAttribute(attrName, attrs.getValue(i));
if (attrName.startsWith("on") && to.getPage().getWebClient().isJavaScriptEngineEnabled() && to.getScriptableObject() instanceof HTMLBodyElement) {
final HTMLBodyElement jsBody = to.getScriptableObject();
jsBody.createEventHandlerFromAttribute(attrName, attrs.getValue(i));
}
}
}
}
use of com.gargoylesoftware.htmlunit.javascript.host.html.HTMLBodyElement in project htmlunit by HtmlUnit.
the class ComputedCSSStyleDeclaration method getEmptyHeight.
/**
* Returns the element's calculated height taking relevant CSS into account, but <b>not</b> the element's child
* elements.
*
* @return the element's calculated height taking relevant CSS into account, but <b>not</b> the element's child
* elements
*/
private int getEmptyHeight() {
if (height2_ != null) {
return height2_.intValue();
}
final DomNode node = getElement().getDomNodeOrDie();
if (!node.mayBeDisplayed()) {
height2_ = Integer.valueOf(0);
return 0;
}
final String display = getDisplay();
if (NONE.equals(display)) {
height2_ = Integer.valueOf(0);
return 0;
}
final Element elem = getElement();
final int windowHeight = elem.getWindow().getWebWindow().getInnerHeight();
if (elem instanceof HTMLBodyElement) {
height2_ = windowHeight;
return windowHeight;
}
final boolean isInline = "inline".equals(display) && !(node instanceof HtmlInlineFrame);
// height is ignored for inline elements
final boolean explicitHeightSpecified = !isInline && !super.getHeight().isEmpty();
int defaultHeight;
if ((elem.getClass() == HTMLElement.class || elem instanceof HTMLDivElement || elem instanceof HTMLUnknownElement || elem instanceof HTMLDataElement || elem instanceof HTMLTimeElement || elem instanceof HTMLOutputElement || elem instanceof HTMLSlotElement || elem instanceof HTMLLegendElement) && StringUtils.isBlank(node.getTextContent())) {
defaultHeight = 0;
} else if (elem.getFirstChild() == null) {
if (node instanceof HtmlRadioButtonInput || node instanceof HtmlCheckBoxInput) {
final BrowserVersion browser = getBrowserVersion();
if (browser.hasFeature(JS_CLIENTHEIGHT_RADIO_CHECKBOX_10)) {
defaultHeight = 10;
} else {
defaultHeight = 13;
}
} else if (node instanceof HtmlButton) {
defaultHeight = 20;
} else if (node instanceof HtmlInput && !(node instanceof HtmlHiddenInput)) {
final BrowserVersion browser = getBrowserVersion();
if (browser.hasFeature(JS_CLIENTHEIGHT_INPUT_17)) {
defaultHeight = 17;
} else if (browser.hasFeature(JS_CLIENTHEIGHT_INPUT_18)) {
defaultHeight = 18;
} else {
defaultHeight = 20;
}
} else if (node instanceof HtmlSelect) {
defaultHeight = 20;
} else if (node instanceof HtmlTextArea) {
defaultHeight = 49;
} else if (node instanceof HtmlInlineFrame) {
defaultHeight = 154;
} else {
defaultHeight = 0;
}
} else {
final String fontSize = getFontSize();
defaultHeight = getBrowserVersion().getFontHeight(fontSize);
if (node instanceof HtmlDivision || node instanceof HtmlSpan) {
String width = getStyleAttribute(WIDTH, false);
// maybe we are enclosed something that forces a width
Element parent = getElement().getParentElement();
while (width.isEmpty() && parent != null) {
width = getWindow().getComputedStyle(parent, null).getStyleAttribute(WIDTH, false);
parent = parent.getParentElement();
}
final int pixelWidth = pixelValue(width);
final String content = node.getVisibleText();
if (pixelWidth > 0 && !width.isEmpty() && StringUtils.isNotBlank(content)) {
final String[] lines = StringUtils.split(content, '\n');
int lineCount = 0;
final int fontSizeInt = Integer.parseInt(fontSize.substring(0, fontSize.length() - 2));
final FontRenderContext fontRenderCtx = new FontRenderContext(null, false, true);
for (final String line : lines) {
if (StringUtils.isBlank(line)) {
lineCount++;
} else {
// width is specified, we have to to some line breaking
final AttributedString attributedString = new AttributedString(line);
attributedString.addAttribute(TextAttribute.SIZE, fontSizeInt / 1.1);
final LineBreakMeasurer lineBreakMeasurer = new LineBreakMeasurer(attributedString.getIterator(), fontRenderCtx);
lineBreakMeasurer.nextLayout(pixelWidth);
lineCount++;
while (lineBreakMeasurer.getPosition() < line.length() && lineCount < 1000) {
lineBreakMeasurer.nextLayout(pixelWidth);
lineCount++;
}
}
}
defaultHeight *= lineCount;
} else {
if (node instanceof HtmlSpan && StringUtils.isEmpty(content)) {
defaultHeight = 0;
} else {
defaultHeight *= StringUtils.countMatches(content, '\n') + 1;
}
}
}
}
final int defaultWindowHeight = elem instanceof HTMLCanvasElement ? 150 : windowHeight;
int height = pixelValue(elem, new CssValue(defaultHeight, defaultWindowHeight) {
@Override
public String get(final ComputedCSSStyleDeclaration style) {
final Element element = style.getElement();
if (element instanceof HTMLBodyElement) {
return String.valueOf(element.getWindow().getWebWindow().getInnerHeight());
}
// height is ignored for inline elements
if (isInline) {
return "";
}
return style.getStyleAttribute(HEIGHT, true);
}
});
if (height == 0 && !explicitHeightSpecified) {
height = defaultHeight;
}
height2_ = Integer.valueOf(height);
return height;
}
use of com.gargoylesoftware.htmlunit.javascript.host.html.HTMLBodyElement in project htmlunit by HtmlUnit.
the class ComputedCSSStyleDeclaration method getCalculatedWidth.
private int getCalculatedWidth() {
if (width_ != null) {
return width_.intValue();
}
final Element element = getElement();
final DomNode node = element.getDomNodeOrDie();
if (!node.mayBeDisplayed()) {
width_ = Integer.valueOf(0);
return 0;
}
final String display = getDisplay();
if (NONE.equals(display)) {
width_ = Integer.valueOf(0);
return 0;
}
final int width;
final String styleWidth = super.getWidth();
final DomNode parent = node.getParentNode();
// width is ignored for inline elements
if (("inline".equals(display) || StringUtils.isEmpty(styleWidth)) && parent instanceof HtmlElement) {
// hack: TODO find a way to specify default values for different tags
if (element instanceof HTMLCanvasElement) {
return 300;
}
// Width not explicitly set.
final String cssFloat = getCssFloat();
if ("right".equals(cssFloat) || "left".equals(cssFloat) || ABSOLUTE.equals(getStyleAttribute(POSITION, true))) {
// We're floating; simplistic approximation: text content * pixels per character.
width = node.getVisibleText().length() * getBrowserVersion().getPixesPerChar();
} else if (BLOCK.equals(display)) {
final int windowWidth = element.getWindow().getWebWindow().getInnerWidth();
if (element instanceof HTMLBodyElement) {
width = windowWidth - 16;
} else {
// Block elements take up 100% of the parent's width.
final HTMLElement parentJS = parent.getScriptableObject();
width = pixelValue(parentJS, new CssValue(0, windowWidth) {
@Override
public String get(final ComputedCSSStyleDeclaration style) {
return style.getWidth();
}
}) - (getBorderHorizontal() + getPaddingHorizontal());
}
} else if (node instanceof HtmlSubmitInput || node instanceof HtmlResetInput || node instanceof HtmlButtonInput || node instanceof HtmlButton || node instanceof HtmlFileInput) {
// use asNormalizedText() here because getVisibleText() returns an empty string
// for submit and reset buttons
final String text = node.asNormalizedText();
// default font for buttons is a bit smaller than the body font size
width = 10 + (int) (text.length() * getBrowserVersion().getPixesPerChar() * 0.9);
} else if (node instanceof HtmlTextInput || node instanceof HtmlPasswordInput) {
final BrowserVersion browserVersion = getBrowserVersion();
if (browserVersion.hasFeature(JS_CLIENTWIDTH_INPUT_TEXT_143)) {
return 143;
}
if (browserVersion.hasFeature(JS_CLIENTWIDTH_INPUT_TEXT_173)) {
return 173;
}
// FF
width = 145;
} else if (node instanceof HtmlRadioButtonInput || node instanceof HtmlCheckBoxInput) {
final BrowserVersion browserVersion = getBrowserVersion();
if (browserVersion.hasFeature(JS_CLIENTWIDTH_RADIO_CHECKBOX_10)) {
width = 10;
} else {
width = 13;
}
} else if (node instanceof HtmlTextArea) {
// wild guess
width = 100;
} else if (node instanceof HtmlImage) {
width = ((HtmlImage) node).getWidthOrDefault();
} else {
// Inline elements take up however much space is required by their children.
width = getContentWidth();
}
} else if (AUTO.equals(styleWidth)) {
width = element.getWindow().getWebWindow().getInnerWidth();
} else {
// Width explicitly set in the style attribute, or there was no parent to provide guidance.
width = pixelValue(element, new CssValue(0, element.getWindow().getWebWindow().getInnerWidth()) {
@Override
public String get(final ComputedCSSStyleDeclaration style) {
return style.getStyleAttribute(WIDTH, true);
}
});
}
width_ = Integer.valueOf(width);
return width;
}
use of com.gargoylesoftware.htmlunit.javascript.host.html.HTMLBodyElement in project htmlunit by HtmlUnit.
the class ComputedCSSStyleDeclaration method getWidth.
/**
* {@inheritDoc}
*/
@Override
public String getWidth() {
if (NONE.equals(getDisplay())) {
return AUTO;
}
final Element elem = getElement();
if (!elem.getDomNodeOrDie().isAttachedToPage()) {
if (getBrowserVersion().hasFeature(CSS_STYLE_PROP_DISCONNECTED_IS_EMPTY)) {
return "";
}
if (getStyleAttribute(WIDTH, true).isEmpty()) {
return AUTO;
}
}
final int windowWidth = elem.getWindow().getWebWindow().getInnerWidth();
return pixelString(elem, new CssValue(0, windowWidth) {
@Override
public String get(final ComputedCSSStyleDeclaration style) {
final String value = style.getStyleAttribute(WIDTH, true);
if (StringUtils.isEmpty(value)) {
if (ABSOLUTE.equals(getStyleAttribute(POSITION, true))) {
final String content = getDomNodeOrDie().getVisibleText();
// at least for empty div's this is more correct
if (null != content && content.length() < 13) {
return (content.length() * 7) + "px";
}
}
int windowDefaultValue = getWindowDefaultValue();
if (elem instanceof HTMLBodyElement) {
windowDefaultValue -= 16;
}
return windowDefaultValue + "px";
} else if (AUTO.equals(value)) {
int windowDefaultValue = getWindowDefaultValue();
if (elem instanceof HTMLBodyElement) {
windowDefaultValue -= 16;
}
return windowDefaultValue + "px";
}
return value;
}
});
}
use of com.gargoylesoftware.htmlunit.javascript.host.html.HTMLBodyElement in project htmlunit by HtmlUnit.
the class ComputedCSSStyleDeclaration method isScrollable.
/**
* @param ignoreSize whether to consider the content/calculated width/height
*/
private boolean isScrollable(final boolean horizontal, final boolean ignoreSize) {
final boolean scrollable;
final Element node = getElement();
final String overflow = getStyleAttribute(OVERFLOW, true);
if (horizontal) {
// TODO: inherit, overflow-x
scrollable = (node instanceof HTMLBodyElement || "scroll".equals(overflow) || AUTO.equals(overflow)) && (ignoreSize || getContentWidth() > getCalculatedWidth());
} else {
// TODO: inherit, overflow-y
scrollable = (node instanceof HTMLBodyElement || "scroll".equals(overflow) || AUTO.equals(overflow)) && (ignoreSize || getContentHeight() > getEmptyHeight());
}
return scrollable;
}
Aggregations