docshell/base/nsDefaultURIFixup.h
author Iain Ireland <iireland@mozilla.com>
Fri, 11 Jan 2019 18:05:36 +0000
changeset 453523 025feea5945bffc625e9cca2e23be51ee8670315
parent 448947 6f3709b3878117466168c40affa7bca0b60cf75b
permissions -rw-r--r--
Bug 1480390: Move ForOfIterClose logic inside TryNoteIter r=tcampbell This patch was intended to be a pure refactoring of existing code with no side-effects, moving the logic for handling for-of/for-of-iterclose trynotes inside TryNoteIter to avoid duplicating logic in all users of TryNoteIter. However, it turns out that there was a subtle preexisting bug in TryNoteIter that is fixed by the refactoring. Specifically, the logic to skip from a for-of-iterclose to its enclosing for-of must run before the logic to skip trynotes based on stack depth. Otherwise, the stack depth code may filter out the enclosing for-of (see the attached test case for an example) and we will skip too many try-notes. Differential Revision: https://phabricator.services.mozilla.com/D14783

/* -*- 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 NSDEFAULTURIFIXUP_H
#define NSDEFAULTURIFIXUP_H

#include "nsIURIFixup.h"

class nsDefaultURIFixupInfo;

/* Header file */
class nsDefaultURIFixup : public nsIURIFixup {
 public:
  NS_DECL_ISUPPORTS
  NS_DECL_NSIURIFIXUP

  nsDefaultURIFixup();

 protected:
  virtual ~nsDefaultURIFixup();

 private:
  /* additional members */
  nsresult FileURIFixup(const nsACString& aStringURI, nsIURI** aURI);
  nsresult ConvertFileToStringURI(const nsACString& aIn, nsCString& aResult);
  nsresult FixupURIProtocol(const nsACString& aIn,
                            nsDefaultURIFixupInfo* aFixupInfo, nsIURI** aURI);
  nsresult KeywordURIFixup(const nsACString& aStringURI,
                           nsDefaultURIFixupInfo* aFixupInfo,
                           nsIInputStream** aPostData);
  nsresult TryKeywordFixupForURIInfo(const nsACString& aStringURI,
                                     nsDefaultURIFixupInfo* aFixupInfo,
                                     nsIInputStream** aPostData);
  bool PossiblyHostPortUrl(const nsACString& aUrl);
  bool MakeAlternateURI(nsCOMPtr<nsIURI>& aURI);
  bool IsDomainWhitelisted(const nsACString& aAsciiHost,
                           const uint32_t aDotLoc);
};

class nsDefaultURIFixupInfo : public nsIURIFixupInfo {
 public:
  NS_DECL_ISUPPORTS
  NS_DECL_NSIURIFIXUPINFO

  explicit nsDefaultURIFixupInfo(const nsACString& aOriginalInput);

  friend class nsDefaultURIFixup;

 protected:
  virtual ~nsDefaultURIFixupInfo();

 private:
  nsCOMPtr<nsISupports> mConsumer;
  nsCOMPtr<nsIURI> mPreferredURI;
  nsCOMPtr<nsIURI> mFixedURI;
  bool mFixupChangedProtocol;
  bool mFixupCreatedAlternateURI;
  nsString mKeywordProviderName;
  nsString mKeywordAsSent;
  nsCString mOriginalInput;
};
#endif