13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file. 43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/url_util.h" 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/files/file_path.h" 83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/json/json_reader.h" 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/json/json_writer.h" 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/values.h" 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "net/base/escape.h" 143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace file_manager { 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace util { 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace { 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Pretty print the JSON escaped in the query string. 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)std::string PrettyPrintEscapedJson(const std::string& query) { 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string json = net::UnescapeURLComponent( 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) query, net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS); 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<base::Value> value(base::JSONReader::Read(json)); 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string pretty_json; 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::JSONWriter::WriteWithOptions(value.get(), 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::JSONWriter::OPTIONS_PRETTY_PRINT, 283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &pretty_json); 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return pretty_json; 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(FileManagerUrlUtilTest, GetFileManagerMainPageUrl) { 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ("chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/main.html", 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetFileManagerMainPageUrl().spec()); 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(FileManagerUrlUtilTest, GetFileManagerMainPageUrlWithParams_NoFileTypes) { 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const GURL url = GetFileManagerMainPageUrlWithParams( 393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ui::SelectFileDialog::SELECT_OPEN_FILE, 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::UTF8ToUTF16("some title"), 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL("filesystem:chrome-extension://abc/Downloads/"), 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL("filesystem:chrome-extension://abc/Downloads/foo.txt"), 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "foo.txt", 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) NULL, // No file types 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 0, // Hence no file type index. 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FILE_PATH_LITERAL("txt")); 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ("chrome-extension", url.scheme()); 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ("hhaomjibdihmijegdhdafkllkbggdgoj", url.host()); 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ("/main.html", url.path()); 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Confirm that "%20" is used instead of "+" in the query. 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(url.query().find("+") == std::string::npos); 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(url.query().find("%20") != std::string::npos); 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The escaped query is hard to read. Pretty print the escaped JSON. 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ("{\n" 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) " \"currentDirectoryURL\": " 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "\"filesystem:chrome-extension://abc/Downloads/\",\n" 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " \"defaultExtension\": \"txt\",\n" 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) " \"selectionURL\": " 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "\"filesystem:chrome-extension://abc/Downloads/foo.txt\",\n" 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " \"shouldReturnLocalPath\": true,\n" 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) " \"targetName\": \"foo.txt\",\n" 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " \"title\": \"some title\",\n" 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " \"type\": \"open-file\"\n" 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "}\n", 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PrettyPrintEscapedJson(url.query())); 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(FileManagerUrlUtilTest, 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetFileManagerMainPageUrlWithParams_WithFileTypes) { 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Create a FileTypeInfo which looks like: 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // extensions: [["htm", "html"], ["txt"]] 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // descriptions: ["HTML", "TEXT"] 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ui::SelectFileDialog::FileTypeInfo file_types; 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) file_types.extensions.push_back(std::vector<base::FilePath::StringType>()); 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) file_types.extensions[0].push_back(FILE_PATH_LITERAL("htm")); 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) file_types.extensions[0].push_back(FILE_PATH_LITERAL("html")); 773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) file_types.extensions.push_back(std::vector<base::FilePath::StringType>()); 783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) file_types.extensions[1].push_back(FILE_PATH_LITERAL("txt")); 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) file_types.extension_description_overrides.push_back( 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::UTF8ToUTF16("HTML")); 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) file_types.extension_description_overrides.push_back( 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::UTF8ToUTF16("TEXT")); 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // "shouldReturnLocalPath" will be false if drive is supported. 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) file_types.support_drive = true; 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const GURL url = GetFileManagerMainPageUrlWithParams( 873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ui::SelectFileDialog::SELECT_OPEN_FILE, 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::UTF8ToUTF16("some title"), 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL("filesystem:chrome-extension://abc/Downloads/"), 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL("filesystem:chrome-extension://abc/Downloads/foo.txt"), 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "foo.txt", 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &file_types, 933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1, // The file type index is 1-based. 943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FILE_PATH_LITERAL("txt")); 953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ("chrome-extension", url.scheme()); 963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ("hhaomjibdihmijegdhdafkllkbggdgoj", url.host()); 973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ("/main.html", url.path()); 983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Confirm that "%20" is used instead of "+" in the query. 993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(url.query().find("+") == std::string::npos); 1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(url.query().find("%20") != std::string::npos); 1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The escaped query is hard to read. Pretty print the escaped JSON. 1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ("{\n" 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) " \"currentDirectoryURL\": " 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "\"filesystem:chrome-extension://abc/Downloads/\",\n" 1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " \"defaultExtension\": \"txt\",\n" 1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " \"includeAllFiles\": false,\n" 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) " \"selectionURL\": " 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "\"filesystem:chrome-extension://abc/Downloads/foo.txt\",\n" 1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " \"shouldReturnLocalPath\": false,\n" 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) " \"targetName\": \"foo.txt\",\n" 1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " \"title\": \"some title\",\n" 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " \"type\": \"open-file\",\n" 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " \"typeList\": [ {\n" 1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " \"description\": \"HTML\",\n" 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " \"extensions\": [ \"htm\", \"html\" ],\n" 1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " \"selected\": true\n" 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " }, {\n" 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " \"description\": \"TEXT\",\n" 1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " \"extensions\": [ \"txt\" ],\n" 1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " \"selected\": false\n" 1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) " } ]\n" 1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "}\n", 1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PrettyPrintEscapedJson(url.query())); 1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace 1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace util 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace file_manager 129