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