Bug 1410214: Part 2 - Add a stub Hunspell FileMgr that allows it to read URLs. r=masayuki
authorKris Maglione <maglione.k@gmail.com>
Thu, 26 Apr 2018 13:29:04 -0700
changeset 472076 3dd497b3e3f15b06e3e786d00addcd5ef85b97cb
parent 472075 2f1e8f0e6b5316f9119a7111100af50c4b7025af
child 472077 30448613bb72e41e386baf2e5e88cabd5ff720a8
push id1728
push userjlund@mozilla.com
push dateMon, 18 Jun 2018 21:12:27 +0000
treeherdermozilla-release@c296fde26f5f [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmasayuki
bugs1410214
milestone61.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1410214: Part 2 - Add a stub Hunspell FileMgr that allows it to read URLs. r=masayuki This will allow us to store dictionaries in packed extension XPIs and/or omni.ja, which should give us a significant startup performance win. MozReview-Commit-ID: K7fzJJAywjC
extensions/spellcheck/hunspell/glue/moz.build
extensions/spellcheck/hunspell/glue/mozHunspellFileMgr.cpp
extensions/spellcheck/hunspell/glue/mozHunspellFileMgr.h
extensions/spellcheck/hunspell/src/filemgr.cxx
extensions/spellcheck/hunspell/src/filemgr.hxx
extensions/spellcheck/hunspell/src/moz.build
--- a/extensions/spellcheck/hunspell/glue/moz.build
+++ b/extensions/spellcheck/hunspell/glue/moz.build
@@ -2,16 +2,17 @@
 # vim: set filetype=python:
 # 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/.
 
 UNIFIED_SOURCES += [
     'mozHunspell.cpp',
     'mozHunspellDirProvider.cpp',
+    'mozHunspellFileMgr.cpp',
     'RemoteSpellCheckEngineChild.cpp',
     'RemoteSpellCheckEngineParent.cpp',
 ]
 
 FINAL_LIBRARY = 'xul'
 
 if CONFIG['MOZ_SYSTEM_HUNSPELL']:
     CXXFLAGS += CONFIG['MOZ_HUNSPELL_CFLAGS']
new file mode 100644
--- /dev/null
+++ b/extensions/spellcheck/hunspell/glue/mozHunspellFileMgr.cpp
@@ -0,0 +1,75 @@
+/* -*- 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/. */
+
+#include "mozHunspellFileMgr.h"
+
+#include "mozilla/DebugOnly.h"
+#include "nsContentUtils.h"
+#include "nsILoadInfo.h"
+#include "nsNetUtil.h"
+#include "nsXPCOM.h"
+
+using namespace mozilla;
+
+FileMgr::FileMgr(const char* aFilename, const char* aKey)
+{
+  DebugOnly<Result<Ok, nsresult>> result = Open(nsDependentCString(aFilename));
+  NS_WARNING_ASSERTION(result.value.isOk(), "Failed to open Hunspell file");
+}
+
+Result<Ok, nsresult>
+FileMgr::Open(const nsACString& aPath)
+{
+  nsCOMPtr<nsIURI> uri;
+
+  nsresult rv = NS_NewURI(getter_AddRefs(uri), aPath);
+  if (NS_FAILED(rv)) {
+    nsCOMPtr<nsIFile> file;
+    MOZ_TRY(NS_NewNativeLocalFile(aPath, false, getter_AddRefs(file)));
+    MOZ_TRY(NS_NewFileURI(getter_AddRefs(uri), file));
+  }
+
+  nsCOMPtr<nsIChannel> channel;
+  MOZ_TRY(NS_NewChannel(
+    getter_AddRefs(channel),
+    uri,
+    nsContentUtils::GetSystemPrincipal(),
+    nsILoadInfo::SEC_REQUIRE_SAME_ORIGIN_DATA_INHERITS,
+    nsIContentPolicy::TYPE_OTHER));
+
+  MOZ_TRY(channel->Open2(getter_AddRefs(mStream)));
+  return Ok();
+}
+
+Result<Ok, nsresult>
+FileMgr::ReadLine(nsACString& aLine)
+{
+  if (!mStream) {
+    return Err(NS_ERROR_NOT_INITIALIZED);
+  }
+
+  bool ok;
+  MOZ_TRY(NS_ReadLine(mStream.get(), &mLineBuffer, aLine, &ok));
+  if (!ok) {
+    mStream = nullptr;
+  }
+
+  mLineNum++;
+  return Ok();
+}
+
+bool
+FileMgr::getline(std::string& aResult)
+{
+  nsAutoCString line;
+  auto res = ReadLine(line);
+  if (res.isErr()) {
+    return false;
+  }
+
+  aResult.assign(line.BeginReading(), line.Length());
+  return true;
+}
new file mode 100644
--- /dev/null
+++ b/extensions/spellcheck/hunspell/glue/mozHunspellFileMgr.h
@@ -0,0 +1,47 @@
+/* -*- 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 mozHunspellFileMgr_h
+#define mozHunspellFileMgr_h
+
+#include <string>
+
+#include "mozilla/Result.h"
+#include "mozilla/ResultExtensions.h"
+#include "nsIInputStream.h"
+#include "nsReadLine.h"
+
+// Note: This class name and lack of namespacing terrible, but are necessary
+// for Hunspell compatibility.
+class FileMgr final
+{
+public:
+  /**
+   * aFilename may be the native filesystem path or local file/jar URI for the
+   * file to load.
+   *
+   * aKey is the decription key for encrypted Hunzip files, and is
+   * unsupported. The argument is there solely for compatibility.
+   */
+  explicit FileMgr(const char* aFilename, const char* aKey = nullptr);
+  ~FileMgr() = default;
+
+  // Note: The nonstandard naming conventions of these methods are necessary for
+  // Hunspell compatibility.
+  bool getline(std::string& aLine);
+  int getlinenum() const { return mLineNum; }
+
+private:
+  mozilla::Result<mozilla::Ok, nsresult> Open(const nsACString& aPath);
+
+  mozilla::Result<mozilla::Ok, nsresult> ReadLine(nsACString& aLine);
+
+  int mLineNum = 0;
+  nsCOMPtr<nsIInputStream> mStream;
+  nsLineBuffer<char> mLineBuffer;
+};
+
+#endif // mozHunspellFileMgr_h
deleted file mode 100644
--- a/extensions/spellcheck/hunspell/src/filemgr.cxx
+++ /dev/null
@@ -1,117 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * Copyright (C) 2002-2017 Németh László
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (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.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * Hunspell is based on MySpell which is Copyright (C) 2002 Kevin Hendricks.
- *
- * Contributor(s): David Einstein, Davide Prina, Giuseppe Modugno,
- * Gianluca Turconi, Simon Brouwer, Noll János, Bíró Árpád,
- * Goldman Eleonóra, Sarlós Tamás, Bencsáth Boldizsár, Halácsy Péter,
- * Dvornik László, Gefferth András, Nagy Viktor, Varga Dániel, Chris Halls,
- * Rene Engelhard, Bram Moolenaar, Dafydd Jones, Harri Pitkänen
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-/*
- * Copyright 2002 Kevin B. Hendricks, Stratford, Ontario, Canada
- * And Contributors.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * 3. All modifications to the source code must be clearly marked as
- *    such.  Binary redistributions based on modified source code
- *    must be clearly marked as modified versions in the documentation
- *    and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY KEVIN B. HENDRICKS AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
- * KEVIN B. HENDRICKS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-
-#include "filemgr.hxx"
-#include "csutil.hxx"
-
-int FileMgr::fail(const char* err, const char* par) {
-  fprintf(stderr, err, par);
-  return -1;
-}
-
-FileMgr::FileMgr(const char* file, const char* key) : hin(NULL), linenum(0) {
-  in[0] = '\0';
-
-  myopen(fin, file, std::ios_base::in);
-  if (!fin.is_open()) {
-    // check hzipped file
-    std::string st(file);
-    st.append(HZIP_EXTENSION);
-    hin = new Hunzip(st.c_str(), key);
-  }
-  if (!fin.is_open() && !hin->is_open())
-    fail(MSG_OPEN, file);
-}
-
-FileMgr::~FileMgr() {
-  delete hin;
-}
-
-bool FileMgr::getline(std::string& dest) {
-  bool ret = false;
-  ++linenum;
-  if (fin.is_open()) {
-    ret = static_cast<bool>(std::getline(fin, dest));
-  } else if (hin->is_open()) {
-    ret = hin->getline(dest);
-  }
-  if (!ret) {
-    --linenum;
-  }
-  return ret;
-}
-
-int FileMgr::getlinenum() {
-  return linenum;
-}
--- a/extensions/spellcheck/hunspell/src/filemgr.hxx
+++ b/extensions/spellcheck/hunspell/src/filemgr.hxx
@@ -67,32 +67,11 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
 
 /* file manager class - read lines of files [filename] OR [filename.hz] */
 #ifndef FILEMGR_HXX_
 #define FILEMGR_HXX_
 
-#include "hunzip.hxx"
-#include <stdio.h>
-#include <string>
-#include <fstream>
-
-class FileMgr {
- private:
-  FileMgr(const FileMgr&);
-  FileMgr& operator=(const FileMgr&);
+#include "mozHunspellFileMgr.h"
 
- protected:
-  std::ifstream fin;
-  Hunzip* hin;
-  char in[BUFSIZE + 50];  // input buffer
-  int fail(const char* err, const char* par);
-  int linenum;
-
- public:
-  FileMgr(const char* filename, const char* key = NULL);
-  ~FileMgr();
-  bool getline(std::string&);
-  int getlinenum();
-};
 #endif
--- a/extensions/spellcheck/hunspell/src/moz.build
+++ b/extensions/spellcheck/hunspell/src/moz.build
@@ -3,20 +3,18 @@
 # 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/.
 
 UNIFIED_SOURCES += [
     'affentry.cxx',
     'affixmgr.cxx',
     'csutil.cxx',
-    'filemgr.cxx',
     'hashmgr.cxx',
     'hunspell.cxx',
-    'hunzip.cxx',
     'phonet.cxx',
     'replist.cxx',
     'suggestmgr.cxx',
 ]
 
 # This variable is referenced in configure.in.  Make sure to change that file
 # too if you need to change this variable.
 DEFINES['HUNSPELL_STATIC'] = True