// Copyright 2014 Google Inc. 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/css_parser/margin_or_padding_shorthand.h"

namespace cobalt {
namespace css_parser {

scoped_ptr<MarginOrPaddingShorthand> MarginOrPaddingShorthand::TryCreate(
    const scoped_refptr<cssom::PropertyValue>& top,
    const scoped_refptr<cssom::PropertyValue>& right,
    const scoped_refptr<cssom::PropertyValue>& bottom,
    const scoped_refptr<cssom::PropertyValue>& left) {
  // User agents must ignore a declaration with an illegal value.
  //   https://www.w3.org/TR/CSS21/syndata.html#illegalvalues
  if (top == NULL || right == NULL || bottom == NULL || left == NULL) {
    return scoped_ptr<MarginOrPaddingShorthand>();
  }

  scoped_ptr<MarginOrPaddingShorthand> shorthand(
      new MarginOrPaddingShorthand());
  shorthand->top = top;
  shorthand->right = right;
  shorthand->bottom = bottom;
  shorthand->left = left;
  return shorthand.Pass();
}

}  // namespace css_parser
}  // namespace cobalt
