DXR will be turned off on Tuesday, December 29th. It will redirect to Searchfox.
See the announcement on Discourse.

DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (c68fe15a81fc)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */


#ifndef mozilla_dom_MediaDocument_h
#define mozilla_dom_MediaDocument_h

#include "mozilla/Attributes.h"
#include "nsHTMLDocument.h"
#include "nsHTMLDocument.h"
#include "nsGenericHTMLElement.h"
#include "nsIStringBundle.h"
#include "nsIThreadRetargetableStreamListener.h"

#define NSMEDIADOCUMENT_PROPERTIES_URI \
#define NSMEDIADOCUMENT_PROPERTIES_URI \
  "chrome://global/locale/layout/MediaDocument.properties"

#define NSMEDIADOCUMENT_PROPERTIES_URI_en_US \
  "resource://gre/res/locale/layout/MediaDocument.properties"


namespace mozilla {
namespace dom {

class MediaDocument : public nsHTMLDocument {
 public:
 public:
  MediaDocument();
  virtual ~MediaDocument();

  // Subclasses need to override this.
  enum MediaDocumentKind MediaDocumentKind() const override = 0;
  enum MediaDocumentKind MediaDocumentKind() const override = 0;

  virtual nsresult Init() override;

  virtual nsresult StartDocumentLoad(const char* aCommand, nsIChannel* aChannel,
                                     nsILoadGroup* aLoadGroup,
                                     nsILoadGroup* aLoadGroup,
                                     nsISupports* aContainer,
                                     nsIStreamListener** aDocListener,
                                     bool aReset = true,
                                     nsIContentSink* aSink = nullptr) override;


  virtual bool WillIgnoreCharsetOverride() override { return true; }

 protected:
  // Hook to be called once our initial document setup is done.  Subclasses
  // Hook to be called once our initial document setup is done.  Subclasses
  // should call this from SetScriptGlobalObject when setup hasn't been done
  // yet, a non-null script global is being set, and they have finished whatever
  // setup work they plan to do for an initial load.
  void InitialSetupDone();


  // Check whether initial setup has been done.
  MOZ_MUST_USE bool InitialSetupHasBeenDone() const {
    return mDidInitialDocumentSetup;
  }


  virtual nsresult CreateSyntheticDocument();

  friend class MediaDocumentStreamListener;
  virtual nsresult StartLayout();


  void GetFileName(nsAString& aResult, nsIChannel* aChannel);
  void GetFileName(nsAString& aResult, nsIChannel* aChannel);

  nsresult LinkStylesheet(const nsAString& aStylesheet);
  nsresult LinkScript(const nsAString& aScript);

  void FormatStringFromName(const char* aName,
  void FormatStringFromName(const char* aName,
                            const nsTArray<nsString>& aParams,
                            nsAString& aResult);

  // |aFormatNames[]| needs to have four elements in the following order:
  // a format name with neither dimension nor file, a format name with
  // filename but w/o dimension, a format name with dimension but w/o filename,
  // a format name with both of them.  For instance, it can have
  // "ImageTitleWithNeitherDimensionsNorFile", "ImageTitleWithoutDimensions",
  // "ImageTitleWithDimesions2",  "ImageTitleWithDimensions2AndFile".
  // "ImageTitleWithDimesions2",  "ImageTitleWithDimensions2AndFile".
  //
  // Also see MediaDocument.properties if you want to define format names
  // for a new subclass. aWidth and aHeight are pixels for |ImageDocument|,
  // but could be in other units for other 'media', in which case you have to
  // define format names accordingly.
  // define format names accordingly.
  void UpdateTitleAndCharset(const nsACString& aTypeStr, nsIChannel* aChannel,
                             const char* const* aFormatNames = sFormatNames,
                             int32_t aWidth = 0, int32_t aHeight = 0,
                             const nsAString& aStatus = EmptyString());


  nsCOMPtr<nsIStringBundle> mStringBundle;
  nsCOMPtr<nsIStringBundle> mStringBundleEnglish;
  static const char* const sFormatNames[4];

 private:
 private:
  enum { eWithNoInfo, eWithFile, eWithDim, eWithDimAndFile };

  // A boolean that indicates whether we did our initial document setup.  This
  // will be false initially, become true when we finish setting up the document
  // during initial load and stay true thereafter.
  // during initial load and stay true thereafter.
  bool mDidInitialDocumentSetup;
};

class MediaDocumentStreamListener : public nsIStreamListener,
                                    public nsIThreadRetargetableStreamListener {
                                    public nsIThreadRetargetableStreamListener {
 protected:
  virtual ~MediaDocumentStreamListener();

 public:
  explicit MediaDocumentStreamListener(MediaDocument* aDocument);
  explicit MediaDocumentStreamListener(MediaDocument* aDocument);
  void SetStreamListener(nsIStreamListener* aListener);

  NS_DECL_THREADSAFE_ISUPPORTS

  NS_DECL_NSIREQUESTOBSERVER
  NS_DECL_NSIREQUESTOBSERVER

  NS_DECL_NSISTREAMLISTENER

  NS_DECL_NSITHREADRETARGETABLESTREAMLISTENER


  void DropDocumentRef() { mDocument = nullptr; }

  RefPtr<MediaDocument> mDocument;
  nsCOMPtr<nsIStreamListener> mNextStream;
};

}  // namespace dom
}  // namespace dom
}  // namespace mozilla

#endif /* mozilla_dom_MediaDocument_h */