Ejemplo n.º 1
0
  /**
   * Create a new HTML element with the given tag name.
   *
   * @param tagName the tag name
   * @return the new HTML element, or NOT_FOUND if the tag is not supported
   */
  @JsxFunction
  public Object createElement(String tagName) {
    Object result = NOT_FOUND;
    try {
      final BrowserVersion browserVersion = getBrowserVersion();

      // FF3.6 supports document.createElement('div') or supports document.createElement('<div>')
      // but not document.createElement('<div name="test">')
      // IE9- supports also document.createElement('<div name="test">')
      // FF4+ and IE11 don't support document.createElement('<div>')
      if (browserVersion.hasFeature(BrowserVersionFeatures.JS_DOCUMENT_CREATE_ELEMENT_STRICT)
          && (tagName.contains("<") || tagName.contains(">"))) {
        LOG.info(
            "createElement: Provided string '"
                + tagName
                + "' contains an invalid character; '<' and '>' are not allowed");
        throw Context.reportRuntimeError("String contains an invalid character");
      } else if (!browserVersion.hasFeature(JS_DOCUMENT_CREATE_ELEMENT_EXTENDED_SYNTAX)
          && tagName.startsWith("<")
          && tagName.endsWith(">")) {
        tagName = tagName.substring(1, tagName.length() - 1);

        final Matcher matcher = TAG_NAME_PATTERN.matcher(tagName);
        if (!matcher.matches()) {
          LOG.info(
              "createElement: Provided string '" + tagName + "' contains an invalid character");
          throw Context.reportRuntimeError("String contains an invalid character");
        }
      }

      final SgmlPage page = getPage();
      final org.w3c.dom.Node element;
      if ("comment".equalsIgnoreCase(tagName)
          && browserVersion.hasFeature(JS_DOCUMENT_CREATE_ELEMENT_COMMENT)) {
        element = new DomComment(page, "");
      } else {
        element = page.createElement(tagName);
        if (element instanceof BaseFrameElement) {
          ((BaseFrameElement) element).markAsCreatedByJavascript();
        } else if (element instanceof HtmlInput) {
          ((HtmlInput) element).markAsCreatedByJavascript();
        } else if (element instanceof HtmlImage) {
          ((HtmlImage) element).markAsCreatedByJavascript();
        } else if (element instanceof HtmlKeygen) {
          ((HtmlKeygen) element).markAsCreatedByJavascript();
        } else if (element instanceof HtmlRp) {
          ((HtmlRp) element).markAsCreatedByJavascript();
        } else if (element instanceof HtmlRt) {
          ((HtmlRt) element).markAsCreatedByJavascript();
        } else if (element instanceof HtmlUnknownElement) {
          ((HtmlUnknownElement) element).markAsCreatedByJavascript();
        }
      }
      final Object jsElement;
      if ("event".equalsIgnoreCase(tagName)
          && browserVersion.hasFeature(JS_DOCUMENT_CREATE_ELEMENT_COMMENT)) {
        jsElement = new SimpleScriptable();
        ((SimpleScriptable) jsElement).setClassName("Object");
        ((SimpleScriptable) jsElement).setParentScope(window_);
      } else {
        jsElement = getScriptableFor(element);
      }

      if (jsElement == NOT_FOUND) {
        if (LOG.isDebugEnabled()) {
          LOG.debug(
              "createElement("
                  + tagName
                  + ") cannot return a result as there isn't a JavaScript object for the element "
                  + element.getClass().getName());
        }
      } else {
        result = jsElement;
      }
    } catch (final ElementNotFoundException e) {
      // Just fall through - result is already set to NOT_FOUND
    }
    return result;
  }