// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// 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.

#include "cobalt/dom/document.h"
#include "cobalt/dom/html_anchor_element.h"

namespace cobalt {
namespace dom {

// static
const char HTMLAnchorElement::kTagName[] = "a";

void HTMLAnchorElement::OnSetAttribute(const std::string& name,
                                       const std::string& value) {
  if (name == "href") {
    // Custom, not in any spec.
    // The setter should simply forward the call to URLUtils. However, there
    // isn't any mentioning of resolving the relative URL in the URLUtils
    // descriptions while major browsers do resolve URL here. We are diverging
    // from the spec here so the behavior matches that of major browsers.
    if (!ResolveAndSetURL(value)) {
      url_utils_.set_url(GURL(value));
    }
  }
}

void HTMLAnchorElement::OnRemoveAttribute(const std::string& name) {
  if (name == "href") {
    url_utils_.set_url(GURL());
  }
}

bool HTMLAnchorElement::ResolveAndSetURL(const std::string& value) {
  Document* document = node_document();

  // If the document has no browsing context, do not resolve
  if (!document->html_element_context()) {
    return false;
  }

  // Resolve the URL given by the href attribute, relative to the element.
  const GURL& base_url = document->url_as_gurl();
  GURL absolute_url = base_url.Resolve(value);

  // If the previous step fails, then abort these steps.
  if (!absolute_url.is_valid()) {
    LOG(WARNING) << value << " cannot be resolved based on " << base_url << ".";
    return false;
  }

  url_utils_.set_url(absolute_url);
  return true;
}

void HTMLAnchorElement::UpdateSteps(const std::string& value) {
  url_utils_.set_url(GURL(value));
  SetAttribute("href", value);
}

}  // namespace dom
}  // namespace cobalt
