diff --git a/chrome/browser/ash/file_manager/file_manager_jstest.cc b/chrome/browser/ash/file_manager/file_manager_jstest.cc index f73153514c015..b61b04c3566af 100644 --- a/chrome/browser/ash/file_manager/file_manager_jstest.cc +++ b/chrome/browser/ash/file_manager/file_manager_jstest.cc @@ -365,3 +365,7 @@ IN_PROC_BROWSER_TEST_F(FileManagerJsTest, XfIcon) { IN_PROC_BROWSER_TEST_F(FileManagerJsTest, XfPathDisplay) { RunTestURL("widgets/xf_path_display_unittest.js"); } + +IN_PROC_BROWSER_TEST_F(FileManagerJsTest, BreadcrumbContainer) { + RunTestURL("containers/breadcrumb_container_unittest.js"); +} diff --git a/ui/file_manager/file_manager/containers/breadcrumb_container.ts b/ui/file_manager/file_manager/containers/breadcrumb_container.ts index 22183f3af45bc..4e6765b4c4e9b 100644 --- a/ui/file_manager/file_manager/containers/breadcrumb_container.ts +++ b/ui/file_manager/file_manager/containers/breadcrumb_container.ts @@ -81,7 +81,8 @@ export class BreadcrumbContainer { this.container_.appendChild(breadcrumb); } - const path = pathComponents.map(p => p.label).join('/'); + const path = + pathComponents.map(p => p.label.replace(/\//g, '%2F')).join('/'); breadcrumb!.path = path; this.currentFileKey_ = key; this.pathKeys_ = pathComponents.map(p => p.key); diff --git a/ui/file_manager/file_manager/containers/breadcrumb_container_unittest.ts b/ui/file_manager/file_manager/containers/breadcrumb_container_unittest.ts new file mode 100644 index 0000000000000..de0dd23804bca --- /dev/null +++ b/ui/file_manager/file_manager/containers/breadcrumb_container_unittest.ts @@ -0,0 +1,68 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {assertEquals, assertNotEquals} from 'chrome://webui-test/chai_assert.js'; + +import {CurrentDirectory, PropStatus} from '../externs/ts/state.js'; +import {getEmptyState, getStore} from '../state/store.js'; + +import {BreadcrumbContainer} from './breadcrumb_container.js'; + + +/** An instance of BreadcrumbContainer. */ +let breadcrumbContainer: BreadcrumbContainer|null = null; + +export function setUp() { + document.body.innerHTML = ''; + breadcrumbContainer = + new BreadcrumbContainer(document.querySelector('#breadcrumb-container')!); +} + +/** + * Tests that when current directory has "/" in the path, it will be escaped + * before passing to the underlying breadcrumb. + */ +export function testPathWithSlash(done: () => void) { + const store = getStore(); + store.init(getEmptyState()); + const currentDirectory: CurrentDirectory = { + key: 'filesystem:chrome://file-manager/external/aaa/bbb', + status: PropStatus.SUCCESS, + rootType: undefined, + pathComponents: [ + {name: 'Nexus/Pixel(MTP)', label: 'Nexus/Pixel(MTP)', key: ''}, + {name: 'DCIM', label: 'DCIM', key: ''}, + ], + content: { + keys: [], + }, + selection: { + keys: [], + dirCount: 0, + fileCount: 0, + hostedCount: undefined, + offlineCachedCount: undefined, + fileTasks: { + policyDefaultHandlerStatus: undefined, + defaultTask: undefined, + tasks: [], + status: PropStatus.SUCCESS, + }, + }, + hasDlpDisabledFiles: false, + }; + + // Simulate a state change from the store. + breadcrumbContainer!.onStateChanged({...store.getState(), currentDirectory}); + + // Check that breadcrumb's path has been escaped. + const breadcrumb = document.querySelector('xf-breadcrumb'); + assertNotEquals(null, breadcrumb); + assertEquals( + breadcrumb!.path, + 'Nexus%2FPixel(MTP)/DCIM', + ); + + done(); +} diff --git a/ui/file_manager/file_names.gni b/ui/file_manager/file_names.gni index e92de78d1225a..70ccae61ae294 100644 --- a/ui/file_manager/file_names.gni +++ b/ui/file_manager/file_names.gni @@ -310,6 +310,7 @@ ts_templates = [ ts_test_files = [ # Containers + "file_manager/containers/breadcrumb_container_unittest.ts", "file_manager/containers/nudge_container_unittest.ts", # Lib: