blob: 52d40eeaef4a6f5eac747f7506ff2ffac5381b29 [file] [log] [blame]
// Copyright 2017 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.
#ifndef COBALT_ACCESSIBILITY_INTERNAL_LIVE_REGION_H_
#define COBALT_ACCESSIBILITY_INTERNAL_LIVE_REGION_H_
#include <string>
#include "base/memory/scoped_ptr.h"
#include "cobalt/dom/node.h"
namespace cobalt {
namespace accessibility {
namespace internal {
// Collection of functions to support the implementation of wai-aria Live
// Regions:
// https://www.w3.org/TR/2010/WD-wai-aria-20100916/terms#def_liveregion
class LiveRegion {
public:
// Types of mutation to the DOM subtree that might cause a live region to be
// updated, corresponding to the possible values of aria-relevant as
// described in:
// https://www.w3.org/TR/2011/CR-wai-aria-20110118/states_and_properties#aria-relevant
enum MutationType {
kMutationTypeAddition = 1, // corresponds to "additions"
kMutationTypeRemoval, // corresponds to "removals"
kMutationTypeText, // corresponds to "text"
};
// Returns a LiveRegion instance describing the live region that this element
// is a member of, or NULL if this element is not part of a live region.
//
// Searches the element's ancestors looking for the first element with a
// valid aria-live attribute.
static scoped_ptr<LiveRegion> GetLiveRegionForNode(
const scoped_refptr<dom::Node>& node);
// Returns true if the value of aria-live is "assertive".
// https://www.w3.org/TR/2011/CR-wai-aria-20110118/states_and_properties#aria-live
bool IsAssertive() const;
// Returns true if this live region should be updated in response to the
// specified type of change, based on the value of this element's
// aria-relevant property.
// https://www.w3.org/TR/2011/CR-wai-aria-20110118/states_and_properties#aria-relevant
bool IsMutationRelevant(MutationType mutation_type) const;
// Returns true if changes to this node should result in an atomic update
// to its live region, according to the value of the aria-atomic property set
// on this node or its ancestors, up to and including the live region root.
//
// https://www.w3.org/TR/2011/CR-wai-aria-20110118/states_and_properties#aria-atomic
bool IsAtomic(const scoped_refptr<dom::Node>& node) const;
// Returns the root of the live region (i.e.) the element that has the
// aria-live property set on it.
const scoped_refptr<dom::Element>& root() { return root_; }
private:
explicit LiveRegion(const scoped_refptr<dom::Element>& root) : root_(root) {}
// The root element of the live region. That is, the element with a valid
// aria-live attribute.
scoped_refptr<dom::Element> root_;
};
} // namespace internal
} // namespace accessibility
} // namespace cobalt
#endif // COBALT_ACCESSIBILITY_INTERNAL_LIVE_REGION_H_