netwerk/base/nsMediaFragmentURIParser.h
author Andrew Osmond <aosmond@mozilla.com>
Fri, 17 Nov 2017 06:45:28 -0500
changeset 392351 b9a29d94ccac646c9336fa75e084bbc8581501ad
parent 322705 3cbb93f5768e0e5ac470d3bb29cea58fe2f45df3
child 448947 6f3709b3878117466168c40affa7bca0b60cf75b
permissions -rw-r--r--
Bug 1368776 - Part 15. Cache flags passed to ImageResource::GetImageContainerImpl for consistency. r=tnikkel When FLAG_HIGH_QUALITY_SCALING is used, we need to make sure we continue using that flag when we update the container. We should also use it for comparing whether or not an existing image container is equivalent.

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#if !defined(nsMediaFragmentURIParser_h__)
#define nsMediaFragmentURIParser_h__

#include "mozilla/Maybe.h"
#include "nsStringFwd.h"
#include "nsRect.h"

class nsIURI;

// Class to handle parsing of a W3C media fragment URI as per
// spec at: http://www.w3.org/TR/media-frags/
// Only the temporaral URI portion of the spec is implemented.
// To use:
// a) Construct an instance with the URI containing the fragment
// b) Check for the validity of the values you are interested in
//    using e.g. HasStartTime().
// c) If the values are valid, obtain them using e.g. GetStartTime().

namespace mozilla { namespace net {

enum ClipUnit
{
  eClipUnit_Pixel,
  eClipUnit_Percent,
};

class nsMediaFragmentURIParser
{
public:
  // Create a parser with the provided URI.
  explicit nsMediaFragmentURIParser(nsIURI* aURI);

  // Create a parser with the provided URI reference portion.
  explicit nsMediaFragmentURIParser(nsCString& aRef);

  // True if a valid temporal media fragment indicated a start time.
  bool HasStartTime() const { return mStart.isSome(); }

  // If a valid temporal media fragment indicated a start time, returns
  // it in units of seconds. If not, defaults to 0.
  double GetStartTime() const { return *mStart; }

  // True if a valid temporal media fragment indicated an end time.
  bool HasEndTime() const { return mEnd.isSome(); }

  // If a valid temporal media fragment indicated an end time, returns
  // it in units of seconds. If not, defaults to -1.
  double GetEndTime() const { return *mEnd; }

  // True if a valid spatial media fragment indicated a clipping region.
  bool HasClip() const { return mClip.isSome(); }

  // If a valid spatial media fragment indicated a clipping region,
  // returns the region. If not, returns an empty region. The unit
  // used depends on the value returned by GetClipUnit().
  nsIntRect GetClip() const { return *mClip; }

  // If a valid spatial media fragment indicated a clipping region,
  // returns the unit used.
  ClipUnit GetClipUnit() const { return mClipUnit; }

private:
  // Parse the URI ref provided, looking for media fragments. This is
  // the top-level parser the invokes the others below.
  void Parse(nsACString& aRef);

  // The following methods parse the fragment as per the media
  // fragments specification. 'aString' contains the remaining
  // fragment data to be parsed. The method returns true
  // if the parse was successful and leaves the remaining unparsed
  // data in 'aString'. If the parse fails then false is returned
  // and 'aString' is left as it was when called.
  bool ParseNPT(nsDependentSubstring aString);
  bool ParseNPTTime(nsDependentSubstring& aString, double& aTime);
  bool ParseNPTSec(nsDependentSubstring& aString, double& aSec);
  bool ParseNPTFraction(nsDependentSubstring& aString, double& aFraction);
  bool ParseNPTMMSS(nsDependentSubstring& aString, double& aTime);
  bool ParseNPTHHMMSS(nsDependentSubstring& aString, double& aTime);
  bool ParseNPTHH(nsDependentSubstring& aString, uint32_t& aHour);
  bool ParseNPTMM(nsDependentSubstring& aString, uint32_t& aMinute);
  bool ParseNPTSS(nsDependentSubstring& aString, uint32_t& aSecond);
  bool ParseXYWH(nsDependentSubstring aString);
  bool ParseMozResolution(nsDependentSubstring aString);

  // Media fragment information.
  Maybe<double>    mStart;
  Maybe<double>    mEnd;
  Maybe<nsIntRect> mClip;
  ClipUnit         mClipUnit;
};

} // namespace net
} // namespace mozilla

#endif