Merge b-s to m-c
authorKyle Huey <khuey@kylehuey.com>
Wed, 06 Jul 2011 18:12:47 -0700
changeset 72426 b2622d5c857ab7e1cda6340e51227e1ab9efbb59
parent 72418 ea752bcac5c5af2f6cef891e63baf020857b3463 (current diff)
parent 72425 bfe5c1dc773be35be041d037aa6aa83087ddbeb8 (diff)
child 72459 3f9e716164ef3c1e26285ce1915d23475bbfb04c
child 72769 c0f2e4e62a36f9b553ebae06a1663ce10e436ff1
push id20717
push userkhuey@mozilla.com
push dateThu, 07 Jul 2011 01:12:40 +0000
treeherdermozilla-central@b2622d5c857a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone8.0a1
first release with
nightly linux32
b2622d5c857a / 8.0a1 / 20110707030839 / files
nightly linux64
b2622d5c857a / 8.0a1 / 20110707030839 / files
nightly mac
b2622d5c857a / 8.0a1 / 20110707030839 / files
nightly win32
b2622d5c857a / 8.0a1 / 20110707030839 / files
nightly win64
b2622d5c857a / 8.0a1 / 20110707030243 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge b-s to m-c
--- a/build/pgo/profileserver.py
+++ b/build/pgo/profileserver.py
@@ -86,26 +86,26 @@ if __name__ == '__main__':
           options.debuggerInteractive)
 
   httpd = EasyServer(("", PORT), SimpleHTTPServer.SimpleHTTPRequestHandler)
   t = threading.Thread(target=httpd.serve_forever)
   t.setDaemon(True) # don't hang on exit
   t.start()
   
   automation.setServerInfo("localhost", PORT)
-  automation.initializeProfile(PROFILE_DIRECTORY)
   browserEnv = automation.environment()
   browserEnv["XPCOM_DEBUG_BREAK"] = "warn"
   browserEnv["MOZ_JAR_LOG_DIR"] = MOZ_JAR_LOG_DIR
 
   url = "http://localhost:%d/index.html" % PORT
   appPath = os.path.join(SCRIPT_DIR, automation.DEFAULT_APP)
 
   for i in range(0, num_runs):
       if num_runs != 1:
           print "Starting profiling run %d of %d" % (i + 1, num_runs)
+      automation.initializeProfile(PROFILE_DIRECTORY)
       status = automation.runApp(url, browserEnv, appPath, PROFILE_DIRECTORY, {},
                                  debuggerInfo=debuggerInfo,
                                  # the profiling HTML doesn't output anything,
                                  # so let's just run this without a timeout
                                  timeout = None)
       if status != 0:
           sys.exit(status)
--- a/content/base/src/nsDOMFile.cpp
+++ b/content/base/src/nsDOMFile.cpp
@@ -419,16 +419,21 @@ nsDOMFile::Initialize(nsISupports* aOwne
     NS_ASSERTION(file, "This should never happen");
   }
 
   PRBool exists;
   rv = file->Exists(&exists);
   NS_ENSURE_SUCCESS(rv, rv);
   NS_ENSURE_TRUE(exists, NS_ERROR_FILE_NOT_FOUND);
 
+  PRBool isDir;
+  rv = file->IsDirectory(&isDir);
+  NS_ENSURE_SUCCESS(rv, rv);
+  NS_ENSURE_FALSE(isDir, NS_ERROR_FILE_IS_DIRECTORY);
+
   mFile = file;
   return NS_OK;
 }
 
 // nsDOMMemoryFile Implementation
 NS_IMETHODIMP
 nsDOMMemoryFile::GetName(nsAString &aFileName)
 {
--- a/content/base/test/chrome/test_fileconstructor.xul
+++ b/content/base/test/chrome/test_fileconstructor.xul
@@ -59,15 +59,24 @@ try {
 } catch (e) {
   ok(true, "Botched file constructor attempts throw and do not crash.");
 }
 
 try {
   var nonexistentfile = new File("i/sure/hope/this/does/not/exist/anywhere.txt");
   ok(false, "This should never be reached!");
 } catch (e) {
-  ok(true, "Attempt to construct a non-existent file should fail.")
+  ok(true, "Attempt to construct a non-existent file should fail.");
 }
 
+try {
+  var dir = Components.classes["@mozilla.org/file/directory_service;1"]
+                      .getService(Components.interfaces.nsIProperties)
+                      .get("CurWorkD", Components.interfaces.nsIFile);
+  var dirfile = new File(dir);
+  ok(false, "This should never be reached!");
+} catch (e) {
+  ok(true, "Attempt to construct a file from a directory should fail.");
+}
 ]]>
 </script>
 
 </window>
--- a/js/src/xpconnect/loader/mozJSComponentLoader.cpp
+++ b/js/src/xpconnect/loader/mozJSComponentLoader.cpp
@@ -66,16 +66,17 @@
 #include "nsIObserverService.h"
 #include "nsIXPCScriptable.h"
 #include "nsString.h"
 #include "nsIScriptSecurityManager.h"
 #include "nsIURI.h"
 #include "nsIFileURL.h"
 #include "nsIJARURI.h"
 #include "nsNetUtil.h"
+#include "nsDOMFile.h"
 #include "jsxdrapi.h"
 #include "jscompartment.h"
 #include "jsprf.h"
 // For reporting errors with the console service
 #include "nsIScriptError.h"
 #include "nsIConsoleService.h"
 #include "nsIStorageStream.h"
 #include "nsIStringStream.h"
@@ -228,21 +229,70 @@ static JSBool
 Btoa(JSContext *cx, uintN argc, jsval *vp)
 {
     if (!argc)
         return JS_TRUE;
 
     return nsXPConnect::Base64Encode(cx, JS_ARGV(cx, vp)[0], &JS_RVAL(cx, vp));
 }
 
+static JSBool
+File(JSContext *cx, uintN argc, jsval *vp)
+{
+    nsresult rv;
+
+    if (!argc) {
+        XPCThrower::Throw(NS_ERROR_UNEXPECTED, cx);
+        return JS_FALSE;
+    }
+
+    nsCOMPtr<nsISupports> native;
+    rv = nsDOMFile::NewFile(getter_AddRefs(native));
+    if (NS_FAILED(rv)) {
+        XPCThrower::Throw(rv, cx);
+        return JS_FALSE;
+    }
+
+    nsCOMPtr<nsIJSNativeInitializer> initializer = do_QueryInterface(native);
+    NS_ASSERTION(initializer, "what?");
+
+    rv = initializer->Initialize(nsnull, cx, nsnull, argc, JS_ARGV(cx, vp));
+    if (NS_FAILED(rv)) {
+        XPCThrower::Throw(rv, cx);
+        return JS_FALSE;
+    }
+
+    nsXPConnect* xpc = nsXPConnect::GetXPConnect();
+    if (!xpc) {
+        XPCThrower::Throw(NS_ERROR_UNEXPECTED, cx);
+        return JS_FALSE;
+    }
+
+    JSObject* glob = JS_GetGlobalForScopeChain(cx);
+
+    nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
+    jsval retval;
+    rv = xpc->WrapNativeToJSVal(cx, glob, native, nsnull,
+                                &NS_GET_IID(nsISupports),
+                                PR_TRUE, &retval, nsnull);
+    if (NS_FAILED(rv)) {
+        XPCThrower::Throw(rv, cx);
+        return JS_FALSE;
+    }
+
+    JS_SET_RVAL(cx, vp, retval);
+    return JS_TRUE;
+}
+
 static JSFunctionSpec gGlobalFun[] = {
     {"dump",    Dump,   1,0},
     {"debug",   Debug,  1,0},
     {"atob",    Atob,   1,0},
     {"btoa",    Btoa,   1,0},
+    {"File",    File,   1,JSFUN_CONSTRUCTOR},
 #ifdef MOZ_CALLGRIND
     {"startCallgrind",  js_StartCallgrind, 0,0},
     {"stopCallgrind",   js_StopCallgrind,  0,0},
     {"dumpCallgrind",   js_DumpCallgrind,  1,0},
 #endif
 #ifdef MOZ_VTUNE
     {"startVtune",      js_StartVtune,     1,0},
     {"stopVtune",       js_StopVtune,      0,0},
new file mode 100644
--- /dev/null
+++ b/js/src/xpconnect/tests/unit/component-file.js
@@ -0,0 +1,152 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * 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.
+ *
+ * The Original Code is Component Scope File Constructor test code.
+ *
+ * The Initial Developer of the Original Code is the Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2011.
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * 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 ***** */
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+const Ci = Components.interfaces;
+
+function do_check_true(cond, text) {
+  // we don't have the test harness' utilities in this scope, so we need this
+  // little helper. In the failure case, the exception is propagated to the
+  // caller in the main run_test() function, and the test fails.
+  if (!cond)
+    throw "Failed check: " + text;
+}
+
+function FileComponent() {
+  this.wrappedJSObject = this;
+}
+FileComponent.prototype =
+{
+  doTest: function() {
+    // throw if anything goes wrong
+
+    // find the current directory path
+    var file = Components.classes["@mozilla.org/file/directory_service;1"]
+               .getService(Ci.nsIProperties)
+               .get("CurWorkD", Ci.nsIFile);
+    file.append("xpcshell.ini");
+
+    // should be able to construct a file
+    var f1 = File(file.path);
+    // with either constructor syntax
+    var f2 = new File(file.path);
+    // and with nsIFiles
+    var f3 = File(file);
+    var f4 = new File(file);
+    // and extra args are ignored
+    var f5 = File(file.path, "foopy");
+    var f6 = new File(file, Date(123123154));
+
+    // do some tests
+    do_check_true(f1 instanceof Ci.nsIDOMFile, "Should be a DOM File");
+    do_check_true(f2 instanceof Ci.nsIDOMFile, "Should be a DOM File");
+    do_check_true(f3 instanceof Ci.nsIDOMFile, "Should be a DOM File");
+    do_check_true(f4 instanceof Ci.nsIDOMFile, "Should be a DOM File");
+    do_check_true(f5 instanceof Ci.nsIDOMFile, "Should be a DOM File");
+    do_check_true(f6 instanceof Ci.nsIDOMFile, "Should be a DOM File");
+
+    do_check_true(f1.name == "xpcshell.ini", "Should be the right file");
+    do_check_true(f2.name == "xpcshell.ini", "Should be the right file");
+    do_check_true(f3.name == "xpcshell.ini", "Should be the right file");
+    do_check_true(f4.name == "xpcshell.ini", "Should be the right file");
+    do_check_true(f5.name == "xpcshell.ini", "Should be the right file");
+    do_check_true(f6.name == "xpcshell.ini", "Should be the right file");
+
+    do_check_true(f1.type = "text/plain", "Should be the right type");
+    do_check_true(f2.type = "text/plain", "Should be the right type");
+    do_check_true(f3.type = "text/plain", "Should be the right type");
+    do_check_true(f4.type = "text/plain", "Should be the right type");
+    do_check_true(f5.type = "text/plain", "Should be the right type");
+    do_check_true(f6.type = "text/plain", "Should be the right type");
+
+    var threw = false;
+    try {
+      // Needs a ctor argument
+      var f7 = File();
+    } catch (e) {
+      threw = true;
+    }
+    do_check_true(threw, "No ctor arguments should throw");
+
+    var threw = false;
+    try {
+      // Needs a valid ctor argument
+      var f7 = File(Date(132131532));
+    } catch (e) {
+      threw = true;
+    }
+    do_check_true(threw, "Passing a random object should fail");
+
+    var threw = false
+    try {
+      // Directories fail
+      var dir = Components.classes["@mozilla.org/file/directory_service;1"]
+                          .getService(Ci.nsIProperties)
+                          .get("CurWorkD", Ci.nsIFile);
+      var f7 = File(dir)
+    } catch (e) {
+      threw = true;
+    }
+    do_check_true(threw, "Can't create a File object for a directory");
+
+    return true;
+  },
+
+  // nsIClassInfo + information for XPCOM registration code in XPCOMUtils.jsm
+  classDescription: "File in components scope code",
+  classID: Components.ID("{da332370-91d4-464f-a730-018e14769cab}"),
+  contractID: "@mozilla.org/tests/component-file;1",
+
+  // nsIClassInfo
+  implementationLanguage: Components.interfaces.nsIProgrammingLanguage.JAVASCRIPT,
+  flags: 0,
+
+  getInterfaces: function getInterfaces(aCount) {
+    var interfaces = [Components.interfaces.nsIClassInfo];
+    aCount.value = interfaces.length;
+    return interfaces;
+  },
+
+  getHelperForLanguage: function getHelperForLanguage(aLanguage) {
+    return null;
+  },
+
+  // nsISupports
+  QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIClassInfo])
+};
+
+var gComponentsArray = [FileComponent];
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(gComponentsArray);
new file mode 100644
--- /dev/null
+++ b/js/src/xpconnect/tests/unit/component-file.manifest
@@ -0,0 +1,2 @@
+component {da332370-91d4-464f-a730-018e14769cab} component-file.js
+contract @mozilla.org/tests/component-file;1 {da332370-91d4-464f-a730-018e14769cab}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/js/src/xpconnect/tests/unit/test_file.js
@@ -0,0 +1,50 @@
+/*
+ * ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * 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.
+ *
+ * The Original Code is Mozilla code.
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2007
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *    Robert Sayre <sayrer@gmail.com> (original author)
+ *    Alexander J. Vincent <ajvincent@gmail.com>
+ *
+ * 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 ***** */
+ 
+function run_test() {   
+  do_load_manifest("component-file.manifest");
+  const contractID = "@mozilla.org/tests/component-file;1";
+  do_check_true(contractID in Components.classes);
+  var foo = Components.classes[contractID]
+                      .createInstance(Components.interfaces.nsIClassInfo);
+  do_check_true(Boolean(foo));
+  do_check_true(foo.contractID == contractID);
+  do_check_true(!!foo.wrappedJSObject);
+  do_check_true(foo.wrappedJSObject.doTest());
+}
--- a/js/src/xpconnect/tests/unit/xpcshell.ini
+++ b/js/src/xpconnect/tests/unit/xpcshell.ini
@@ -5,14 +5,15 @@ tail =
 [test_bogus_files.js]
 [test_bug408412.js]
 [test_bug451678.js]
 [test_bug596580.js]
 [test_bug604362.js]
 [test_bug608142.js]
 [test_bug641378.js]
 [test_bug_442086.js]
+[test_file.js]
 [test_import.js]
 [test_js_weak_references.js]
 [test_localeCompare.js]
 [test_recursive_import.js]
 [test_xpcomutils.js]
 [test_unload.js]
--- a/toolkit/components/url-classifier/nsUrlClassifierDBService.cpp
+++ b/toolkit/components/url-classifier/nsUrlClassifierDBService.cpp
@@ -72,17 +72,16 @@
 #include "nsNetCID.h"
 #include "nsThreadUtils.h"
 #include "nsXPCOMStrings.h"
 #include "mozilla/Mutex.h"
 #include "prlog.h"
 #include "prprf.h"
 #include "prnetdb.h"
 #include "zlib.h"
-#include "mozilla/Preferences.h"
 
 // Needed to interpert mozIStorageConnection::GetLastError
 #include <sqlite3.h>
 
 using namespace mozilla;
 
 /**
  * The DBServices stores a set of Fragments.  A fragment is one URL
@@ -1794,16 +1793,17 @@ nsUrlClassifierDBServiceWorker::Lookup(c
 NS_IMETHODIMP
 nsUrlClassifierDBServiceWorker::GetTables(nsIUrlClassifierCallback* c)
 {
   if (gShuttingDownThread)
     return NS_ERROR_NOT_INITIALIZED;
 
   nsresult rv = OpenDb();
   if (NS_FAILED(rv)) {
+    NS_ERROR("Unable to open database");
     return NS_ERROR_FAILURE;
   }
 
   mozStorageStatementScoper scoper(mGetTablesStatement);
 
   nsCAutoString response;
   PRBool hasMore;
   while (NS_SUCCEEDED(rv = mGetTablesStatement->ExecuteStep(&hasMore)) &&
@@ -2908,16 +2908,17 @@ nsUrlClassifierDBServiceWorker::BeginUpd
 {
   if (gShuttingDownThread)
     return NS_ERROR_NOT_INITIALIZED;
 
   NS_ENSURE_STATE(!mUpdateObserver);
 
   nsresult rv = OpenDb();
   if (NS_FAILED(rv)) {
+    NS_ERROR("Unable to open database");
     return NS_ERROR_FAILURE;
   }
 
   PRBool transaction;
   rv = mConnection->GetTransactionInProgress(&transaction);
   if (NS_FAILED(rv)) {
     mUpdateStatus = rv;
     return rv;
@@ -3055,16 +3056,17 @@ nsUrlClassifierDBServiceWorker::UpdateSt
 
   NS_ENSURE_STATE(mInStream);
 
   HandlePendingLookups();
 
   LOG(("Update from Stream."));
   nsresult rv = OpenDb();
   if (NS_FAILED(rv)) {
+    NS_ERROR("Unable to open database");
     return NS_ERROR_FAILURE;
   }
 
   // if something has gone wrong during this update, just throw it away
   if (NS_FAILED(mUpdateStatus)) {
     return mUpdateStatus;
   }
 
@@ -3360,25 +3362,16 @@ nsUrlClassifierDBServiceWorker::CacheCom
 
 nsresult
 nsUrlClassifierDBServiceWorker::OpenDb()
 {
   // Connection already open, don't do anything.
   if (mConnection)
     return NS_OK;
 
-  // If we're turned off, refuse to open the DB
-  PRBool openDB =
-    Preferences::GetBool(CHECK_MALWARE_PREF, CHECK_MALWARE_DEFAULT) ||
-    Preferences::GetBool(CHECK_PHISHING_PREF, CHECK_PHISHING_DEFAULT);
-  if (!openDB) {
-    NS_WARNING("Not opening url-classifier DB");
-    return NS_ERROR_NOT_AVAILABLE;
-  }
-
   LOG(("Opening db\n"));
 
   nsresult rv;
   // open the connection
   nsCOMPtr<mozIStorageService> storageService =
     do_GetService(MOZ_STORAGE_SERVICE_CONTRACTID, &rv);
   NS_ENSURE_SUCCESS(rv, rv);