Re-instate the link coloring on startup, but going via the browser
to read the bookmark history, and restricting it to 100 results.

Link coloring - doing db lookup in new thread

Whitespace, following review
diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java
index 37efdb0..8d55247 100644
--- a/core/java/android/webkit/CallbackProxy.java
+++ b/core/java/android/webkit/CallbackProxy.java
@@ -106,6 +106,7 @@
     private static final int GEOLOCATION_PERMISSIONS_SHOW_PROMPT = 130;
     private static final int GEOLOCATION_PERMISSIONS_HIDE_PROMPT = 131;
     private static final int RECEIVED_TOUCH_ICON_URL             = 132;
+    private static final int GET_VISITED_HISTORY                 = 133;
 
     // Message triggered by the client to resume execution
     private static final int NOTIFY                              = 200;
@@ -655,6 +656,12 @@
                 int lineNumber = msg.getData().getInt("lineNumber");
                 mWebChromeClient.addMessageToConsole(message, lineNumber, sourceID);
                 break;
+
+            case GET_VISITED_HISTORY:
+                if (mWebChromeClient != null) {
+                    mWebChromeClient.getVisitedHistory((ValueCallback<String[]>)msg.obj);
+                }
+                break;
         }
     }
 
@@ -1329,4 +1336,16 @@
         }
         return result.getResult();
     }
+
+    /**
+     * @hide pending API council approval
+     */
+    public void getVisitedHistory(ValueCallback<String[]> callback) {
+        if (mWebChromeClient == null) {
+            return;
+        }
+        Message msg = obtainMessage(GET_VISITED_HISTORY);
+        msg.obj = callback;
+        sendMessage(msg);
+    }
 }
diff --git a/core/java/android/webkit/WebChromeClient.java b/core/java/android/webkit/WebChromeClient.java
index bbc567d..7f5b862 100644
--- a/core/java/android/webkit/WebChromeClient.java
+++ b/core/java/android/webkit/WebChromeClient.java
@@ -295,4 +295,11 @@
     public View getVideoLoadingProgressView() {
         return null;
     }
+
+    /** Obtains a list of all visited history items, used for link coloring
+     * @hide pending API Council approval
+     */
+    public void getVisitedHistory(ValueCallback<String[]> callback) {
+    }
+
 }
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index e2aa1d0..86685fb 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -311,10 +311,13 @@
                 });
     }
 
-    protected String[] populateVisitedLinks() {
-        // FIXME: getVisitedHistory needs permission and host may not have.
-//        return Browser.getVisitedHistory(mContext.getContentResolver());
-        return new String[0];
+    protected void populateVisitedLinks() {
+        ValueCallback callback = new ValueCallback<String[]>() {
+            public void onReceiveValue(String[] value) {
+                sendMessage(EventHub.POPULATE_VISITED_LINKS, (Object)value);
+            }
+        };
+        mCallbackProxy.getVisitedHistory(callback);
     }
 
     /**
@@ -531,6 +534,11 @@
      */
     private native void nativeGeolocationPermissionsProvide(String origin, boolean allow, boolean remember);
 
+    /**
+     * Provide WebCore with the previously visted links from the history database
+     */
+    private native void  nativeProvideVisitedHistory(String[] history);
+
     // EventHub for processing messages
     private final EventHub mEventHub;
     // WebCore thread handler
@@ -811,6 +819,8 @@
         // Geolocation
         static final int GEOLOCATION_PERMISSIONS_PROVIDE = 180;
 
+        static final int POPULATE_VISITED_LINKS = 181;
+
         // private message ids
         private static final int DESTROY =     200;
 
@@ -1234,6 +1244,10 @@
                                 ((Message) msg.obj).sendToTarget();
                             }
                             break;
+
+                        case POPULATE_VISITED_LINKS:
+                            nativeProvideVisitedHistory((String[])msg.obj);
+                            break;
                     }
                 }
             };