root/chrome/browser/extensions/extension_creator_filter.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ShouldPackageFile

// Copyright (c) 2012 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.

#include "chrome/browser/extensions/extension_creator_filter.h"

#include <vector>
#include <set>

#include "base/files/file_path.h"

#if defined(OS_WIN)
#include <windows.h>
#endif

namespace extensions {

bool ExtensionCreatorFilter::ShouldPackageFile(
    const base::FilePath& file_path) {
  const base::FilePath& base_name = file_path.BaseName();
  if (base_name.empty()) {
    return false;
  }

  // The file path that contains one of following special components should be
  // excluded. See crbug.com/314360 and crbug.com/27840.
  const base::FilePath::StringType names_to_exclude[] = {
    FILE_PATH_LITERAL(".DS_Store"),
    FILE_PATH_LITERAL(".git"),
    FILE_PATH_LITERAL(".svn"),
    FILE_PATH_LITERAL("__MACOSX"),
    FILE_PATH_LITERAL("desktop.ini"),
    FILE_PATH_LITERAL("Thumbs.db")
  };
  std::set<base::FilePath::StringType> names_to_exclude_set(names_to_exclude,
      names_to_exclude + arraysize(names_to_exclude));
  std::vector<base::FilePath::StringType> components;
  file_path.GetComponents(&components);
  for (size_t i = 0; i < components.size(); i++) {
    if (names_to_exclude_set.count(components[i]))
      return false;
  }

  base::FilePath::CharType first_character = base_name.value()[0];
  base::FilePath::CharType last_character =
      base_name.value()[base_name.value().length() - 1];

  // dotfile
  if (first_character == '.') {
    return false;
  }
  // Emacs backup file
  if (last_character == '~') {
    return false;
  }
  // Emacs auto-save file
  if (first_character == '#' && last_character == '#') {
    return false;
  }

#if defined(OS_WIN)
  // It's correct that we use file_path, not base_name, here, because we
  // are working with the actual file.
  DWORD file_attributes = ::GetFileAttributes(file_path.value().c_str());
  if (file_attributes == INVALID_FILE_ATTRIBUTES) {
    return false;
  }
  if ((file_attributes & FILE_ATTRIBUTE_HIDDEN) != 0) {
    return false;
  }
#endif

  return true;
}

}  // namespace extensions

/* [<][>][^][v][top][bottom][index][help] */