Bug 1729952 [wpt PR 30477] - Fix timeout in grid-positioned-item-dynamic-change-006...
[gecko.git] / netwerk / base / nsMediaFragmentURIParser.h
blob4c277fead88175d0ae3226b6fb42df94a608d741
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #if !defined(nsMediaFragmentURIParser_h__)
7 # define nsMediaFragmentURIParser_h__
9 # include "mozilla/Maybe.h"
10 # include "nsStringFwd.h"
11 # include "nsRect.h"
13 class nsIURI;
15 // Class to handle parsing of a W3C media fragment URI as per
16 // spec at: http://www.w3.org/TR/media-frags/
17 // Only the temporaral URI portion of the spec is implemented.
18 // To use:
19 // a) Construct an instance with the URI containing the fragment
20 // b) Check for the validity of the values you are interested in
21 // using e.g. HasStartTime().
22 // c) If the values are valid, obtain them using e.g. GetStartTime().
24 namespace mozilla {
25 namespace net {
27 enum ClipUnit {
28 eClipUnit_Pixel,
29 eClipUnit_Percent,
32 class nsMediaFragmentURIParser {
33 public:
34 // Create a parser with the provided URI.
35 explicit nsMediaFragmentURIParser(nsIURI* aURI);
37 // Create a parser with the provided URI reference portion.
38 explicit nsMediaFragmentURIParser(nsCString& aRef);
40 // True if a valid temporal media fragment indicated a start time.
41 bool HasStartTime() const { return mStart.isSome(); }
43 // If a valid temporal media fragment indicated a start time, returns
44 // it in units of seconds. If not, defaults to 0.
45 double GetStartTime() const { return *mStart; }
47 // True if a valid temporal media fragment indicated an end time.
48 bool HasEndTime() const { return mEnd.isSome(); }
50 // If a valid temporal media fragment indicated an end time, returns
51 // it in units of seconds. If not, defaults to -1.
52 double GetEndTime() const { return *mEnd; }
54 // True if a valid spatial media fragment indicated a clipping region.
55 bool HasClip() const { return mClip.isSome(); }
57 // If a valid spatial media fragment indicated a clipping region,
58 // returns the region. If not, returns an empty region. The unit
59 // used depends on the value returned by GetClipUnit().
60 nsIntRect GetClip() const { return *mClip; }
62 // If a valid spatial media fragment indicated a clipping region,
63 // returns the unit used.
64 ClipUnit GetClipUnit() const { return mClipUnit; }
66 private:
67 // Parse the URI ref provided, looking for media fragments. This is
68 // the top-level parser the invokes the others below.
69 void Parse(nsACString& aRef);
71 // The following methods parse the fragment as per the media
72 // fragments specification. 'aString' contains the remaining
73 // fragment data to be parsed. The method returns true
74 // if the parse was successful and leaves the remaining unparsed
75 // data in 'aString'. If the parse fails then false is returned
76 // and 'aString' is left as it was when called.
77 bool ParseNPT(nsDependentSubstring aString);
78 bool ParseNPTTime(nsDependentSubstring& aString, double& aTime);
79 bool ParseNPTSec(nsDependentSubstring& aString, double& aSec);
80 bool ParseNPTFraction(nsDependentSubstring& aString, double& aFraction);
81 bool ParseNPTMMSS(nsDependentSubstring& aString, double& aTime);
82 bool ParseNPTHHMMSS(nsDependentSubstring& aString, double& aTime);
83 bool ParseNPTHH(nsDependentSubstring& aString, uint32_t& aHour);
84 bool ParseNPTMM(nsDependentSubstring& aString, uint32_t& aMinute);
85 bool ParseNPTSS(nsDependentSubstring& aString, uint32_t& aSecond);
86 bool ParseXYWH(nsDependentSubstring aString);
87 bool ParseMozResolution(nsDependentSubstring aString);
89 // Media fragment information.
90 Maybe<double> mStart;
91 Maybe<double> mEnd;
92 Maybe<nsIntRect> mClip;
93 ClipUnit mClipUnit;
96 } // namespace net
97 } // namespace mozilla
99 #endif