| Index: base/android/java/src/org/chromium/base/PathUtils.java
 | 
| diff --git a/base/android/java/src/org/chromium/base/PathUtils.java b/base/android/java/src/org/chromium/base/PathUtils.java
 | 
| index d70c0cc95ead4185f7a68fa1da2310db2b09a43d..5da080e834d6e684b53e272c7b4cc38eaf2cfbe3 100644
 | 
| --- a/base/android/java/src/org/chromium/base/PathUtils.java
 | 
| +++ b/base/android/java/src/org/chromium/base/PathUtils.java
 | 
| @@ -6,26 +6,58 @@ package org.chromium.base;
 | 
|  
 | 
|  import android.content.Context;
 | 
|  import android.content.pm.ApplicationInfo;
 | 
| +import android.os.AsyncTask;
 | 
|  import android.os.Environment;
 | 
|  
 | 
| +import java.util.concurrent.ExecutionException;
 | 
| +
 | 
|  /**
 | 
|   * This class provides the path related methods for the native library.
 | 
|   */
 | 
|  public abstract class PathUtils {
 | 
|  
 | 
| -    private static String sDataDirectorySuffix;
 | 
| +    private static final int DATA_DIRECTORY = 0;
 | 
| +    private static final int DATABASE_DIRECTORY = 1;
 | 
| +    private static final int CACHE_DIRECTORY = 2;
 | 
| +    private static final int NUM_DIRECTORIES = 3;
 | 
| +    private static AsyncTask<String, Void, String[]> sDirPathFetchTask;
 | 
|  
 | 
|      // Prevent instantiation.
 | 
|      private PathUtils() {}
 | 
|  
 | 
|      /**
 | 
| -     * Sets the suffix that should be used for the directory where private data is to be stored
 | 
| -     * by the application.
 | 
| +     * Starts an asynchronous task to fetch the path of the directory where private data is to be
 | 
| +     * stored by the application.
 | 
| +     *
 | 
|       * @param suffix The private data directory suffix.
 | 
|       * @see Context#getDir(String, int)
 | 
|       */
 | 
| -    public static void setPrivateDataDirectorySuffix(String suffix) {
 | 
| -        sDataDirectorySuffix = suffix;
 | 
| +    public static void setPrivateDataDirectorySuffix(String suffix, Context context) {
 | 
| +        final Context appContext = context.getApplicationContext();
 | 
| +        sDirPathFetchTask = new AsyncTask<String, Void, String[]>() {
 | 
| +            @Override
 | 
| +            protected String[] doInBackground(String... dataDirectorySuffix) {
 | 
| +                String[] paths = new String[NUM_DIRECTORIES];
 | 
| +                paths[DATA_DIRECTORY] =
 | 
| +                        appContext.getDir(dataDirectorySuffix[0], Context.MODE_PRIVATE).getPath();
 | 
| +                paths[DATABASE_DIRECTORY] = appContext.getDatabasePath("foo").getParent();
 | 
| +                paths[CACHE_DIRECTORY] = appContext.getCacheDir().getPath();
 | 
| +                return paths;
 | 
| +            }
 | 
| +        }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, suffix);
 | 
| +    }
 | 
| +
 | 
| +    /**
 | 
| +     * @param index The index of the cached directory path.
 | 
| +     * @return The directory path requested, or null if not available.
 | 
| +     */
 | 
| +    private static String getDirectoryPath(int index) {
 | 
| +        try {
 | 
| +            return sDirPathFetchTask.get()[index];
 | 
| +        } catch (InterruptedException e) {
 | 
| +        } catch (ExecutionException e) {
 | 
| +        }
 | 
| +        return null;
 | 
|      }
 | 
|  
 | 
|      /**
 | 
| @@ -33,11 +65,8 @@ public abstract class PathUtils {
 | 
|       */
 | 
|      @CalledByNative
 | 
|      public static String getDataDirectory(Context appContext) {
 | 
| -        if (sDataDirectorySuffix == null) {
 | 
| -            throw new IllegalStateException(
 | 
| -                    "setDataDirectorySuffix must be called before getDataDirectory");
 | 
| -        }
 | 
| -        return appContext.getDir(sDataDirectorySuffix, Context.MODE_PRIVATE).getPath();
 | 
| +        assert sDirPathFetchTask != null : "setDataDirectorySuffix must be called first.";
 | 
| +        return getDirectoryPath(DATA_DIRECTORY);
 | 
|      }
 | 
|  
 | 
|      /**
 | 
| @@ -45,8 +74,8 @@ public abstract class PathUtils {
 | 
|       */
 | 
|      @CalledByNative
 | 
|      public static String getDatabaseDirectory(Context appContext) {
 | 
| -        // Context.getDatabasePath() returns path for the provided filename.
 | 
| -        return appContext.getDatabasePath("foo").getParent();
 | 
| +        assert sDirPathFetchTask != null : "setDataDirectorySuffix must be called first.";
 | 
| +        return getDirectoryPath(DATABASE_DIRECTORY);
 | 
|      }
 | 
|  
 | 
|      /**
 | 
| @@ -55,7 +84,8 @@ public abstract class PathUtils {
 | 
|      @SuppressWarnings("unused")
 | 
|      @CalledByNative
 | 
|      public static String getCacheDirectory(Context appContext) {
 | 
| -        return appContext.getCacheDir().getPath();
 | 
| +        assert sDirPathFetchTask != null : "setDataDirectorySuffix must be called first.";
 | 
| +        return getDirectoryPath(CACHE_DIRECTORY);
 | 
|      }
 | 
|  
 | 
|      /**
 | 
| 
 |