| Index: chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/ContextMenuLoadUrlParamsTest.java | 
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/ContextMenuLoadUrlParamsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/ContextMenuLoadUrlParamsTest.java | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..a40c90ba8bfc7b70955daf5af86e4e9b2b41deb7 | 
| --- /dev/null | 
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/ContextMenuLoadUrlParamsTest.java | 
| @@ -0,0 +1,138 @@ | 
| +// Copyright 2015 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +package org.chromium.chrome.browser.tabmodel; | 
| + | 
| +import android.test.FlakyTest; | 
| + | 
| +import com.google.android.apps.chrome.R; | 
| + | 
| +import org.chromium.base.ThreadUtils; | 
| +import org.chromium.chrome.browser.ChromeActivity; | 
| +import org.chromium.chrome.browser.Tab; | 
| +import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; | 
| +import org.chromium.chrome.browser.tabmodel.TabWindowManager.TabModelSelectorFactory; | 
| +import org.chromium.chrome.test.ChromeTabbedActivityTestBase; | 
| +import org.chromium.chrome.test.util.TestHttpServerClient; | 
| +import org.chromium.chrome.test.util.browser.contextmenu.ContextMenuUtils; | 
| +import org.chromium.content_public.browser.LoadUrlParams; | 
| +import org.chromium.ui.base.WindowAndroid; | 
| + | 
| +import java.util.concurrent.TimeoutException; | 
| + | 
| +/** | 
| + * Verifies URL load parameters set when triggering navigations from the context menu. | 
| + */ | 
| +public class ContextMenuLoadUrlParamsTest extends ChromeTabbedActivityTestBase { | 
| +    // Load parameters of the last call to openNewTab(). | 
| +    LoadUrlParams mOpenNewTabLoadUrlParams; | 
| + | 
| +    // Records parameters of calls to TabModelSelector methods and otherwise behaves like | 
| +    // TabModelSelectorImpl. | 
| +    class RecordingTabModelSelector extends TabModelSelectorImpl { | 
| +        @Override | 
| +        public Tab openNewTab(LoadUrlParams loadUrlParams, TabLaunchType type, Tab parent, | 
| +                boolean incognito) { | 
| +            mOpenNewTabLoadUrlParams = loadUrlParams; | 
| +            return super.openNewTab(loadUrlParams, type, parent, incognito); | 
| +        } | 
| + | 
| +        public RecordingTabModelSelector(ChromeActivity activity, int selectorIndex, | 
| +                WindowAndroid windowAndroid) { | 
| +            super(activity, selectorIndex, windowAndroid); | 
| +        } | 
| +    } | 
| + | 
| +    @Override | 
| +    public void setUp() throws Exception { | 
| +        // Plant RecordingTabModelSelector as the TabModelSelector used in Main. The factory has to | 
| +        // be set before super.setUp(), as super.setUp() creates Main and consequently the | 
| +        // TabModelSelector. | 
| +        ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 
| +            @Override | 
| +            public void run() { | 
| +                TabWindowManager.getInstance().setTabModelSelectorFactory( | 
| +                        new TabModelSelectorFactory() { | 
| +                            @Override | 
| +                            public TabModelSelector buildSelector(ChromeActivity activity, | 
| +                                    WindowAndroid windowAndroid, int selectorIndex) { | 
| +                                return new RecordingTabModelSelector(activity, selectorIndex, | 
| +                                        windowAndroid); | 
| +                            } | 
| +                        }); | 
| +            } | 
| +        }); | 
| +        super.setUp(); | 
| +    } | 
| + | 
| +    /** | 
| +     * Verifies that the referrer is correctly set for "Open in new tab". | 
| +     * Bug: crbug.com/413216 | 
| +     * @MediumTest | 
| +     * @Feature({"Browser"}) | 
| +     */ | 
| +    @FlakyTest | 
| +    public void testOpenInNewTabReferrer() | 
| +            throws InterruptedException, TimeoutException { | 
| +        String url = | 
| +                TestHttpServerClient.getUrl("chrome/test/data/android/context_menu_test.html"); | 
| +        String expectedReferrer = url; | 
| +        triggerContextMenuLoad(url, "testLink", R.id.contextmenu_open_in_new_tab); | 
| + | 
| +        assertNotNull(mOpenNewTabLoadUrlParams); | 
| +        assertEquals(expectedReferrer, mOpenNewTabLoadUrlParams.getReferrer().getUrl()); | 
| +    } | 
| + | 
| +    /** | 
| +     * Verifies that the referrer is not set for "Open in new incognito tab". | 
| +     * Bug: crbug.com/413216 | 
| +     * @MediumTest | 
| +     * @Feature({"Browser"}) | 
| +     */ | 
| +    @FlakyTest | 
| +    public void testOpenInIncognitoTabNoReferrer() | 
| +            throws InterruptedException, TimeoutException { | 
| +        String url = | 
| +                TestHttpServerClient.getUrl("chrome/test/data/android/context_menu_test.html"); | 
| +        triggerContextMenuLoad(url, "testLink", R.id.contextmenu_open_in_incognito_tab); | 
| + | 
| +        assertNotNull(mOpenNewTabLoadUrlParams); | 
| +        assertNull(mOpenNewTabLoadUrlParams.getReferrer()); | 
| +    } | 
| + | 
| +    /** | 
| +     * Verifies that the referrer is stripped from username and password fields. | 
| +     * Bug: crbug.com/413216 | 
| +     * @MediumTest | 
| +     * @Feature({"Browser"}) | 
| +     */ | 
| +    @FlakyTest | 
| +    public void testOpenInNewTabSanitizeReferrer() | 
| +            throws InterruptedException, TimeoutException { | 
| +        String url = TestHttpServerClient.getUrl("chrome/test/data/android/context_menu_test.html", | 
| +                "user", "pass"); | 
| +        String expectedReferrer = | 
| +                TestHttpServerClient.getUrl("chrome/test/data/android/context_menu_test.html"); | 
| +        assertTrue(url.contains("pass"));  // Sanity check. | 
| +        triggerContextMenuLoad(url, "testLink", R.id.contextmenu_open_in_new_tab); | 
| + | 
| +        assertNotNull(mOpenNewTabLoadUrlParams); | 
| +        assertEquals(expectedReferrer, mOpenNewTabLoadUrlParams.getReferrer().getUrl()); | 
| +    } | 
| + | 
| +    private void triggerContextMenuLoad(String url, String openerDomId, int menuItemId) | 
| +            throws InterruptedException, TimeoutException { | 
| +        loadUrl(url); | 
| +        assertWaitForPageScaleFactorMatch(0.5f); | 
| +        Tab tab = getActivity().getActivityTab(); | 
| +        ContextMenuUtils.selectContextMenuItem(this, tab, openerDomId, menuItemId); | 
| +        getInstrumentation().waitForIdleSync(); | 
| +    } | 
| + | 
| +    @Override | 
| +    public void startMainActivity() throws InterruptedException { | 
| +        startMainActivityOnBlankPage(); | 
| +    } | 
| +} | 
| + | 
|  |