| Index: chrome/common/pepper_flash.cc | 
| diff --git a/chrome/common/pepper_flash.cc b/chrome/common/pepper_flash.cc | 
| index 2e2140f6115c6f69161b85bdc96892e6ffe7eaa6..da1c00de65519dee1f77c0f9d5d7011c836b91ac 100644 | 
| --- a/chrome/common/pepper_flash.cc | 
| +++ b/chrome/common/pepper_flash.cc | 
| @@ -2,12 +2,128 @@ | 
| // Use of this source code is governed by a BSD-style license that can be | 
| // found in the LICENSE file. | 
|  | 
| +#include "base/strings/string_split.h" | 
| +#include "base/values.h" | 
| +#include "base/version.h" | 
| #include "chrome/common/pepper_flash.h" | 
| - | 
| +#include "chrome/common/ppapi_utils.h" | 
| +#include "ppapi/c/private/ppb_pdf.h" | 
| #include "ppapi/shared_impl/ppapi_permissions.h" | 
|  | 
| +namespace chrome { | 
| + | 
| const int32 kPepperFlashPermissions = ppapi::PERMISSION_DEV | | 
| ppapi::PERMISSION_PRIVATE | | 
| ppapi::PERMISSION_BYPASS_USER_GESTURE | | 
| ppapi::PERMISSION_FLASH; | 
| +namespace { | 
| + | 
| +// File name of the Pepper Flash component manifest on different platforms. | 
| +const char kPepperFlashManifestName[] = "Flapper"; | 
| + | 
| +// Name of the Pepper Flash OS in the component manifest. | 
| +const char kPepperFlashOperatingSystem[] = | 
| +#if defined(OS_MACOSX) | 
| +    "mac"; | 
| +#elif defined(OS_WIN) | 
| +    "win"; | 
| +#else  // OS_LINUX, etc. TODO(viettrungluu): Separate out Chrome OS and Android? | 
| +    "linux"; | 
| +#endif | 
| + | 
| +// Name of the Pepper Flash architecture in the component manifest. | 
| +const char kPepperFlashArch[] = | 
| +#if defined(ARCH_CPU_X86) | 
| +    "ia32"; | 
| +#elif defined(ARCH_CPU_X86_64) | 
| +    "x64"; | 
| +#else  // TODO(viettrungluu): Support an ARM check? | 
| +    "???"; | 
| +#endif | 
| + | 
| +// Returns true if the Pepper |interface_name| is implemented  by this browser. | 
| +// It does not check if the interface is proxied. | 
| +bool SupportsPepperInterface(const char* interface_name) { | 
| +  if (IsSupportedPepperInterface(interface_name)) | 
| +    return true; | 
| +  // The PDF interface is invisible to SupportsInterface() on the browser | 
| +  // process because it is provided using PpapiInterfaceFactoryManager. We need | 
| +  // to check for that as well. | 
| +  // TODO(cpu): make this more sane. | 
| +  return (strcmp(interface_name, PPB_PDF_INTERFACE) == 0); | 
| +} | 
| + | 
| +// Returns true if this browser implements one of the interfaces given in | 
| +// |interface_string|, which is a '|'-separated string of interface names. | 
| +bool CheckPepperFlashInterfaceString(const std::string& interface_string) { | 
| +  std::vector<std::string> interface_names; | 
| +  base::SplitString(interface_string, '|', &interface_names); | 
| +  for (size_t i = 0; i < interface_names.size(); i++) { | 
| +    if (SupportsPepperInterface(interface_names[i].c_str())) | 
| +      return true; | 
| +  } | 
| +  return false; | 
| +} | 
| + | 
| +// Returns true if this browser implements all the interfaces that Flash | 
| +// specifies in its component installer manifest. | 
| +bool CheckPepperFlashInterfaces(const base::DictionaryValue& manifest) { | 
| +  const base::ListValue* interface_list = NULL; | 
| + | 
| +  // We don't *require* an interface list, apparently. | 
| +  if (!manifest.GetList("x-ppapi-required-interfaces", &interface_list)) | 
| +    return true; | 
| + | 
| +  for (size_t i = 0; i < interface_list->GetSize(); i++) { | 
| +    std::string interface_string; | 
| +    if (!interface_list->GetString(i, &interface_string)) | 
| +      return false; | 
| +    if (!CheckPepperFlashInterfaceString(interface_string)) | 
| +      return false; | 
| +  } | 
| + | 
| +  return true; | 
| +} | 
| + | 
| +}  // namespace | 
| + | 
| +bool CheckPepperFlashManifest(const base::DictionaryValue& manifest, | 
| +                              Version* version_out) { | 
| +  std::string name; | 
| +  manifest.GetStringASCII("name", &name); | 
| +  // TODO(viettrungluu): Support WinFlapper for now, while we change the format | 
| +  // of the manifest. (Should be safe to remove checks for "WinFlapper" in, say, | 
| +  // Nov. 2011.)  crbug.com/98458 | 
| +  if (name != kPepperFlashManifestName && name != "WinFlapper") | 
| +    return false; | 
| + | 
| +  std::string proposed_version; | 
| +  manifest.GetStringASCII("version", &proposed_version); | 
| +  Version version(proposed_version.c_str()); | 
| +  if (!version.IsValid()) | 
| +    return false; | 
| + | 
| +  if (!CheckPepperFlashInterfaces(manifest)) | 
| +    return false; | 
| + | 
| +  // TODO(viettrungluu): See above TODO. | 
| +  if (name == "WinFlapper") { | 
| +    *version_out = version; | 
| +    return true; | 
| +  } | 
| + | 
| +  std::string os; | 
| +  manifest.GetStringASCII("x-ppapi-os", &os); | 
| +  if (os != kPepperFlashOperatingSystem) | 
| +    return false; | 
| + | 
| +  std::string arch; | 
| +  manifest.GetStringASCII("x-ppapi-arch", &arch); | 
| +  if (arch != kPepperFlashArch) | 
| +    return false; | 
| + | 
| +  *version_out = version; | 
| +  return true; | 
| +} | 
|  | 
| +}  // namespace chrome | 
|  |