summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build/README.chromium15
-rw-r--r--build/all.gyp562
-rwxr-xr-xbuild/apply_locales.py45
-rwxr-xr-xbuild/branding_value.sh51
-rw-r--r--build/build_config.h11
-rw-r--r--build/common.croc127
-rw-r--r--build/common.gypi1691
-rwxr-xr-xbuild/compiler_version.py50
-rw-r--r--build/dir_exists.py10
-rw-r--r--build/extract_from_cab.py27
-rw-r--r--build/features_override.gypi119
-rw-r--r--build/grit_action.gypi39
-rw-r--r--build/grit_target.gypi39
-rwxr-xr-xbuild/gyp_chromium167
-rwxr-xr-xbuild/install-build-deps.sh515
-rwxr-xr-xbuild/install-chroot.sh325
-rw-r--r--build/internal/README.chromium24
-rw-r--r--build/internal/release_defaults.gypi15
-rw-r--r--build/internal/release_impl.gypi3
-rw-r--r--build/internal/release_impl_official.gypi21
-rw-r--r--build/linux/chrome_linux.croc29
-rwxr-xr-xbuild/linux/dump_app_syms36
-rwxr-xr-xbuild/linux/pkg-config-wrapper37
-rwxr-xr-xbuild/linux/python_arch.sh42
-rwxr-xr-xbuild/linux/rewrite_dirs.py68
-rw-r--r--build/linux/system.gyp380
-rw-r--r--build/mac/chrome_mac.croc36
-rwxr-xr-xbuild/mac/strip_from_xcode62
-rwxr-xr-xbuild/mac/strip_save_dsym343
-rw-r--r--build/output_dll_copy.rules17
-rw-r--r--build/release.gypi19
-rw-r--r--build/sanitize-mac-build-log.sed32
-rwxr-xr-xbuild/sanitize-mac-build-log.sh6
-rw-r--r--build/sanitize-win-build-log.sed14
-rwxr-xr-xbuild/sanitize-win-build-log.sh6
-rw-r--r--build/temp_gyp/README.chromium3
-rw-r--r--build/temp_gyp/googleurl.gyp116
-rw-r--r--build/temp_gyp/pdfsqueeze.gyp46
-rw-r--r--build/util/build_util.gyp43
-rwxr-xr-xbuild/util/lastchange.py286
-rw-r--r--build/util/support/support.gyp21
-rw-r--r--build/whitespace_file.txt11
-rw-r--r--build/win/chrome_win.croc26
-rw-r--r--build/win/system.gyp33
-rw-r--r--chrome/browser/chrome_browser_application_mac.mm13
-rw-r--r--chrome/browser/chromeos/cros/network_library.cc7
-rw-r--r--chrome/browser/chromeos/cros/network_library.h4
-rw-r--r--chrome/browser/chromeos/login/existing_user_controller.cc11
-rw-r--r--chrome/browser/chromeos/login/wizard_controller.cc5
-rw-r--r--chrome/browser/download/download_extensions.cc1
-rw-r--r--chrome/browser/download/download_manager.cc7
-rw-r--r--chrome/browser/importer/firefox2_importer.cc8
-rw-r--r--chrome/browser/password_manager/password_manager_unittest.cc7
-rw-r--r--chrome/browser/password_manager/password_store.cc4
-rw-r--r--chrome/browser/password_manager/password_store.h3
-rw-r--r--chrome/browser/password_manager/password_store_default.cc123
-rw-r--r--chrome/browser/password_manager/password_store_default.h15
-rw-r--r--chrome/browser/password_manager/password_store_default_unittest.cc12
-rw-r--r--chrome/browser/password_manager/password_store_mac_unittest.cc1
-rw-r--r--chrome/browser/password_manager/password_store_win.cc199
-rw-r--r--chrome/browser/password_manager/password_store_win.h30
-rw-r--r--chrome/browser/password_manager/password_store_win_unittest.cc26
-rw-r--r--chrome/browser/password_manager/password_store_x_unittest.cc8
-rw-r--r--chrome/browser/profiles/profile_impl.cc4
-rw-r--r--chrome/browser/resources/options/chromeos/internet_options.js15
-rw-r--r--chrome/browser/sync/profile_sync_service_password_unittest.cc1
-rw-r--r--chrome/browser/tab_contents/web_contents_unittest.cc48
-rw-r--r--chrome/browser/ui/browser_init.cc2
-rw-r--r--chrome/browser/ui/cocoa/browser_window_controller.mm29
-rw-r--r--chrome/browser/ui/cocoa/browser_window_controller_private.h8
-rw-r--r--chrome/browser/ui/cocoa/browser_window_controller_private.mm51
-rw-r--r--chrome/browser/ui/webui/chromeos/mobile_setup_ui.cc2
-rw-r--r--chrome/common/extensions/docs/css/ApiRefStyles.css4
-rw-r--r--chrome/common/extensions/docs/overview.html147
-rw-r--r--chrome/common/extensions/docs/static/overview.html138
-rw-r--r--chrome/common/extensions/docs/static/whats_new.html58
-rw-r--r--chrome/common/extensions/docs/whats_new.html58
-rw-r--r--webkit/glue/resources/webkit_strings_ca.xtb2
-rw-r--r--webkit/glue/resources/webkit_strings_de.xtb2
-rw-r--r--webkit/glue/resources/webkit_strings_id.xtb4
80 files changed, 6326 insertions, 299 deletions
diff --git a/build/README.chromium b/build/README.chromium
new file mode 100644
index 0000000..012df35
--- /dev/null
+++ b/build/README.chromium
@@ -0,0 +1,15 @@
+List of property sheets to be included by projects:
+ common.vsprops
+ Not used anymore. No-op. Kept for compatibility with current projects.
+
+ debug.vsprops
+ Enables debug settings. Must be included directly in Debug configuration. Includes internal\essential.vsprops.
+
+ external_code.vsprops
+ Contains settings made to simplify usage of external (non-Google) code. It relaxes the warning levels. Should be included after debug.vsprops or release.vsprops to override their settings.
+
+ output_dll_copy.rules
+ Run to enable automatic copy of DLL when they are as an input file in a vcproj project.
+
+ release.vsprops
+ Enables release settings. Must be included directly in Release configuration. Includes internal\essential.vsprops. Also includes "internal\release_impl$(CHROME_BUILD_TYPE).vsprops". So the behavior is dependant on the CHROME_BUILD_TYPE environment variable.
diff --git a/build/all.gyp b/build/all.gyp
new file mode 100644
index 0000000..0ce4a4d
--- /dev/null
+++ b/build/all.gyp
@@ -0,0 +1,562 @@
+# Copyright (c) 2010 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.
+
+{
+ 'targets': [
+ {
+ 'target_name': 'All',
+ 'type': 'none',
+ 'xcode_create_dependents_test_runner': 1,
+ 'dependencies': [
+ '../app/app.gyp:*',
+ '../base/base.gyp:*',
+ '../chrome/browser/sync/tools/sync_tools.gyp:*',
+ '../chrome/chrome.gyp:*',
+ '../crypto/crypto.gyp:*',
+ '../ui/ui.gyp:*',
+ '../gpu/gpu.gyp:*',
+ '../gpu/demos/demos.gyp:*',
+ '../ipc/ipc.gyp:*',
+ '../jingle/jingle.gyp:*',
+ '../media/media.gyp:*',
+ '../net/net.gyp:*',
+ '../ppapi/ppapi.gyp:*',
+ '../printing/printing.gyp:*',
+ '../sdch/sdch.gyp:*',
+ '../skia/skia.gyp:*',
+ '../testing/gmock.gyp:*',
+ '../testing/gtest.gyp:*',
+ '../third_party/bzip2/bzip2.gyp:*',
+ '../third_party/cacheinvalidation/cacheinvalidation.gyp:*',
+ '../third_party/cld/cld.gyp:*',
+ '../third_party/codesighs/codesighs.gyp:*',
+ '../third_party/ffmpeg/ffmpeg.gyp:*',
+ '../third_party/iccjpeg/iccjpeg.gyp:*',
+ '../third_party/icu/icu.gyp:*',
+ '../third_party/libpng/libpng.gyp:*',
+ '../third_party/libwebp/libwebp.gyp:*',
+ '../third_party/libxml/libxml.gyp:*',
+ '../third_party/libxslt/libxslt.gyp:*',
+ '../third_party/lzma_sdk/lzma_sdk.gyp:*',
+ '../third_party/mesa/mesa.gyp:*',
+ '../third_party/modp_b64/modp_b64.gyp:*',
+ '../third_party/npapi/npapi.gyp:*',
+ '../third_party/ots/ots.gyp:*',
+ '../third_party/qcms/qcms.gyp:*',
+ '../third_party/sqlite/sqlite.gyp:*',
+ '../third_party/WebKit/Source/WebKit/chromium/WebKit.gyp:*',
+ '../third_party/zlib/zlib.gyp:*',
+ '../webkit/support/webkit_support.gyp:*',
+ '../webkit/webkit.gyp:*',
+ 'util/build_util.gyp:*',
+ 'temp_gyp/googleurl.gyp:*',
+ '<(libjpeg_gyp_path):*',
+ ],
+ 'conditions': [
+ ['javascript_engine=="v8"', {
+ 'dependencies': [
+ '../v8/tools/gyp/v8.gyp:*',
+ ],
+ }],
+ ['OS=="mac" or OS=="linux" or OS=="freebsd" or OS=="openbsd"', {
+ 'dependencies': [
+ '../third_party/yasm/yasm.gyp:*#host',
+ ],
+ }],
+ ['OS=="mac" or OS=="win"', {
+ 'dependencies': [
+ '../third_party/nss/nss.gyp:*',
+ ],
+ }],
+ ['OS=="mac"', {
+ 'dependencies': [
+ '../third_party/ocmock/ocmock.gyp:*',
+ ],
+ }],
+ ['OS=="linux"', {
+ 'dependencies': [
+ '../breakpad/breakpad.gyp:*',
+ '../courgette/courgette.gyp:*',
+ '../sandbox/sandbox.gyp:*',
+ ],
+ 'conditions': [
+ ['branding=="Chrome"', {
+ 'dependencies': [
+ '../chrome/chrome.gyp:linux_packages_<(channel)',
+ ],
+ }],
+ ],
+ }],
+ ['OS=="linux" or OS=="freebsd" or OS=="openbsd"', {
+ 'dependencies': [
+ '../tools/gtk_clipboard_dump/gtk_clipboard_dump.gyp:*',
+ '../tools/xdisplaycheck/xdisplaycheck.gyp:*',
+ ],
+ }],
+ ['OS=="win"', {
+ 'conditions': [
+ ['win_use_allocator_shim==1', {
+ 'dependencies': [
+ '../base/allocator/allocator.gyp:*',
+ ],
+ }],
+ ],
+ 'dependencies': [
+ '../breakpad/breakpad.gyp:*',
+ '../chrome/app/locales/locales.gyp:*',
+ '../chrome_frame/chrome_frame.gyp:*',
+ '../cloud_print/virtual_driver/virtual_driver.gyp:*',
+ '../courgette/courgette.gyp:*',
+ '../rlz/rlz.gyp:*',
+ '../sandbox/sandbox.gyp:*',
+ '../third_party/angle/src/build_angle.gyp:*',
+ '../third_party/bsdiff/bsdiff.gyp:*',
+ '../third_party/bspatch/bspatch.gyp:*',
+ '../third_party/gles2_book/gles2_book.gyp:*',
+ '../tools/memory_watcher/memory_watcher.gyp:*',
+ ],
+ }, {
+ 'dependencies': [
+ '../third_party/libevent/libevent.gyp:*',
+ ],
+ }],
+ ['toolkit_views==1', {
+ 'dependencies': [
+ '../views/views.gyp:*',
+ ],
+ }],
+ ['remoting==1', {
+ 'dependencies': [
+ '../remoting/remoting.gyp:*',
+ ],
+ }],
+ ['use_openssl!=1', {
+ 'dependencies': [
+ '../net/third_party/nss/ssl.gyp:*',
+ ],
+ }],
+ ],
+ }, # target_name: All
+ {
+ 'target_name': 'chromium_builder_tests',
+ 'type': 'none',
+ 'dependencies': [
+ '../app/app.gyp:app_unittests',
+ '../base/base.gyp:base_unittests',
+ '../chrome/chrome.gyp:browser_tests',
+ '../chrome/chrome.gyp:interactive_ui_tests',
+ '../chrome/chrome.gyp:nacl_ui_tests',
+ '../chrome/chrome.gyp:nacl_sandbox_tests',
+ '../chrome/chrome.gyp:safe_browsing_tests',
+ '../chrome/chrome.gyp:sync_integration_tests',
+ '../chrome/chrome.gyp:sync_unit_tests',
+ '../chrome/chrome.gyp:ui_tests',
+ '../chrome/chrome.gyp:unit_tests',
+ '../crypto/crypto.gyp:crypto_unittests',
+ '../ui/ui.gyp:gfx_unittests',
+ '../gpu/gpu.gyp:gpu_unittests',
+ '../ipc/ipc.gyp:ipc_tests',
+ '../jingle/jingle.gyp:jingle_unittests',
+ '../media/media.gyp:media_unittests',
+ '../net/net.gyp:net_unittests',
+ '../printing/printing.gyp:printing_unittests',
+ '../remoting/remoting.gyp:remoting_unittests',
+ '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_unittests',
+ 'temp_gyp/googleurl.gyp:googleurl_unittests',
+ ],
+ 'conditions': [
+ ['OS=="win"', {
+ 'dependencies': [
+ '../chrome/chrome.gyp:installer_util_unittests',
+ '../chrome/chrome.gyp:mini_installer_test',
+ # mini_installer_tests depends on mini_installer. This should be
+ # defined in installer.gyp.
+ '../chrome/installer/mini_installer.gyp:mini_installer',
+ '../chrome_frame/chrome_frame.gyp:chrome_frame_net_tests',
+ '../chrome_frame/chrome_frame.gyp:chrome_frame_perftests',
+ '../chrome_frame/chrome_frame.gyp:chrome_frame_reliability_tests',
+ '../chrome_frame/chrome_frame.gyp:chrome_frame_tests',
+ '../chrome_frame/chrome_frame.gyp:chrome_frame_unittests',
+ '../chrome_frame/chrome_frame.gyp:npchrome_frame',
+ '../courgette/courgette.gyp:courgette_unittests',
+ '../sandbox/sandbox.gyp:sbox_integration_tests',
+ '../sandbox/sandbox.gyp:sbox_unittests',
+ '../sandbox/sandbox.gyp:sbox_validation_tests',
+ '../views/views.gyp:views_unittests',
+ '../third_party/WebKit/Source/WebKit/chromium/WebKit.gyp:copy_TestNetscapePlugIn',
+ # TODO(nsylvain) ui_tests.exe depends on test_shell_common.
+ # This should:
+ # 1) not be the case. OR.
+ # 2) be expressed in the ui tests dependencies.
+ '../webkit/webkit.gyp:test_shell_common',
+ ],
+ }],
+ ],
+ }, # target_name: chromium_builder_tests
+ {
+ 'target_name': 'chromium_2010_builder_tests',
+ 'type': 'none',
+ 'dependencies': [
+ '../chrome/chrome.gyp:chrome',
+ '../app/app.gyp:app_unittests',
+ '../base/base.gyp:base_unittests',
+ '../chrome/chrome.gyp:browser_tests',
+ '../chrome/chrome.gyp:interactive_ui_tests',
+ # TODO(bradnelson): fix and enable.
+ #'../chrome/chrome.gyp:nacl_ui_tests',
+ #'../chrome/chrome.gyp:nacl_sandbox_tests',
+ '../chrome/chrome.gyp:safe_browsing_tests',
+ '../chrome/chrome.gyp:sync_integration_tests',
+ '../chrome/chrome.gyp:sync_unit_tests',
+ '../chrome/chrome.gyp:ui_tests',
+ '../chrome/chrome.gyp:unit_tests',
+ '../crypto/crypto.gyp:crypto_unittests',
+ '../ui/ui.gyp:gfx_unittests',
+ '../gpu/gpu.gyp:gpu_unittests',
+ '../ipc/ipc.gyp:ipc_tests',
+ '../jingle/jingle.gyp:jingle_unittests',
+ '../media/media.gyp:media_unittests',
+ '../net/net.gyp:net_unittests',
+ '../printing/printing.gyp:printing_unittests',
+ '../remoting/remoting.gyp:remoting_unittests',
+ '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_unittests',
+ 'temp_gyp/googleurl.gyp:googleurl_unittests',
+ ],
+ 'conditions': [
+ ['OS=="win"', {
+ 'dependencies': [
+ '../chrome/chrome.gyp:installer_util_unittests',
+ # TODO(bradnelson): fix and enable.
+ #'../chrome/chrome.gyp:mini_installer_test',
+ # mini_installer_tests depends on mini_installer. This should be
+ # defined in installer.gyp.
+ #'../chrome/installer/mini_installer.gyp:mini_installer',
+ #'../chrome_frame/chrome_frame.gyp:chrome_frame_net_tests',
+ #'../chrome_frame/chrome_frame.gyp:chrome_frame_perftests',
+ #'../chrome_frame/chrome_frame.gyp:chrome_frame_reliability_tests',
+ #'../chrome_frame/chrome_frame.gyp:chrome_frame_tests',
+ #'../chrome_frame/chrome_frame.gyp:chrome_frame_unittests',
+ #'../chrome_frame/chrome_frame.gyp:npchrome_frame',
+ '../courgette/courgette.gyp:courgette_unittests',
+ '../sandbox/sandbox.gyp:sbox_integration_tests',
+ '../sandbox/sandbox.gyp:sbox_unittests',
+ '../sandbox/sandbox.gyp:sbox_validation_tests',
+ '../views/views.gyp:views_unittests',
+ '../third_party/WebKit/Source/WebKit/chromium/WebKit.gyp:copy_TestNetscapePlugIn',
+ # TODO(nsylvain) ui_tests.exe depends on test_shell_common.
+ # This should:
+ # 1) not be the case. OR.
+ # 2) be expressed in the ui tests dependencies.
+ '../webkit/webkit.gyp:test_shell_common',
+ ],
+ }],
+ ],
+ }, # target_name: chromium_2010_builder_tests
+ {
+ 'target_name': 'chromium_builder_perf',
+ 'type': 'none',
+ 'dependencies': [
+ '../chrome/chrome.gyp:memory_test',
+ '../chrome/chrome.gyp:page_cycler_tests',
+ '../chrome/chrome.gyp:plugin_tests',
+ '../chrome/chrome.gyp:startup_tests',
+ '../chrome/chrome.gyp:tab_switching_test',
+ '../chrome/chrome.gyp:ui_tests', # needed for dromaeo, sunspider, v8
+ '../chrome/chrome.gyp:url_fetch_test',
+ ],
+ }, # target_name: chromium_builder_perf
+ {
+ 'target_name': 'chromium_gpu_builder',
+ 'type': 'none',
+ 'dependencies': [
+ '../chrome/chrome.gyp:gpu_tests',
+ '../third_party/WebKit/Source/WebKit/chromium/WebKit.gyp:DumpRenderTree',
+ ],
+ }, # target_name: chromium_gpu_builder
+ {
+ 'target_name': 'chromium_builder_qa',
+ 'type': 'none',
+ 'dependencies': [
+ '../chrome/chrome.gyp:chromedriver',
+ ],
+ 'conditions': [
+ ['OS=="mac" or OS=="win" or (OS=="linux" and target_arch==python_arch)', {
+ 'dependencies': [
+ '../chrome/chrome.gyp:pyautolib',
+ ],
+ }], # 'OS=="mac" or OS=="win" or (OS=="linux" and target_arch==python_arch)'
+ ],
+ }, # target_name: chromium_builder_qa
+ ],
+ 'conditions': [
+ ['OS=="mac"', {
+ 'targets': [
+ {
+ # Target to build everything plus the dmg. We don't put the dmg
+ # in the All target because developers really don't need it.
+ 'target_name': 'all_and_dmg',
+ 'type': 'none',
+ 'dependencies': [
+ 'All',
+ '../chrome/chrome.gyp:build_app_dmg',
+ ],
+ },
+ # These targets are here so the build bots can use them to build
+ # subsets of a full tree for faster cycle times.
+ {
+ 'target_name': 'chromium_builder_dbg',
+ 'type': 'none',
+ 'dependencies': [
+ '../app/app.gyp:app_unittests',
+ '../chrome/chrome.gyp:browser_tests',
+ '../chrome/chrome.gyp:interactive_ui_tests',
+ '../chrome/chrome.gyp:nacl_ui_tests',
+ '../chrome/chrome.gyp:nacl_sandbox_tests',
+ '../chrome/chrome.gyp:safe_browsing_tests',
+ '../chrome/chrome.gyp:sync_integration_tests',
+ '../chrome/chrome.gyp:sync_unit_tests',
+ '../chrome/chrome.gyp:ui_tests',
+ '../chrome/chrome.gyp:unit_tests',
+ '../ui/ui.gyp:gfx_unittests',
+ '../gpu/gpu.gyp:gpu_unittests',
+ '../ipc/ipc.gyp:ipc_tests',
+ '../jingle/jingle.gyp:jingle_unittests',
+ '../media/media.gyp:media_unittests',
+ '../printing/printing.gyp:printing_unittests',
+ '../remoting/remoting.gyp:remoting_unittests',
+ '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_unittests',
+ 'temp_gyp/googleurl.gyp:googleurl_unittests',
+ ],
+ },
+ {
+ 'target_name': 'chromium_builder_rel',
+ 'type': 'none',
+ 'dependencies': [
+ '../app/app.gyp:app_unittests',
+ '../chrome/chrome.gyp:browser_tests',
+ '../chrome/chrome.gyp:memory_test',
+ '../chrome/chrome.gyp:nacl_ui_tests',
+ '../chrome/chrome.gyp:nacl_sandbox_tests',
+ '../chrome/chrome.gyp:page_cycler_tests',
+ '../chrome/chrome.gyp:plugin_tests',
+ '../chrome/chrome.gyp:safe_browsing_tests',
+ '../chrome/chrome.gyp:startup_tests',
+ '../chrome/chrome.gyp:sync_integration_tests',
+ '../chrome/chrome.gyp:sync_unit_tests',
+ '../chrome/chrome.gyp:tab_switching_test',
+ '../chrome/chrome.gyp:ui_tests',
+ '../chrome/chrome.gyp:unit_tests',
+ '../chrome/chrome.gyp:url_fetch_test',
+ '../ui/ui.gyp:gfx_unittests',
+ '../gpu/gpu.gyp:gpu_unittests',
+ '../ipc/ipc.gyp:ipc_tests',
+ '../jingle/jingle.gyp:jingle_unittests',
+ '../media/media.gyp:media_unittests',
+ '../printing/printing.gyp:printing_unittests',
+ '../remoting/remoting.gyp:remoting_unittests',
+ '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_unittests',
+ 'temp_gyp/googleurl.gyp:googleurl_unittests',
+ ],
+ },
+ {
+ 'target_name': 'chromium_builder_dbg_tsan_mac',
+ 'type': 'none',
+ 'dependencies': [
+ '../base/base.gyp:base_unittests',
+ '../crypto/crypto.gyp:crypto_unittests',
+ 'temp_gyp/googleurl.gyp:googleurl_unittests',
+ '../net/net.gyp:net_unittests',
+ '../ipc/ipc.gyp:ipc_tests',
+ '../jingle/jingle.gyp:jingle_unittests',
+ '../media/media.gyp:media_unittests',
+ '../printing/printing.gyp:printing_unittests',
+ '../remoting/remoting.gyp:remoting_unittests',
+ '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_unittests',
+ ],
+ },
+ {
+ 'target_name': 'chromium_builder_dbg_valgrind_mac',
+ 'type': 'none',
+ 'dependencies': [
+ '../app/app.gyp:app_unittests',
+ '../base/base.gyp:base_unittests',
+ '../crypto/crypto.gyp:crypto_unittests',
+ 'temp_gyp/googleurl.gyp:googleurl_unittests',
+ '../ipc/ipc.gyp:ipc_tests',
+ '../media/media.gyp:media_unittests',
+ '../net/net.gyp:net_unittests',
+ '../printing/printing.gyp:printing_unittests',
+ '../remoting/remoting.gyp:remoting_unittests',
+ '../chrome/chrome.gyp:safe_browsing_tests',
+ '../chrome/chrome.gyp:sync_unit_tests',
+ '../chrome/chrome.gyp:unit_tests',
+ '../chrome/chrome.gyp:ui_tests',
+ '../ui/ui.gyp:gfx_unittests',
+ '../jingle/jingle.gyp:jingle_unittests',
+ '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_unittests',
+ ],
+ },
+ ], # targets
+ }], # OS="mac"
+ ['OS=="win"', {
+ 'targets': [
+ # These targets are here so the build bots can use them to build
+ # subsets of a full tree for faster cycle times.
+ {
+ 'target_name': 'chromium_builder',
+ 'type': 'none',
+ 'dependencies': [
+ '../app/app.gyp:app_unittests',
+ '../chrome/chrome.gyp:browser_tests',
+ '../chrome/chrome.gyp:installer_util_unittests',
+ '../chrome/chrome.gyp:interactive_ui_tests',
+ '../chrome/chrome.gyp:memory_test',
+ '../chrome/chrome.gyp:mini_installer_test',
+ '../chrome/chrome.gyp:nacl_ui_tests',
+ '../chrome/chrome.gyp:nacl_sandbox_tests',
+ '../chrome/chrome.gyp:page_cycler_tests',
+ '../chrome/chrome.gyp:plugin_tests',
+ '../chrome/chrome.gyp:safe_browsing_tests',
+ '../chrome/chrome.gyp:selenium_tests',
+ '../chrome/chrome.gyp:startup_tests',
+ '../chrome/chrome.gyp:sync_integration_tests',
+ '../chrome/chrome.gyp:sync_unit_tests',
+ '../chrome/chrome.gyp:tab_switching_test',
+ '../chrome/chrome.gyp:ui_tests',
+ '../chrome/chrome.gyp:unit_tests',
+ '../chrome/chrome.gyp:url_fetch_test',
+ # mini_installer_tests depends on mini_installer. This should be
+ # defined in installer.gyp.
+ '../chrome/installer/mini_installer.gyp:mini_installer',
+ '../chrome_frame/chrome_frame.gyp:chrome_frame_net_tests',
+ '../chrome_frame/chrome_frame.gyp:chrome_frame_perftests',
+ '../chrome_frame/chrome_frame.gyp:chrome_frame_reliability_tests',
+ '../chrome_frame/chrome_frame.gyp:chrome_frame_tests',
+ '../chrome_frame/chrome_frame.gyp:chrome_frame_unittests',
+ '../chrome_frame/chrome_frame.gyp:npchrome_frame',
+ '../courgette/courgette.gyp:courgette_unittests',
+ '../ui/ui.gyp:gfx_unittests',
+ '../gpu/gpu.gyp:gpu_unittests',
+ '../ipc/ipc.gyp:ipc_tests',
+ '../jingle/jingle.gyp:jingle_unittests',
+ '../media/media.gyp:media_unittests',
+ '../printing/printing.gyp:printing_unittests',
+ '../remoting/remoting.gyp:remoting_unittests',
+ '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_unittests',
+ '../third_party/WebKit/Source/WebKit/chromium/WebKit.gyp:copy_TestNetscapePlugIn',
+ '../views/views.gyp:views_unittests',
+ # TODO(nsylvain) ui_tests.exe depends on test_shell_common.
+ # This should:
+ # 1) not be the case. OR.
+ # 2) be expressed in the ui tests dependencies.
+ '../webkit/webkit.gyp:test_shell_common',
+ 'temp_gyp/googleurl.gyp:googleurl_unittests',
+ ],
+ },
+ {
+ 'target_name': 'chromium_builder_dbg_tsan_win',
+ 'type': 'none',
+ 'dependencies': [
+ '../app/app.gyp:app_unittests',
+ # TODO(bradnelson): app_unittests should depend on locales.
+ # However, we can't add dependencies on chrome/ to app/
+ # See http://crbug.com/43603
+ '../base/base.gyp:base_unittests',
+ '../chrome/app/locales/locales.gyp:*',
+ '../chrome/chrome.gyp:sync_unit_tests',
+ '../crypto/crypto.gyp:crypto_unittests',
+ '../ipc/ipc.gyp:ipc_tests',
+ '../jingle/jingle.gyp:jingle_unittests',
+ '../media/media.gyp:media_unittests',
+ '../net/net.gyp:net_unittests',
+ '../printing/printing.gyp:printing_unittests',
+ '../remoting/remoting.gyp:remoting_unittests',
+ '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_unittests',
+ 'temp_gyp/googleurl.gyp:googleurl_unittests',
+ ],
+ },
+ ], # targets
+ 'conditions': [
+ ['branding=="Chrome"', {
+ 'targets': [
+ {
+ 'target_name': 'chrome_official_builder',
+ 'type': 'none',
+ 'dependencies': [
+ '../chrome/app/locales/locales.gyp:*',
+ '../chrome/chrome.gyp:chromedriver',
+ '../chrome/chrome.gyp:crash_service',
+ '../chrome/chrome.gyp:policy_templates',
+ '../chrome/chrome.gyp:pyautolib',
+ '../chrome/chrome.gyp:reliability_tests',
+ '../chrome/chrome.gyp:automated_ui_tests',
+ '../chrome/installer/mini_installer.gyp:mini_installer',
+ '../chrome_frame/chrome_frame.gyp:npchrome_frame',
+ '../courgette/courgette.gyp:courgette',
+ '../courgette/courgette.gyp:courgette64',
+ '../third_party/adobe/flash/flash_player.gyp:flash_player',
+ ],
+ 'conditions': [
+ ['internal_pdf', {
+ 'dependencies': [
+ '../pdf/pdf.gyp:pdf',
+ ],
+ }], # internal_pdf
+ ]
+ },
+ ], # targets
+ }], # branding=="Chrome"
+ ], # conditions
+ }], # OS="win"
+ ['chromeos==1', {
+ 'targets': [
+ {
+ 'target_name': 'chromeos_builder',
+ 'type': 'none',
+ 'sources': [
+ # TODO(bradnelson): This is here to work around gyp issue 137.
+ # Remove this sources list when that issue has been fixed.
+ 'all.gyp',
+ ],
+ 'dependencies': [
+ '../app/app.gyp:app_unittests',
+ '../base/base.gyp:base_unittests',
+ '../chrome/chrome.gyp:browser_tests',
+ '../chrome/chrome.gyp:chrome',
+ '../chrome/chrome.gyp:interactive_ui_tests',
+ '../chrome/chrome.gyp:memory_test',
+ '../chrome/chrome.gyp:page_cycler_tests',
+ '../chrome/chrome.gyp:safe_browsing_tests',
+ '../chrome/chrome.gyp:startup_tests',
+ '../chrome/chrome.gyp:sync_unit_tests',
+ '../chrome/chrome.gyp:sync_integration_tests',
+ '../chrome/chrome.gyp:tab_switching_test',
+ '../chrome/chrome.gyp:ui_tests',
+ '../chrome/chrome.gyp:unit_tests',
+ '../chrome/chrome.gyp:url_fetch_test',
+ '../crypto/crypto.gyp:crypto_unittests',
+ '../ui/ui.gyp:gfx_unittests',
+ '../ipc/ipc.gyp:ipc_tests',
+ '../jingle/jingle.gyp:jingle_unittests',
+ '../media/media.gyp:ffmpeg_tests',
+ '../media/media.gyp:media_unittests',
+ '../media/media.gyp:omx_test',
+ '../net/net.gyp:net_unittests',
+ '../printing/printing.gyp:printing_unittests',
+ '../remoting/remoting.gyp:remoting_unittests',
+ '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_unittests',
+ '../views/views.gyp:views_unittests',
+ 'temp_gyp/googleurl.gyp:googleurl_unittests',
+ ],
+ },
+ ], # targets
+ }], # "chromeos==1"
+ ], # conditions
+}
+
+# Local Variables:
+# tab-width:2
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/build/apply_locales.py b/build/apply_locales.py
new file mode 100755
index 0000000..6af7280
--- /dev/null
+++ b/build/apply_locales.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python
+# Copyright (c) 2009 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.
+
+# TODO: remove this script when GYP has for loops
+
+import sys
+import optparse
+
+def main(argv):
+
+ parser = optparse.OptionParser()
+ usage = 'usage: %s [options ...] format_string locale_list'
+ parser.set_usage(usage.replace('%s', '%prog'))
+ parser.add_option('-d', dest='dash_to_underscore', action="store_true",
+ default=False,
+ help='map "en-US" to "en" and "-" to "_" in locales')
+
+ (options, arglist) = parser.parse_args(argv)
+
+ if len(arglist) < 3:
+ print 'ERROR: need string and list of locales'
+ return 1
+
+ str_template = arglist[1]
+ locales = arglist[2:]
+
+ results = []
+ for locale in locales:
+ # For Cocoa to find the locale at runtime, it needs to use '_' instead
+ # of '-' (http://crbug.com/20441). Also, 'en-US' should be represented
+ # simply as 'en' (http://crbug.com/19165, http://crbug.com/25578).
+ if options.dash_to_underscore:
+ if locale == 'en-US':
+ locale = 'en'
+ locale = locale.replace('-', '_')
+ results.append(str_template.replace('ZZLOCALE', locale))
+
+ # Quote each element so filename spaces don't mess up GYP's attempt to parse
+ # it into a list.
+ print ' '.join(["'%s'" % x for x in results])
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv))
diff --git a/build/branding_value.sh b/build/branding_value.sh
new file mode 100755
index 0000000..9fcb550
--- /dev/null
+++ b/build/branding_value.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+# Copyright (c) 2008 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.
+
+# This is a wrapper for fetching values from the BRANDING files. Pass the
+# value of GYP's branding variable followed by the key you want and the right
+# file is checked.
+#
+# branding_value.sh Chromium COPYRIGHT
+# branding_value.sh Chromium PRODUCT_FULLNAME
+#
+
+set -e
+
+if [ $# -ne 2 ] ; then
+ echo "error: expect two arguments, branding and key" >&2
+ exit 1
+fi
+
+BUILD_BRANDING=$1
+THE_KEY=$2
+
+pushd $(dirname "${0}") > /dev/null
+BUILD_DIR=$(pwd)
+popd > /dev/null
+
+TOP="${BUILD_DIR}/.."
+
+case ${BUILD_BRANDING} in
+ Chromium)
+ BRANDING_FILE="${TOP}/chrome/app/theme/chromium/BRANDING"
+ ;;
+ Chrome)
+ BRANDING_FILE="${TOP}/chrome/app/theme/google_chrome/BRANDING"
+ ;;
+ *)
+ echo "error: unknown branding: ${BUILD_BRANDING}" >&2
+ exit 1
+ ;;
+esac
+
+BRANDING_VALUE=$(sed -n -e "s/^${THE_KEY}=\(.*\)\$/\1/p" "${BRANDING_FILE}")
+
+if [ -z "${BRANDING_VALUE}" ] ; then
+ echo "error: failed to find key '${THE_KEY}'" >&2
+ exit 1
+fi
+
+echo "${BRANDING_VALUE}"
diff --git a/build/build_config.h b/build/build_config.h
index df16071..fab9da0 100644
--- a/build/build_config.h
+++ b/build/build_config.h
@@ -49,6 +49,7 @@
#if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_OPENBSD) || \
defined(OS_SOLARIS)
+<<<<<<< HEAD
#if defined(ANDROID)
#define USE_OPENSSL 1
@@ -64,6 +65,12 @@
#else
#undef USE_X11
#endif
+=======
+#if !defined(USE_OPENSSL)
+#define USE_NSS 1 // Default to use NSS for crypto, unless OpenSSL is chosen.
+#endif
+#define USE_X11 1 // Use X for graphics.
+>>>>>>> chromium.org at 12.0.742.130
#endif
#if defined(USE_OPENSSL) && defined(USE_NSS)
@@ -73,8 +80,12 @@
// For access to standard POSIXish features, use OS_POSIX instead of a
// more specific macro.
#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_FREEBSD) || \
+<<<<<<< HEAD
defined(OS_OPENBSD) || defined(OS_SOLARIS) || defined(OS_NACL) || \
defined(ANDROID)
+=======
+ defined(OS_OPENBSD) || defined(OS_SOLARIS) || defined(OS_NACL)
+>>>>>>> chromium.org at 12.0.742.130
#define OS_POSIX 1
// Use base::DataPack for name/value pairs.
#define USE_BASE_DATA_PACK 1
diff --git a/build/common.croc b/build/common.croc
new file mode 100644
index 0000000..90b9cb9
--- /dev/null
+++ b/build/common.croc
@@ -0,0 +1,127 @@
+# -*- python -*-
+# Crocodile config file for Chromium - settings common to all platforms
+#
+# This should be speicified before the platform-specific config, for example:
+# croc -c chrome_common.croc -c linux/chrome_linux.croc
+
+{
+ # List of root directories, applied in order
+ 'roots' : [
+ # Sub-paths we specifically care about and want to call out
+ {
+ 'root' : '_/src',
+ 'altname' : 'CHROMIUM',
+ },
+ ],
+
+ # List of rules, applied in order
+ # Note that any 'include':0 rules here will be overridden by the 'include':1
+ # rules in the platform-specific configs.
+ 'rules' : [
+ # Don't scan for executable lines in uninstrumented C++ header files
+ {
+ 'regexp' : '.*\\.(h|hpp)$',
+ 'add_if_missing' : 0,
+ },
+
+ # Groups
+ {
+ 'regexp' : '',
+ 'group' : 'source',
+ },
+ {
+ 'regexp' : '.*_(test|unittest)\\.',
+ 'group' : 'test',
+ },
+
+ # Languages
+ {
+ 'regexp' : '.*\\.(c|h)$',
+ 'language' : 'C',
+ },
+ {
+ 'regexp' : '.*\\.(cc|cpp|hpp)$',
+ 'language' : 'C++',
+ },
+
+ # Files/paths to include. Specify these before the excludes, since rules
+ # are in order.
+ {
+ 'regexp' : '^CHROMIUM/(base|media|net|printing|remoting|chrome|webkit/glue|native_client)/',
+ 'include' : 1,
+ },
+ # Don't include subversion or mercurial SCM dirs
+ {
+ 'regexp' : '.*/(\\.svn|\\.hg)/',
+ 'include' : 0,
+ },
+ # Don't include output dirs
+ {
+ 'regexp' : '.*/(Debug|Release|sconsbuild|out|xcodebuild)/',
+ 'include' : 0,
+ },
+ # Don't include third-party source
+ {
+ 'regexp' : '.*/third_party/',
+ 'include' : 0,
+ },
+ # We don't run the V8 test suite, so we don't care about V8 coverage.
+ {
+ 'regexp' : '.*/v8/',
+ 'include' : 0,
+ },
+ ],
+
+ # Paths to add source from
+ 'add_files' : [
+ 'CHROMIUM'
+ ],
+
+ # Statistics to print
+ 'print_stats' : [
+ {
+ 'stat' : 'files_executable',
+ 'format' : '*RESULT FilesKnown: files_executable= %d files',
+ },
+ {
+ 'stat' : 'files_instrumented',
+ 'format' : '*RESULT FilesInstrumented: files_instrumented= %d files',
+ },
+ {
+ 'stat' : '100.0 * files_instrumented / files_executable',
+ 'format' : '*RESULT FilesInstrumentedPercent: files_instrumented_percent= %g',
+ },
+ {
+ 'stat' : 'lines_executable',
+ 'format' : '*RESULT LinesKnown: lines_known= %d lines',
+ },
+ {
+ 'stat' : 'lines_instrumented',
+ 'format' : '*RESULT LinesInstrumented: lines_instrumented= %d lines',
+ },
+ {
+ 'stat' : 'lines_covered',
+ 'format' : '*RESULT LinesCoveredSource: lines_covered_source= %d lines',
+ 'group' : 'source',
+ },
+ {
+ 'stat' : 'lines_covered',
+ 'format' : '*RESULT LinesCoveredTest: lines_covered_test= %d lines',
+ 'group' : 'test',
+ },
+ {
+ 'stat' : '100.0 * lines_covered / lines_executable',
+ 'format' : '*RESULT PercentCovered: percent_covered= %g',
+ },
+ {
+ 'stat' : '100.0 * lines_covered / lines_executable',
+ 'format' : '*RESULT PercentCoveredSource: percent_covered_source= %g',
+ 'group' : 'source',
+ },
+ {
+ 'stat' : '100.0 * lines_covered / lines_executable',
+ 'format' : '*RESULT PercentCoveredTest: percent_covered_test= %g',
+ 'group' : 'test',
+ },
+ ],
+}
diff --git a/build/common.gypi b/build/common.gypi
new file mode 100644
index 0000000..6333160
--- /dev/null
+++ b/build/common.gypi
@@ -0,0 +1,1691 @@
+# Copyright (c) 2010 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.
+
+# IMPORTANT:
+# Please don't directly include this file if you are building via gyp_chromium,
+# since gyp_chromium is automatically forcing its inclusion.
+{
+ # Variables expected to be overriden on the GYP command line (-D) or by
+ # ~/.gyp/include.gypi.
+ 'variables': {
+ # Putting a variables dict inside another variables dict looks kind of
+ # weird. This is done so that 'host_arch', 'chromeos', etc are defined as
+ # variables within the outer variables dict here. This is necessary
+ # to get these variables defined for the conditions within this variables
+ # dict that operate on these variables (e.g., for setting 'toolkit_views',
+ # we need to have 'chromeos' already set).
+ 'variables': {
+ 'variables': {
+ 'variables': {
+ # Whether we're building a ChromeOS build.
+ 'chromeos%': 0,
+
+ # Disable touch support by default.
+ 'touchui%': 0,
+ },
+ # Copy conditionally-set variables out one scope.
+ 'chromeos%': '<(chromeos)',
+ 'touchui%': '<(touchui)',
+
+ # To do a shared build on linux we need to be able to choose between
+ # type static_library and shared_library. We default to doing a static
+ # build but you can override this with "gyp -Dlibrary=shared_library"
+ # or you can add the following line (without the #) to
+ # ~/.gyp/include.gypi {'variables': {'library': 'shared_library'}}
+ # to compile as shared by default
+ 'library%': 'static_library',
+
+ # Compute the architecture that we're building on.
+ 'conditions': [
+ [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', {
+ # This handles the Linux platforms we generally deal with. Anything
+ # else gets passed through, which probably won't work very well; such
+ # hosts should pass an explicit target_arch to gyp.
+ 'host_arch%':
+ '<!(uname -m | sed -e "s/i.86/ia32/;s/x86_64/x64/;s/amd64/x64/;s/arm.*/arm/")',
+ }, { # OS!="linux"
+ 'host_arch%': 'ia32',
+ }],
+
+ # Set default value of toolkit_views on for Windows, Chrome OS
+ # and the touch UI.
+ ['OS=="win" or chromeos==1 or touchui==1', {
+ 'toolkit_views%': 1,
+ }, {
+ 'toolkit_views%': 0,
+ }],
+ ],
+ },
+
+ # Copy conditionally-set variables out one scope.
+ 'chromeos%': '<(chromeos)',
+ 'touchui%': '<(touchui)',
+ 'host_arch%': '<(host_arch)',
+ 'library%': '<(library)',
+ 'toolkit_views%': '<(toolkit_views)',
+
+ # Override branding to select the desired branding flavor.
+ 'branding%': 'Chromium',
+
+ # Override buildtype to select the desired build flavor.
+ # Dev - everyday build for development/testing
+ # Official - release build (generally implies additional processing)
+ # TODO(mmoss) Once 'buildtype' is fully supported (e.g. Windows gyp
+ # conversion is done), some of the things which are now controlled by
+ # 'branding', such as symbol generation, will need to be refactored based
+ # on 'buildtype' (i.e. we don't care about saving symbols for non-Official
+ # builds).
+ 'buildtype%': 'Dev',
+
+ # Default architecture we're building for is the architecture we're
+ # building on.
+ 'target_arch%': '<(host_arch)',
+
+ # This variable tells WebCore.gyp and JavaScriptCore.gyp whether they are
+ # are built under a chromium full build (1) or a webkit.org chromium
+ # build (0).
+ 'inside_chromium_build%': 1,
+
+ # Set to 1 to enable fast builds. It disables debug info for fastest
+ # compilation.
+ 'fastbuild%': 0,
+
+ # Disable file manager component extension by default.
+ 'file_manager_extension%': 0,
+
+ # Python version.
+ 'python_ver%': '2.5',
+
+ # Set ARM-v7 compilation flags
+ 'armv7%': 0,
+
+ # Set Neon compilation flags (only meaningful if armv7==1).
+ 'arm_neon%': 1,
+
+ # The system root for cross-compiles. Default: none.
+ 'sysroot%': '',
+
+ # On Linux, we build with sse2 for Chromium builds.
+ 'disable_sse2%': 0,
+
+ # Use libjpeg-turbo as the JPEG codec used by Chromium.
+ 'use_libjpeg_turbo%': 1,
+
+ # Variable 'component' is for cases where we would like to build some
+ # components as dynamic shared libraries but still need variable
+ # 'library' for static libraries.
+ # By default, component is set to whatever library is set to and
+ # it can be overriden by the GYP command line or by ~/.gyp/include.gypi.
+ 'component%': '<(library)',
+
+ # Set to select the Title Case versions of strings in GRD files.
+ 'use_titlecase_in_grd_files%': 0,
+
+ # Use translations provided by volunteers at launchpad.net. This
+ # currently only works on Linux.
+ 'use_third_party_translations%': 0,
+
+ # Remoting compilation is enabled by default. Set to 0 to disable.
+ 'remoting%': 1,
+
+ # If this is set, the clang plugins used on the buildbot will be used.
+ # Run tools/clang/scripts/update.sh to make sure they are compiled.
+ # This causes 'clang_chrome_plugins_flags' to be set.
+ # Has no effect if 'clang' is not set as well.
+ 'clang_use_chrome_plugins%': 0,
+
+ 'conditions': [
+ # A flag to enable or disable our compile-time dependency
+ # on gnome-keyring. If that dependency is disabled, no gnome-keyring
+ # support will be available. This option is useful
+ # for Linux distributions.
+ ['chromeos==1', {
+ 'use_gnome_keyring%': 0,
+ }, {
+ 'use_gnome_keyring%': 1,
+ }],
+
+ # Set to 1 compile with -fPIC cflag on linux. This is a must for shared
+ # libraries on linux x86-64 and arm.
+ ['host_arch=="ia32"', {
+ 'linux_fpic%': 0,
+ }, {
+ 'linux_fpic%': 1,
+ }],
+
+ ['toolkit_views==0 or OS=="mac"', {
+ # GTK+ and Mac wants Title Case strings
+ 'use_titlecase_in_grd_files%': 1,
+ }],
+
+ # Enable some hacks to support Flapper only on Chrome OS.
+ ['chromeos==1', {
+ 'enable_flapper_hacks%': 1,
+ }, {
+ 'enable_flapper_hacks%': 0,
+ }],
+
+ # Enable file manager extension by default on Chrome OS.
+ ['chromeos==1', {
+ 'file_manager_extension%': 1,
+ }, {
+ 'file_manager_extension%': 0,
+ }],
+ ],
+ },
+
+ # Copy conditionally-set variables out one scope.
+ 'branding%': '<(branding)',
+ 'buildtype%': '<(buildtype)',
+ 'target_arch%': '<(target_arch)',
+ 'host_arch%': '<(host_arch)',
+ 'toolkit_views%': '<(toolkit_views)',
+ 'use_gnome_keyring%': '<(use_gnome_keyring)',
+ 'linux_fpic%': '<(linux_fpic)',
+ 'enable_flapper_hacks%': '<(enable_flapper_hacks)',
+ 'chromeos%': '<(chromeos)',
+ 'touchui%': '<(touchui)',
+ 'file_manager_extension%': '<(file_manager_extension)',
+ 'inside_chromium_build%': '<(inside_chromium_build)',
+ 'fastbuild%': '<(fastbuild)',
+ 'python_ver%': '<(python_ver)',
+ 'armv7%': '<(armv7)',
+ 'arm_neon%': '<(arm_neon)',
+ 'sysroot%': '<(sysroot)',
+ 'disable_sse2%': '<(disable_sse2)',
+ 'library%': '<(library)',
+ 'component%': '<(component)',
+ 'use_titlecase_in_grd_files%': '<(use_titlecase_in_grd_files)',
+ 'use_third_party_translations%': '<(use_third_party_translations)',
+ 'remoting%': '<(remoting)',
+ 'clang_use_chrome_plugins%': '<(clang_use_chrome_plugins)',
+
+ # The release channel that this build targets. This is used to restrict
+ # channel-specific build options, like which installer packages to create.
+ # The default is 'all', which does no channel-specific filtering.
+ 'channel%': 'all',
+
+ # Override chromium_mac_pch and set it to 0 to suppress the use of
+ # precompiled headers on the Mac. Prefix header injection may still be
+ # used, but prefix headers will not be precompiled. This is useful when
+ # using distcc to distribute a build to compile slaves that don't
+ # share the same compiler executable as the system driving the compilation,
+ # because precompiled headers rely on pointers into a specific compiler
+ # executable's image. Setting this to 0 is needed to use an experimental
+ # Linux-Mac cross compiler distcc farm.
+ 'chromium_mac_pch%': 1,
+
+ # Mac OS X SDK and deployment target support.
+ # The SDK identifies the version of the system headers that will be used,
+ # and corresponds to the MAC_OS_X_VERSION_MAX_ALLOWED compile-time macro.
+ # "Maximum allowed" refers to the operating system version whose APIs are
+ # available in the headers.
+ # The deployment target identifies the minimum system version that the
+ # built products are expected to function on. It corresponds to the
+ # MAC_OS_X_VERSION_MIN_REQUIRED compile-time macro.
+ # To ensure these macros are available, #include <AvailabilityMacros.h>.
+ # Additional documentation on these macros is available at
+ # http://developer.apple.com/mac/library/technotes/tn2002/tn2064.html#SECTION3
+ # Chrome normally builds with the Mac OS X 10.5 SDK and sets the
+ # deployment target to 10.5. Other projects, such as O3D, may override
+ # these defaults.
+ 'mac_sdk%': '10.5',
+ 'mac_deployment_target%': '10.5',
+
+ # Set to 1 to enable code coverage. In addition to build changes
+ # (e.g. extra CFLAGS), also creates a new target in the src/chrome
+ # project file called "coverage".
+ # Currently ignored on Windows.
+ 'coverage%': 0,
+
+ # Overridable specification for potential use of alternative
+ # JavaScript engines.
+ 'javascript_engine%': 'v8',
+
+ # Although base/allocator lets you select a heap library via an
+ # environment variable, the libcmt shim it uses sometimes gets in
+ # the way. To disable it entirely, and switch to normal msvcrt, do e.g.
+ # 'win_use_allocator_shim': 0,
+ # 'win_release_RuntimeLibrary': 2
+ # to ~/.gyp/include.gypi, gclient runhooks --force, and do a release build.
+ 'win_use_allocator_shim%': 1, # 1 = shim allocator via libcmt; 0 = msvcrt
+
+ # Whether usage of OpenMAX is enabled.
+ 'enable_openmax%': 0,
+
+ # Whether proprietary audio/video codecs are assumed to be included with
+ # this build (only meaningful if branding!=Chrome).
+ 'proprietary_codecs%': 0,
+
+ # TODO(bradnelson): eliminate this when possible.
+ # To allow local gyp files to prevent release.vsprops from being included.
+ # Yes(1) means include release.vsprops.
+ # Once all vsprops settings are migrated into gyp, this can go away.
+ 'msvs_use_common_release%': 1,
+
+ # TODO(bradnelson): eliminate this when possible.
+ # To allow local gyp files to override additional linker options for msvs.
+ # Yes(1) means set use the common linker options.
+ 'msvs_use_common_linker_extras%': 1,
+
+ # TODO(sgk): eliminate this if possible.
+ # It would be nicer to support this via a setting in 'target_defaults'
+ # in chrome/app/locales/locales.gypi overriding the setting in the
+ # 'Debug' configuration in the 'target_defaults' dict below,
+ # but that doesn't work as we'd like.
+ 'msvs_debug_link_incremental%': '2',
+
+ # Needed for some of the largest modules.
+ 'msvs_debug_link_nonincremental%': '1',
+
+ # This is the location of the sandbox binary. Chrome looks for this before
+ # running the zygote process. If found, and SUID, it will be used to
+ # sandbox the zygote process and, thus, all renderer processes.
+ 'linux_sandbox_path%': '',
+
+ # Set this to true to enable SELinux support.
+ 'selinux%': 0,
+
+ # Set this to true when building with Clang.
+ # See http://code.google.com/p/chromium/wiki/Clang for details.
+ # TODO: eventually clang should behave identically to gcc, and this
+ # won't be necessary.
+ 'clang%': 0,
+
+ # These two variables can be set in GYP_DEFINES while running
+ # |gclient runhooks| to let clang run a plugin in every compilation.
+ # Only has an effect if 'clang=1' is in GYP_DEFINES as well.
+ # Example:
+ # GYP_DEFINES='clang=1 clang_load=/abs/path/to/libPrintFunctionNames.dylib clang_add_plugin=print-fns' gclient runhooks
+
+ 'clang_load%': '',
+ 'clang_add_plugin%': '',
+
+ # Enable sampling based profiler.
+ # See http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html
+ 'profiling%': '0',
+
+ # Override whether we should use Breakpad on Linux. I.e. for Chrome bot.
+ 'linux_breakpad%': 0,
+ # And if we want to dump symbols for Breakpad-enabled builds.
+ 'linux_dump_symbols%': 0,
+ # And if we want to strip the binary after dumping symbols.
+ 'linux_strip_binary%': 0,
+ # Strip the test binaries needed for Linux reliability tests.
+ 'linux_strip_reliability_tests%': 0,
+
+ # Enable TCMalloc.
+ 'linux_use_tcmalloc%': 1,
+
+ # Disable TCMalloc's debugallocation.
+ 'linux_use_debugallocation%': 0,
+
+ # Disable TCMalloc's heapchecker.
+ 'linux_use_heapchecker%': 0,
+
+ # Disable shadow stack keeping used by heapcheck to unwind the stacks
+ # better.
+ 'linux_keep_shadow_stacks%': 0,
+
+ # Set to 1 to turn on seccomp sandbox by default.
+ # (Note: this is ignored for official builds.)
+ 'linux_use_seccomp_sandbox%': 0,
+
+ # Set to 1 to link against libgnome-keyring instead of using dlopen().
+ 'linux_link_gnome_keyring%': 0,
+
+ # Used to disable Native Client at compile time, for platforms where it
+ # isn't supported
+ 'disable_nacl%': 0,
+
+ # Set Thumb compilation flags.
+ 'arm_thumb%': 0,
+
+ # Set ARM fpu compilation flags (only meaningful if armv7==1 and
+ # arm_neon==0).
+ 'arm_fpu%': 'vfpv3',
+
+ # Enable new NPDevice API.
+ 'enable_new_npdevice_api%': 0,
+
+ # Enable EGLImage support in OpenMAX
+ 'enable_eglimage%': 1,
+
+ # Enable a variable used elsewhere throughout the GYP files to determine
+ # whether to compile in the sources for the GPU plugin / process.
+ 'enable_gpu%': 1,
+
+ # Use OpenSSL instead of NSS. Under development: see http://crbug.com/62803
+ 'use_openssl%': 0,
+
+ # .gyp files or targets should set chromium_code to 1 if they build
+ # Chromium-specific code, as opposed to external code. This variable is
+ # used to control such things as the set of warnings to enable, and
+ # whether warnings are treated as errors.
+ 'chromium_code%': 0,
+
+ # Set to 1 to compile with the built in pdf viewer.
+ 'internal_pdf%': 0,
+
+ # This allows to use libcros from the current system, ie. /usr/lib/
+ # The cros_api will be pulled in as a static library, and all headers
+ # from the system include dirs.
+ 'system_libcros%': 0,
+
+ # NOTE: When these end up in the Mac bundle, we need to replace '-' for '_'
+ # so Cocoa is happy (http://crbug.com/20441).
+ 'locales': [
+ 'am', 'ar', 'bg', 'bn', 'ca', 'cs', 'da', 'de', 'el', 'en-GB',
+ 'en-US', 'es-419', 'es', 'et', 'fa', 'fi', 'fil', 'fr', 'gu', 'he',
+ 'hi', 'hr', 'hu', 'id', 'it', 'ja', 'kn', 'ko', 'lt', 'lv',
+ 'ml', 'mr', 'nb', 'nl', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru',
+ 'sk', 'sl', 'sr', 'sv', 'sw', 'ta', 'te', 'th', 'tr', 'uk',
+ 'vi', 'zh-CN', 'zh-TW',
+ ],
+
+ 'grit_defines': [],
+
+ # Use Harfbuzz-NG instead of Harfbuzz.
+ # Under development: http://crbug.com/68551
+ 'use_harfbuzz_ng%': 0,
+
+ # If debug_devtools is set to 1, JavaScript files for DevTools are
+ # stored as is and loaded from disk. Otherwise, a concatenated file
+ # is stored in resources.pak. It is still possible to load JS files
+ # from disk by passing --debug-devtools cmdline switch.
+ 'debug_devtools%': 0,
+
+ # Point to ICU directory.
+ 'icu_src_dir': '../third_party/icu',
+
+ 'conditions': [
+ ['OS=="linux" or OS=="freebsd" or OS=="openbsd"', {
+ # This will set gcc_version to XY if you are running gcc X.Y.*.
+ # This is used to tweak build flags for gcc 4.4.
+ 'gcc_version%': '<!(python <(DEPTH)/build/compiler_version.py)',
+ # Figure out the python architecture to decide if we build pyauto.
+ 'python_arch%': '<!(<(DEPTH)/build/linux/python_arch.sh <(sysroot)/usr/lib/libpython<(python_ver).so.1.0)',
+ 'conditions': [
+ ['branding=="Chrome"', {
+ 'linux_breakpad%': 1,
+ }],
+ # All Chrome builds have breakpad symbols, but only process the
+ # symbols from official builds.
+ ['(branding=="Chrome" and buildtype=="Official")', {
+ 'linux_dump_symbols%': 1,
+ }],
+ ],
+ }], # OS=="linux" or OS=="freebsd" or OS=="openbsd"
+
+ ['OS=="mac"', {
+ 'conditions': [
+ # mac_product_name is set to the name of the .app bundle as it should
+ # appear on disk. This duplicates data from
+ # chrome/app/theme/chromium/BRANDING and
+ # chrome/app/theme/google_chrome/BRANDING, but is necessary to get
+ # these names into the build system.
+ ['branding=="Chrome"', {
+ 'mac_product_name%': 'Google Chrome',
+ }, { # else: branding!="Chrome"
+ 'mac_product_name%': 'Chromium',
+ }],
+
+ # Feature variables for enabling Mac Breakpad and Keystone auto-update
+ # support. Both features are on by default in official builds with
+ # Chrome branding.
+ ['branding=="Chrome" and buildtype=="Official"', {
+ 'mac_breakpad%': 1,
+ 'mac_keystone%': 1,
+ }, { # else: branding!="Chrome" or buildtype!="Official"
+ 'mac_breakpad%': 0,
+ 'mac_keystone%': 0,
+ }],
+ ],
+ }], # OS=="mac"
+
+ # Whether to use multiple cores to compile with visual studio. This is
+ # optional because it sometimes causes corruption on VS 2005.
+ # It is on by default on VS 2008 and off on VS 2005.
+ ['OS=="win"', {
+ 'conditions': [
+ ['component=="shared_library"', {
+ 'win_use_allocator_shim%': 0,
+ }],
+ ['MSVS_VERSION=="2005"', {
+ 'msvs_multi_core_compile%': 0,
+ },{
+ 'msvs_multi_core_compile%': 1,
+ }],
+ # Don't do incremental linking for large modules on 32-bit.
+ ['MSVS_OS_BITS==32', {
+ 'msvs_large_module_debug_link_mode%': '1', # No
+ },{
+ 'msvs_large_module_debug_link_mode%': '2', # Yes
+ }],
+ ['MSVS_VERSION=="2010e" or MSVS_VERSION=="2008e" or MSVS_VERSION=="2005e"', {
+ 'msvs_express%': 1,
+ 'secure_atl%': 0,
+ },{
+ 'msvs_express%': 0,
+ 'secure_atl%': 1,
+ }],
+ ],
+ 'nacl_win64_defines': [
+ # This flag is used to minimize dependencies when building
+ # Native Client loader for 64-bit Windows.
+ 'NACL_WIN64',
+ ],
+ }],
+
+ ['OS=="mac" or (OS=="linux" and chromeos==0 and target_arch!="arm")', {
+ 'use_cups%': 1,
+ }, {
+ 'use_cups%': 0,
+ }],
+
+ # Set the relative path from this file to the GYP file of the JPEG
+ # library used by Chromium.
+ ['use_libjpeg_turbo==1', {
+ 'libjpeg_gyp_path': '../third_party/libjpeg_turbo/libjpeg.gyp',
+ }, {
+ 'libjpeg_gyp_path': '../third_party/libjpeg/libjpeg.gyp',
+ }], # use_libjpeg_turbo==1
+
+ # Use GConf, the GNOME configuration system.
+ ['chromeos==1', {
+ 'use_gconf%': 0,
+ }, {
+ 'use_gconf%': 1,
+ }],
+
+ # Set up -D and -E flags passed into grit.
+ ['branding=="Chrome"', {
+ # TODO(mmoss) The .grd files look for _google_chrome, but for
+ # consistency they should look for google_chrome_build like C++.
+ 'grit_defines': ['-D', '_google_chrome',
+ '-E', 'CHROMIUM_BUILD=google_chrome'],
+ }, {
+ 'grit_defines': ['-D', '_chromium',
+ '-E', 'CHROMIUM_BUILD=chromium'],
+ }],
+ ['chromeos==1', {
+ 'grit_defines': ['-D', 'chromeos'],
+ }],
+ ['toolkit_views==1', {
+ 'grit_defines': ['-D', 'toolkit_views'],
+ }],
+ ['touchui==1', {
+ 'grit_defines': ['-D', 'touchui'],
+ }],
+ ['file_manager_extension==1', {
+ 'grit_defines': ['-D', 'file_manager_extension'],
+ }],
+ ['remoting==1', {
+ 'grit_defines': ['-D', 'remoting'],
+ }],
+ ['use_titlecase_in_grd_files==1', {
+ 'grit_defines': ['-D', 'use_titlecase'],
+ }],
+ ['use_third_party_translations==1', {
+ 'grit_defines': ['-D', 'use_third_party_translations'],
+ 'locales': ['ast', 'eu', 'gl', 'ka', 'ku', 'ug'],
+ }],
+
+ ['clang_use_chrome_plugins==1', {
+ 'clang_chrome_plugins_flags':
+ '<!(<(DEPTH)/tools/clang/scripts/plugin_flags.sh)',
+ }],
+ ],
+ },
+ 'target_defaults': {
+ 'variables': {
+ # The condition that operates on chromium_code is in a target_conditions
+ # section, and will not have access to the default fallback value of
+ # chromium_code at the top of this file, or to the chromium_code
+ # variable placed at the root variables scope of .gyp files, because
+ # those variables are not set at target scope. As a workaround,
+ # if chromium_code is not set at target scope, define it in target scope
+ # to contain whatever value it has during early variable expansion.
+ # That's enough to make it available during target conditional
+ # processing.
+ 'chromium_code%': '<(chromium_code)',
+
+ # See http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Optimize-Options.html
+ 'mac_release_optimization%': '3', # Use -O3 unless overridden
+ 'mac_debug_optimization%': '0', # Use -O0 unless overridden
+ # See http://msdn.microsoft.com/en-us/library/aa652360(VS.71).aspx
+ 'win_release_Optimization%': '2', # 2 = /Os
+ 'win_debug_Optimization%': '0', # 0 = /Od
+ # See http://msdn.microsoft.com/en-us/library/8wtf2dfz(VS.71).aspx
+ 'win_debug_RuntimeChecks%': '3', # 3 = all checks enabled, 0 = off
+ # See http://msdn.microsoft.com/en-us/library/47238hez(VS.71).aspx
+ 'win_debug_InlineFunctionExpansion%': '', # empty = default, 0 = off,
+ 'win_release_InlineFunctionExpansion%': '2', # 1 = only __inline, 2 = max
+ # VS inserts quite a lot of extra checks to algorithms like
+ # std::partial_sort in Debug build which make them O(N^2)
+ # instead of O(N*logN). This is particularly slow under memory
+ # tools like ThreadSanitizer so we want it to be disablable.
+ # See http://msdn.microsoft.com/en-us/library/aa985982(v=VS.80).aspx
+ 'win_debug_disable_iterator_debugging%': '0',
+
+ 'release_extra_cflags%': '',
+ 'debug_extra_cflags%': '',
+ 'release_valgrind_build%': 0,
+
+ 'conditions': [
+ ['OS=="win" and component=="shared_library"', {
+ # See http://msdn.microsoft.com/en-us/library/aa652367.aspx
+ 'win_release_RuntimeLibrary%': '2', # 2 = /MT (nondebug DLL)
+ 'win_debug_RuntimeLibrary%': '3', # 3 = /MTd (debug DLL)
+ }, {
+ # See http://msdn.microsoft.com/en-us/library/aa652367.aspx
+ 'win_release_RuntimeLibrary%': '0', # 0 = /MT (nondebug static)
+ 'win_debug_RuntimeLibrary%': '1', # 1 = /MTd (debug static)
+ }],
+ ],
+ },
+ 'conditions': [
+ ['branding=="Chrome"', {
+ 'defines': ['GOOGLE_CHROME_BUILD'],
+ }, { # else: branding!="Chrome"
+ 'defines': ['CHROMIUM_BUILD'],
+ }],
+ ['toolkit_views==1', {
+ 'defines': ['TOOLKIT_VIEWS=1'],
+ }],
+ ['chromeos==1', {
+ 'defines': ['OS_CHROMEOS=1'],
+ }],
+ ['touchui==1', {
+ 'defines': ['TOUCH_UI=1'],
+ }],
+ ['file_manager_extension==1', {
+ 'defines': ['FILE_MANAGER_EXTENSION=1'],
+ }],
+ ['profiling==1', {
+ 'defines': ['ENABLE_PROFILING=1'],
+ }],
+ ['remoting==1', {
+ 'defines': ['ENABLE_REMOTING=1'],
+ }],
+ ['proprietary_codecs==1', {
+ 'defines': ['USE_PROPRIETARY_CODECS'],
+ }],
+ ['enable_flapper_hacks==1', {
+ 'defines': ['ENABLE_FLAPPER_HACKS=1'],
+ }],
+ ['fastbuild!=0', {
+ 'conditions': [
+ # For Windows, we don't genererate debug information.
+ ['OS=="win"', {
+ 'msvs_settings': {
+ 'VCLinkerTool': {
+ 'GenerateDebugInformation': 'false',
+ },
+ 'VCCLCompilerTool': {
+ 'DebugInformationFormat': '0',
+ }
+ }
+ }, { # else: OS != "win", generate less debug information.
+ 'variables': {
+ 'debug_extra_cflags': '-g1',
+ },
+ }],
+ # Clang creates chubby debug information, which makes linking very
+ # slow. For now, don't create debug information with clang. See
+ # http://crbug.com/70000
+ ['OS=="linux" and clang==1', {
+ 'variables': {
+ 'debug_extra_cflags': '-g0',
+ },
+ }],
+ ], # conditions for fastbuild.
+ }], # fastbuild!=0
+ ['selinux==1', {
+ 'defines': ['CHROMIUM_SELINUX=1'],
+ }],
+ ['win_use_allocator_shim==0', {
+ 'conditions': [
+ ['OS=="win"', {
+ 'defines': ['NO_TCMALLOC'],
+ }],
+ ],
+ }],
+ ['enable_gpu==1', {
+ 'defines': [
+ 'ENABLE_GPU=1',
+ ],
+ }],
+ ['use_openssl==1', {
+ 'defines': [
+ 'USE_OPENSSL=1',
+ ],
+ }],
+ ['enable_eglimage==1', {
+ 'defines': [
+ 'ENABLE_EGLIMAGE=1',
+ ],
+ }],
+ ['coverage!=0', {
+ 'conditions': [
+ ['OS=="mac"', {
+ 'xcode_settings': {
+ 'GCC_INSTRUMENT_PROGRAM_FLOW_ARCS': 'YES', # -fprofile-arcs
+ 'GCC_GENERATE_TEST_COVERAGE_FILES': 'YES', # -ftest-coverage
+ },
+ # Add -lgcov for types executable, shared_library, and
+ # loadable_module; not for static_library.
+ # This is a delayed conditional.
+ 'target_conditions': [
+ ['_type!="static_library"', {
+ 'xcode_settings': { 'OTHER_LDFLAGS': [ '-lgcov' ] },
+ }],
+ ],
+ }],
+ ['OS=="linux"', {
+ 'cflags': [ '-ftest-coverage',
+ '-fprofile-arcs' ],
+ 'link_settings': { 'libraries': [ '-lgcov' ] },
+ }],
+ # Finally, for Windows, we simply turn on profiling.
+ ['OS=="win"', {
+ 'msvs_settings': {
+ 'VCLinkerTool': {
+ 'Profile': 'true',
+ },
+ 'VCCLCompilerTool': {
+ # /Z7, not /Zi, so coverage is happyb
+ 'DebugInformationFormat': '1',
+ 'AdditionalOptions': ['/Yd'],
+ }
+ }
+ }], # OS==win
+ ], # conditions for coverage
+ }], # coverage!=0
+ ['OS=="win"', {
+ 'defines': [
+ '__STD_C',
+ '_CRT_SECURE_NO_DEPRECATE',
+ '_SCL_SECURE_NO_DEPRECATE',
+ ],
+ 'include_dirs': [
+ '<(DEPTH)/third_party/wtl/include',
+ ],
+ }], # OS==win
+ ], # conditions for 'target_defaults'
+ 'target_conditions': [
+ ['chromium_code==0', {
+ 'conditions': [
+ [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', {
+ # We don't want to get warnings from third-party code,
+ # so remove any existing warning-enabling flags like -Wall.
+ 'cflags!': [
+ '-Wall',
+ '-Wextra',
+ '-Werror',
+ ],
+ 'cflags': [
+ # Don't warn about hash_map in third-party code.
+ '-Wno-deprecated',
+ # Don't warn about printf format problems.
+ # This is off by default in gcc but on in Ubuntu's gcc(!).
+ '-Wno-format',
+ ],
+ }],
+ [ 'OS=="win"', {
+ 'defines': [
+ '_CRT_SECURE_NO_DEPRECATE',
+ '_CRT_NONSTDC_NO_WARNINGS',
+ '_CRT_NONSTDC_NO_DEPRECATE',
+ '_SCL_SECURE_NO_DEPRECATE',
+ ],
+ 'msvs_disabled_warnings': [4800],
+ 'msvs_settings': {
+ 'VCCLCompilerTool': {
+ 'WarnAsError': 'false',
+ 'Detect64BitPortabilityProblems': 'false',
+ },
+ },
+ }],
+ [ 'OS=="mac"', {
+ 'xcode_settings': {
+ 'GCC_TREAT_WARNINGS_AS_ERRORS': 'NO',
+ 'WARNING_CFLAGS!': ['-Wall', '-Wextra'],
+ },
+ }],
+ ],
+ }, {
+ # In Chromium code, we define __STDC_FORMAT_MACROS in order to get the
+ # C99 macros on Mac and Linux.
+ 'defines': [
+ '__STDC_FORMAT_MACROS',
+ ],
+ 'conditions': [
+ ['OS!="win"', {
+ 'sources/': [ ['exclude', '_win(_unittest)?\\.(h|cc)$'],
+ ['exclude', '(^|/)win/'],
+ ['exclude', '(^|/)win_[^/]*\\.(h|cc)$'] ],
+ }],
+ ['OS!="mac"', {
+ 'sources/': [ ['exclude', '_(cocoa|mac)(_unittest)?\\.(h|cc)$'],
+ ['exclude', '(^|/)(cocoa|mac)/'],
+ ['exclude', '\\.mm?$' ] ],
+ }],
+ ['OS!="linux" and OS!="freebsd" and OS!="openbsd"', {
+ 'sources/': [
+ ['exclude', '_(chromeos|gtk|x|x11|xdg)(_unittest)?\\.(h|cc)$'],
+ ['exclude', '(^|/)gtk/'],
+ ['exclude', '(^|/)(gtk|x11)_[^/]*\\.(h|cc)$'],
+ ],
+ }],
+ ['OS!="linux"', {
+ 'sources/': [
+ ['exclude', '_linux(_unittest)?\\.(h|cc)$'],
+ ['exclude', '(^|/)linux/'],
+ ],
+ }],
+ # We use "POSIX" to refer to all non-Windows operating systems.
+ ['OS=="win"', {
+ 'sources/': [ ['exclude', '_posix\\.(h|cc)$'] ],
+ # turn on warnings for signed/unsigned mismatch on chromium code.
+ 'msvs_settings': {
+ 'VCCLCompilerTool': {
+ 'AdditionalOptions': ['/we4389'],
+ },
+ },
+ }],
+ ['chromeos!=1', {
+ 'sources/': [ ['exclude', '_chromeos\\.(h|cc)$'] ]
+ }],
+ ['toolkit_views==0', {
+ 'sources/': [ ['exclude', '_views\\.(h|cc)$'] ]
+ }],
+ ],
+ }],
+ ], # target_conditions for 'target_defaults'
+ 'default_configuration': 'Debug',
+ 'configurations': {
+ # VCLinkerTool LinkIncremental values below:
+ # 0 == default
+ # 1 == /INCREMENTAL:NO
+ # 2 == /INCREMENTAL
+ # Debug links incremental, Release does not.
+ #
+ # Abstract base configurations to cover common attributes.
+ #
+ 'Common_Base': {
+ 'abstract': 1,
+ 'msvs_configuration_attributes': {
+ 'OutputDirectory': '$(SolutionDir)$(ConfigurationName)',
+ 'IntermediateDirectory': '$(OutDir)\\obj\\$(ProjectName)',
+ 'CharacterSet': '1',
+ },
+ },
+ 'x86_Base': {
+ 'abstract': 1,
+ 'msvs_settings': {
+ 'VCLinkerTool': {
+ 'TargetMachine': '1',
+ },
+ },
+ 'msvs_configuration_platform': 'Win32',
+ },
+ 'x64_Base': {
+ 'abstract': 1,
+ 'msvs_configuration_platform': 'x64',
+ 'msvs_settings': {
+ 'VCLinkerTool': {
+ 'TargetMachine': '17', # x86 - 64
+ 'AdditionalLibraryDirectories!':
+ ['<(DEPTH)/third_party/platformsdk_win7/files/Lib'],
+ 'AdditionalLibraryDirectories':
+ ['<(DEPTH)/third_party/platformsdk_win7/files/Lib/x64'],
+ },
+ 'VCLibrarianTool': {
+ 'AdditionalLibraryDirectories!':
+ ['<(DEPTH)/third_party/platformsdk_win7/files/Lib'],
+ 'AdditionalLibraryDirectories':
+ ['<(DEPTH)/third_party/platformsdk_win7/files/Lib/x64'],
+ },
+ },
+ 'defines': [
+ # Not sure if tcmalloc works on 64-bit Windows.
+ 'NO_TCMALLOC',
+ ],
+ },
+ 'Debug_Base': {
+ 'abstract': 1,
+ 'defines': [
+ 'DYNAMIC_ANNOTATIONS_ENABLED=1',
+ 'WTF_USE_DYNAMIC_ANNOTATIONS=1',
+ ],
+ 'xcode_settings': {
+ 'COPY_PHASE_STRIP': 'NO',
+ 'GCC_OPTIMIZATION_LEVEL': '<(mac_debug_optimization)',
+ 'OTHER_CFLAGS': [ '<@(debug_extra_cflags)', ],
+ },
+ 'msvs_settings': {
+ 'VCCLCompilerTool': {
+ 'Optimization': '<(win_debug_Optimization)',
+ 'PreprocessorDefinitions': ['_DEBUG'],
+ 'BasicRuntimeChecks': '<(win_debug_RuntimeChecks)',
+ 'RuntimeLibrary': '<(win_debug_RuntimeLibrary)',
+ 'conditions': [
+ # According to MSVS, InlineFunctionExpansion=0 means
+ # "default inlining", not "/Ob0".
+ # Thus, we have to handle InlineFunctionExpansion==0 separately.
+ ['win_debug_InlineFunctionExpansion==0', {
+ 'AdditionalOptions': ['/Ob0'],
+ }],
+ ['win_debug_InlineFunctionExpansion!=""', {
+ 'InlineFunctionExpansion':
+ '<(win_debug_InlineFunctionExpansion)',
+ }],
+ ['win_debug_disable_iterator_debugging==1', {
+ 'PreprocessorDefinitions': ['_HAS_ITERATOR_DEBUGGING=0'],
+ }],
+ ],
+ },
+ 'VCLinkerTool': {
+ 'LinkIncremental': '<(msvs_debug_link_incremental)',
+ },
+ 'VCResourceCompilerTool': {
+ 'PreprocessorDefinitions': ['_DEBUG'],
+ },
+ },
+ 'conditions': [
+ ['OS=="linux"', {
+ 'cflags': [
+ '<@(debug_extra_cflags)',
+ ],
+ }],
+ ],
+ },
+ 'Release_Base': {
+ 'abstract': 1,
+ 'defines': [
+ 'NDEBUG',
+ ],
+ 'xcode_settings': {
+ 'DEAD_CODE_STRIPPING': 'YES', # -Wl,-dead_strip
+ 'GCC_OPTIMIZATION_LEVEL': '<(mac_release_optimization)',
+ 'OTHER_CFLAGS': [ '<@(release_extra_cflags)', ],
+ },
+ 'msvs_settings': {
+ 'VCCLCompilerTool': {
+ 'Optimization': '<(win_release_Optimization)',
+ 'RuntimeLibrary': '<(win_release_RuntimeLibrary)',
+ 'conditions': [
+ # According to MSVS, InlineFunctionExpansion=0 means
+ # "default inlining", not "/Ob0".
+ # Thus, we have to handle InlineFunctionExpansion==0 separately.
+ ['win_release_InlineFunctionExpansion==0', {
+ 'AdditionalOptions': ['/Ob0'],
+ }],
+ ['win_release_InlineFunctionExpansion!=""', {
+ 'InlineFunctionExpansion':
+ '<(win_release_InlineFunctionExpansion)',
+ }],
+ ],
+ },
+ 'VCLinkerTool': {
+ 'LinkIncremental': '1',
+ },
+ },
+ 'conditions': [
+ ['release_valgrind_build==0', {
+ 'defines': [
+ 'NVALGRIND',
+ 'DYNAMIC_ANNOTATIONS_ENABLED=0',
+ ],
+ }, {
+ 'defines': [
+ 'DYNAMIC_ANNOTATIONS_ENABLED=1',
+ 'WTF_USE_DYNAMIC_ANNOTATIONS=1',
+ ],
+ }],
+ ['win_use_allocator_shim==0', {
+ 'defines': ['NO_TCMALLOC'],
+ }],
+ ['OS=="linux"', {
+ 'cflags': [
+ '<@(release_extra_cflags)',
+ ],
+ }],
+ ],
+ },
+ 'Purify_Base': {
+ 'abstract': 1,
+ 'defines': [
+ 'PURIFY',
+ 'NO_TCMALLOC',
+ ],
+ 'msvs_settings': {
+ 'VCCLCompilerTool': {
+ 'Optimization': '0',
+ 'RuntimeLibrary': '0',
+ 'BufferSecurityCheck': 'false',
+ },
+ 'VCLinkerTool': {
+ 'EnableCOMDATFolding': '1',
+ 'LinkIncremental': '1',
+ },
+ },
+ },
+ #
+ # Concrete configurations
+ #
+ 'Debug': {
+ 'inherit_from': ['Common_Base', 'x86_Base', 'Debug_Base'],
+ },
+ 'Release': {
+ 'inherit_from': ['Common_Base', 'x86_Base', 'Release_Base'],
+ 'conditions': [
+ ['msvs_use_common_release', {
+ 'includes': ['release.gypi'],
+ }],
+ ]
+ },
+ 'conditions': [
+ [ 'OS=="win"', {
+ # TODO(bradnelson): add a gyp mechanism to make this more graceful.
+ 'Purify': {
+ 'inherit_from': ['Common_Base', 'x86_Base', 'Release_Base', 'Purify'],
+ },
+ 'Debug_x64': {
+ 'inherit_from': ['Common_Base', 'x64_Base', 'Debug_Base'],
+ },
+ 'Release_x64': {
+ 'inherit_from': ['Common_Base', 'x64_Base', 'Release_Base'],
+ },
+ 'Purify_x64': {
+ 'inherit_from': ['Common_Base', 'x64_Base', 'Release_Base', 'Purify_Base'],
+ },
+ }],
+ ],
+ },
+ },
+ 'conditions': [
+ ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris"', {
+ 'target_defaults': {
+ # Enable -Werror by default, but put it in a variable so it can
+ # be disabled in ~/.gyp/include.gypi on the valgrind builders.
+ 'variables': {
+ # Use -fno-strict-aliasing by default since gcc 4.4 has periodic
+ # issues that slip through the cracks. We could do this just for
+ # gcc 4.4 but it makes more sense to be consistent on all
+ # compilers in use. TODO(Craig): turn this off again when
+ # there is some 4.4 test infrastructure in place and existing
+ # aliasing issues have been fixed.
+ 'no_strict_aliasing%': 1,
+ 'conditions': [['OS=="linux"', {'werror%': '-Werror',}],
+ ['OS=="freebsd"', {'werror%': '',}],
+ ['OS=="openbsd"', {'werror%': '',}],
+ ],
+ },
+ 'cflags': [
+ '<(werror)', # See note above about the werror variable.
+ '-pthread',
+ '-fno-exceptions',
+ '-Wall',
+ # TODO(evan): turn this back on once all the builds work.
+ # '-Wextra',
+ # Don't warn about unused function params. We use those everywhere.
+ '-Wno-unused-parameter',
+ # Don't warn about the "struct foo f = {0};" initialization pattern.
+ '-Wno-missing-field-initializers',
+ '-D_FILE_OFFSET_BITS=64',
+ # Don't export any symbols (for example, to plugins we dlopen()).
+ # Note: this is *required* to make some plugins work.
+ '-fvisibility=hidden',
+ '-pipe',
+ ],
+ 'cflags_cc': [
+ '-fno-rtti',
+ '-fno-threadsafe-statics',
+ # Make inline functions have hidden visiblity by default.
+ # Surprisingly, not covered by -fvisibility=hidden.
+ '-fvisibility-inlines-hidden',
+ ],
+ 'ldflags': [
+ '-pthread', '-Wl,-z,noexecstack',
+ ],
+ 'configurations': {
+ 'Debug_Base': {
+ 'variables': {
+ 'debug_optimize%': '0',
+ },
+ 'defines': [
+ '_DEBUG',
+ ],
+ 'cflags': [
+ '-O>(debug_optimize)',
+ '-g',
+ ],
+ },
+ 'Release_Base': {
+ 'variables': {
+ 'release_optimize%': '2',
+ # Binaries become big and gold is unable to perform GC
+ # and remove unused sections for some of test targets
+ # on 32 bit platform.
+ # (This is currently observed only in chromeos valgrind bots)
+ # The following flag is to disable --gc-sections linker
+ # option for these bots.
+ 'no_gc_sections%': 0,
+ },
+ 'cflags': [
+ '-O>(release_optimize)',
+ # Don't emit the GCC version ident directives, they just end up
+ # in the .comment section taking up binary size.
+ '-fno-ident',
+ # Put data and code in their own sections, so that unused symbols
+ # can be removed at link time with --gc-sections.
+ '-fdata-sections',
+ '-ffunction-sections',
+ ],
+ 'ldflags': [
+ # Specifically tell the linker to perform optimizations.
+ # See http://lwn.net/Articles/192624/ .
+ '-Wl,-O1',
+ '-Wl,--as-needed',
+ ],
+ 'conditions' : [
+ ['no_gc_sections==0', {
+ 'ldflags': [
+ '-Wl,--gc-sections',
+ ],
+ }],
+ ['clang==1', {
+ 'cflags!': [
+ '-fno-ident',
+ ],
+ }],
+ ['profiling==1', {
+ 'cflags': [
+ '-fno-omit-frame-pointer',
+ '-g',
+ ],
+ }],
+ ]
+ },
+ },
+ 'variants': {
+ 'coverage': {
+ 'cflags': ['-fprofile-arcs', '-ftest-coverage'],
+ 'ldflags': ['-fprofile-arcs'],
+ },
+ 'profile': {
+ 'cflags': ['-pg', '-g'],
+ 'ldflags': ['-pg'],
+ },
+ 'symbols': {
+ 'cflags': ['-g'],
+ },
+ },
+ 'conditions': [
+ [ 'target_arch=="ia32"', {
+ 'asflags': [
+ # Needed so that libs with .s files (e.g. libicudata.a)
+ # are compatible with the general 32-bit-ness.
+ '-32',
+ ],
+ # All floating-point computations on x87 happens in 80-bit
+ # precision. Because the C and C++ language standards allow
+ # the compiler to keep the floating-point values in higher
+ # precision than what's specified in the source and doing so
+ # is more efficient than constantly rounding up to 64-bit or
+ # 32-bit precision as specified in the source, the compiler,
+ # especially in the optimized mode, tries very hard to keep
+ # values in x87 floating-point stack (in 80-bit precision)
+ # as long as possible. This has important side effects, that
+ # the real value used in computation may change depending on
+ # how the compiler did the optimization - that is, the value
+ # kept in 80-bit is different than the value rounded down to
+ # 64-bit or 32-bit. There are possible compiler options to make
+ # this behavior consistent (e.g. -ffloat-store would keep all
+ # floating-values in the memory, thus force them to be rounded
+ # to its original precision) but they have significant runtime
+ # performance penalty.
+ #
+ # -mfpmath=sse -msse2 makes the compiler use SSE instructions
+ # which keep floating-point values in SSE registers in its
+ # native precision (32-bit for single precision, and 64-bit for
+ # double precision values). This means the floating-point value
+ # used during computation does not change depending on how the
+ # compiler optimized the code, since the value is always kept
+ # in its specified precision.
+ 'conditions': [
+ ['branding=="Chromium" and disable_sse2==0', {
+ 'cflags': [
+ '-march=pentium4',
+ '-msse2',
+ '-mfpmath=sse',
+ ],
+ }],
+ # ChromeOS targets Pinetrail, which is sse3, but most of the
+ # benefit comes from sse2 so this setting allows ChromeOS
+ # to build on other CPUs. In the future -march=atom would help
+ # but requires a newer compiler.
+ ['chromeos==1 and disable_sse2==0', {
+ 'cflags': [
+ '-msse2',
+ ],
+ }],
+ # Install packages have started cropping up with
+ # different headers between the 32-bit and 64-bit
+ # versions, so we have to shadow those differences off
+ # and make sure a 32-bit-on-64-bit build picks up the
+ # right files.
+ ['host_arch!="ia32"', {
+ 'include_dirs+': [
+ '/usr/include32',
+ ],
+ }],
+ ],
+ # -mmmx allows mmintrin.h to be used for mmx intrinsics.
+ # video playback is mmx and sse2 optimized.
+ 'cflags': [
+ '-m32',
+ '-mmmx',
+ ],
+ 'ldflags': [
+ '-m32',
+ ],
+ }],
+ ['target_arch=="arm"', {
+ 'target_conditions': [
+ ['_toolset=="target"', {
+ 'cflags_cc': [
+ # The codesourcery arm-2009q3 toolchain warns at that the ABI
+ # has changed whenever it encounters a varargs function. This
+ # silences those warnings, as they are not helpful and
+ # clutter legitimate warnings.
+ '-Wno-abi',
+ ],
+ 'conditions': [
+ ['arm_thumb == 1', {
+ 'cflags': [
+ '-mthumb',
+ # TODO(piman): -Wa,-mimplicit-it=thumb is needed for
+ # inline assembly that uses condition codes but it's
+ # suboptimal. Better would be to #ifdef __thumb__ at the
+ # right place and have a separate thumb path.
+ '-Wa,-mimplicit-it=thumb',
+ ]
+ }],
+ ['armv7==1', {
+ 'cflags': [
+ '-march=armv7-a',
+ '-mtune=cortex-a8',
+ '-mfloat-abi=softfp',
+ ],
+ 'conditions': [
+ ['arm_neon==1', {
+ 'cflags': [ '-mfpu=neon', ],
+ }, {
+ 'cflags': [ '-mfpu=<(arm_fpu)', ],
+ }]
+ ],
+ }],
+ ],
+ }],
+ ],
+ }],
+ ['linux_fpic==1', {
+ 'cflags': [
+ '-fPIC',
+ ],
+ }],
+ ['sysroot!=""', {
+ 'target_conditions': [
+ ['_toolset=="target"', {
+ 'cflags': [
+ '--sysroot=<(sysroot)',
+ ],
+ 'ldflags': [
+ '--sysroot=<(sysroot)',
+ ],
+ }]]
+ }],
+ ['clang==1', {
+ 'target_conditions': [
+ ['_toolset=="target"', {
+ 'cflags': [
+ '-Wheader-hygiene',
+ # Clang spots more unused functions.
+ '-Wno-unused-function',
+ # Don't die on dtoa code that uses a char as an array index.
+ '-Wno-char-subscripts',
+ # Survive EXPECT_EQ(unnamed_enum, unsigned int) -- see
+ # http://code.google.com/p/googletest/source/detail?r=446 .
+ # TODO(thakis): Use -isystem instead (http://crbug.com/58751 )
+ '-Wno-unnamed-type-template-args',
+ ],
+ 'cflags!': [
+ # Clang doesn't seem to know know this flag.
+ '-mfpmath=sse',
+ ],
+ }]],
+ }],
+ ['clang==1 and clang_use_chrome_plugins==1', {
+ 'target_conditions': [
+ ['_toolset=="target"', {
+ 'cflags': [
+ '<(clang_chrome_plugins_flags)',
+ ],
+ }]],
+ }],
+ ['clang==1 and clang_load!="" and clang_add_plugin!=""', {
+ 'target_conditions': [
+ ['_toolset=="target"', {
+ 'cflags': [
+ '-Xclang', '-load', '-Xclang', '<(clang_load)',
+ '-Xclang', '-add-plugin', '-Xclang', '<(clang_add_plugin)',
+ ],
+ }]],
+ }],
+ ['no_strict_aliasing==1', {
+ 'cflags': [
+ '-fno-strict-aliasing',
+ ],
+ }],
+ ['linux_breakpad==1', {
+ 'cflags': [ '-g' ],
+ 'defines': ['USE_LINUX_BREAKPAD'],
+ }],
+ ['library=="shared_library"', {
+ # When building with shared libraries, remove the visiblity-hiding
+ # flag.
+ 'cflags!': [ '-fvisibility=hidden' ],
+ 'conditions': [
+ ['target_arch=="x64" or target_arch=="arm"', {
+ # Shared libraries need -fPIC on x86-64 and arm
+ 'cflags': ['-fPIC']
+ }]
+ ],
+ 'ldflags!': [
+ # --as-needed confuses library interdependencies.
+ # See http://code.google.com/p/chromium/issues/detail?id=61430
+ '-Wl,--as-needed',
+ ],
+ }],
+ ['linux_use_heapchecker==1', {
+ 'variables': {'linux_use_tcmalloc%': 1},
+ }],
+ ['linux_use_tcmalloc==0', {
+ 'defines': ['NO_TCMALLOC'],
+ }],
+ ['linux_use_heapchecker==0', {
+ 'defines': ['NO_HEAPCHECKER'],
+ }],
+ ['linux_keep_shadow_stacks==1', {
+ 'defines': ['KEEP_SHADOW_STACKS'],
+ 'cflags': ['-finstrument-functions'],
+ }],
+ ],
+ },
+ }],
+ # FreeBSD-specific options; note that most FreeBSD options are set above,
+ # with Linux.
+ ['OS=="freebsd"', {
+ 'target_defaults': {
+ 'ldflags': [
+ '-Wl,--no-keep-memory',
+ ],
+ },
+ }],
+ ['OS=="solaris"', {
+ 'cflags!': ['-fvisibility=hidden'],
+ 'cflags_cc!': ['-fvisibility-inlines-hidden'],
+ }],
+ ['OS=="mac"', {
+ 'target_defaults': {
+ 'variables': {
+ # These should be 'mac_real_dsym%' and 'mac_strip%', but there
+ # seems to be a bug with % in variables that are intended to be
+ # set to different values in different targets, like these two.
+ 'mac_strip': 1, # Strip debugging symbols from the target.
+ 'mac_real_dsym': 0, # Fake .dSYMs are fine in most cases.
+ },
+ 'mac_bundle': 0,
+ 'xcode_settings': {
+ 'ALWAYS_SEARCH_USER_PATHS': 'NO',
+ 'GCC_C_LANGUAGE_STANDARD': 'c99', # -std=c99
+ 'GCC_CW_ASM_SYNTAX': 'NO', # No -fasm-blocks
+ 'GCC_DYNAMIC_NO_PIC': 'NO', # No -mdynamic-no-pic
+ # (Equivalent to -fPIC)
+ 'GCC_ENABLE_CPP_EXCEPTIONS': 'NO', # -fno-exceptions
+ 'GCC_ENABLE_CPP_RTTI': 'NO', # -fno-rtti
+ 'GCC_ENABLE_PASCAL_STRINGS': 'NO', # No -mpascal-strings
+ # GCC_INLINES_ARE_PRIVATE_EXTERN maps to -fvisibility-inlines-hidden
+ 'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES',
+ 'GCC_OBJC_CALL_CXX_CDTORS': 'YES', # -fobjc-call-cxx-cdtors
+ 'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden
+ 'GCC_THREADSAFE_STATICS': 'NO', # -fno-threadsafe-statics
+ 'GCC_TREAT_WARNINGS_AS_ERRORS': 'YES', # -Werror
+ 'GCC_VERSION': '4.2',
+ 'GCC_WARN_ABOUT_MISSING_NEWLINE': 'YES', # -Wnewline-eof
+ # MACOSX_DEPLOYMENT_TARGET maps to -mmacosx-version-min
+ 'MACOSX_DEPLOYMENT_TARGET': '<(mac_deployment_target)',
+ 'PREBINDING': 'NO', # No -Wl,-prebind
+ 'USE_HEADERMAP': 'NO',
+ 'WARNING_CFLAGS': [
+ '-Wall',
+ '-Wendif-labels',
+ '-Wextra',
+ # Don't warn about unused function parameters.
+ '-Wno-unused-parameter',
+ # Don't warn about the "struct foo f = {0};" initialization
+ # pattern.
+ '-Wno-missing-field-initializers',
+ ],
+ 'conditions': [
+ ['chromium_mac_pch', {'GCC_PRECOMPILE_PREFIX_HEADER': 'YES'},
+ {'GCC_PRECOMPILE_PREFIX_HEADER': 'NO'}
+ ],
+ ['clang==1', {
+ 'WARNING_CFLAGS': [
+ '-Wheader-hygiene',
+ # Don't die on dtoa code that uses a char as an array index.
+ # This is required solely for base/third_party/dmg_fp/dtoa.cc.
+ '-Wno-char-subscripts',
+ # Clang spots more unused functions.
+ '-Wno-unused-function',
+ # Survive EXPECT_EQ(unnamed_enum, unsigned int) -- see
+ # http://code.google.com/p/googletest/source/detail?r=446 .
+ # TODO(thakis): Use -isystem instead (http://crbug.com/58751 ).
+ '-Wno-unnamed-type-template-args',
+ ],
+ 'OTHER_CFLAGS': [
+ # TODO(thakis): Causes many warnings - http://crbug.com/75001
+ '-fobjc-exceptions',
+ ],
+ }],
+ ['clang==1 and clang_use_chrome_plugins==1', {
+ 'OTHER_CFLAGS': [
+ '<(clang_chrome_plugins_flags)',
+ ],
+ }],
+ ['clang==1 and clang_load!="" and clang_add_plugin!=""', {
+ 'OTHER_CFLAGS': [
+ '-Xclang', '-load', '-Xclang', '<(clang_load)',
+ '-Xclang', '-add-plugin', '-Xclang', '<(clang_add_plugin)',
+ ],
+ }],
+ ],
+ },
+ 'target_conditions': [
+ ['_type!="static_library"', {
+ 'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-search_paths_first']},
+ }],
+ ['_mac_bundle', {
+ 'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-ObjC']},
+ }],
+ ['(_type=="executable" or _type=="shared_library" or \
+ _type=="loadable_module") and mac_strip!=0', {
+ 'target_conditions': [
+ ['mac_real_dsym == 1', {
+ # To get a real .dSYM bundle produced by dsymutil, set the
+ # debug information format to dwarf-with-dsym. Since
+ # strip_from_xcode will not be used, set Xcode to do the
+ # stripping as well.
+ 'configurations': {
+ 'Release_Base': {
+ 'xcode_settings': {
+ 'DEBUG_INFORMATION_FORMAT': 'dwarf-with-dsym',
+ 'DEPLOYMENT_POSTPROCESSING': 'YES',
+ 'STRIP_INSTALLED_PRODUCT': 'YES',
+ 'target_conditions': [
+ ['_type=="shared_library" or _type=="loadable_module"', {
+ # The Xcode default is to strip debugging symbols
+ # only (-S). Local symbols should be stripped as
+ # well, which will be handled by -x. Xcode will
+ # continue to insert -S when stripping even when
+ # additional flags are added with STRIPFLAGS.
+ 'STRIPFLAGS': '-x',
+ }], # _type=="shared_library" or _type=="loadable_module"'
+ ], # target_conditions
+ }, # xcode_settings
+ }, # configuration "Release"
+ }, # configurations
+ }, { # mac_real_dsym != 1
+ # To get a fast fake .dSYM bundle, use a post-build step to
+ # produce the .dSYM and strip the executable. strip_from_xcode
+ # only operates in the Release configuration.
+ 'postbuilds': [
+ {
+ 'variables': {
+ # Define strip_from_xcode in a variable ending in _path
+ # so that gyp understands it's a path and performs proper
+ # relativization during dict merging.
+ 'strip_from_xcode_path': 'mac/strip_from_xcode',
+ },
+ 'postbuild_name': 'Strip If Needed',
+ 'action': ['<(strip_from_xcode_path)'],
+ },
+ ], # postbuilds
+ }], # mac_real_dsym
+ ], # target_conditions
+ }], # (_type=="executable" or _type=="shared_library" or
+ # _type=="loadable_module") and mac_strip!=0
+ ], # target_conditions
+ }, # target_defaults
+ }], # OS=="mac"
+ ['OS=="win"', {
+ 'target_defaults': {
+ 'defines': [
+ '_WIN32_WINNT=0x0600',
+ 'WINVER=0x0600',
+ 'WIN32',
+ '_WINDOWS',
+ 'NOMINMAX',
+ '_CRT_RAND_S',
+ 'CERT_CHAIN_PARA_HAS_EXTRA_FIELDS',
+ 'WIN32_LEAN_AND_MEAN',
+ '_ATL_NO_OPENGL',
+ '_HAS_TR1=0',
+ ],
+ 'conditions': [
+ ['component=="static_library"', {
+ 'defines': [
+ '_HAS_EXCEPTIONS=0',
+ ],
+ }],
+ ['secure_atl', {
+ 'defines': [
+ '_SECURE_ATL',
+ ],
+ }],
+ ],
+ 'msvs_system_include_dirs': [
+ '<(DEPTH)/third_party/platformsdk_win7/files/Include',
+ '<(DEPTH)/third_party/directxsdk/files/Include',
+ '$(VSInstallDir)/VC/atlmfc/include',
+ ],
+ 'msvs_cygwin_dirs': ['<(DEPTH)/third_party/cygwin'],
+ 'msvs_disabled_warnings': [4351, 4396, 4503, 4819],
+ 'msvs_settings': {
+ 'VCCLCompilerTool': {
+ 'MinimalRebuild': 'false',
+ 'BufferSecurityCheck': 'true',
+ 'EnableFunctionLevelLinking': 'true',
+ 'RuntimeTypeInfo': 'false',
+ 'WarningLevel': '3',
+ 'WarnAsError': 'true',
+ 'DebugInformationFormat': '3',
+ 'conditions': [
+ ['msvs_multi_core_compile', {
+ 'AdditionalOptions': ['/MP'],
+ }],
+ ['MSVS_VERSION=="2005e"', {
+ 'AdditionalOptions': ['/w44068'], # Unknown pragma to 4 (ATL)
+ }],
+ ['component=="shared_library"', {
+ 'ExceptionHandling': '1', # /EHsc
+ }, {
+ 'ExceptionHandling': '0',
+ }],
+ ],
+ },
+ 'VCLibrarianTool': {
+ 'AdditionalOptions': ['/ignore:4221'],
+ 'AdditionalLibraryDirectories': [
+ '<(DEPTH)/third_party/platformsdk_win7/files/Lib',
+ '<(DEPTH)/third_party/directxsdk/files/Lib/x86',
+ ],
+ },
+ 'VCLinkerTool': {
+ 'AdditionalDependencies': [
+ 'wininet.lib',
+ 'dnsapi.lib',
+ 'version.lib',
+ 'msimg32.lib',
+ 'ws2_32.lib',
+ 'usp10.lib',
+ 'psapi.lib',
+ 'dbghelp.lib',
+ ],
+ 'conditions': [
+ ['msvs_express', {
+ # Explicitly required when using the ATL with express
+ 'AdditionalDependencies': [
+ 'atlthunk.lib',
+ ],
+ }],
+ ['MSVS_VERSION=="2005e"', {
+ # Non-express versions link automatically to these
+ 'AdditionalDependencies': [
+ 'advapi32.lib',
+ 'comdlg32.lib',
+ 'ole32.lib',
+ 'shell32.lib',
+ 'user32.lib',
+ 'winspool.lib',
+ ],
+ }],
+ ],
+ 'AdditionalLibraryDirectories': [
+ '<(DEPTH)/third_party/platformsdk_win7/files/Lib',
+ '<(DEPTH)/third_party/directxsdk/files/Lib/x86',
+ ],
+ 'GenerateDebugInformation': 'true',
+ 'MapFileName': '$(OutDir)\\$(TargetName).map',
+ 'ImportLibrary': '$(OutDir)\\lib\\$(TargetName).lib',
+ 'FixedBaseAddress': '1',
+ # SubSystem values:
+ # 0 == not set
+ # 1 == /SUBSYSTEM:CONSOLE
+ # 2 == /SUBSYSTEM:WINDOWS
+ # Most of the executables we'll ever create are tests
+ # and utilities with console output.
+ 'SubSystem': '1',
+ },
+ 'VCMIDLTool': {
+ 'GenerateStublessProxies': 'true',
+ 'TypeLibraryName': '$(InputName).tlb',
+ 'OutputDirectory': '$(IntDir)',
+ 'HeaderFileName': '$(InputName).h',
+ 'DLLDataFileName': 'dlldata.c',
+ 'InterfaceIdentifierFileName': '$(InputName)_i.c',
+ 'ProxyFileName': '$(InputName)_p.c',
+ },
+ 'VCResourceCompilerTool': {
+ 'Culture' : '1033',
+ 'AdditionalIncludeDirectories': [
+ '<(DEPTH)',
+ '<(SHARED_INTERMEDIATE_DIR)',
+ ],
+ },
+ },
+ },
+ }],
+ ['disable_nacl==1 or OS=="freebsd" or OS=="openbsd" or OS=="solaris"', {
+ 'target_defaults': {
+ 'defines': [
+ 'DISABLE_NACL',
+ ],
+ },
+ }],
+ ['OS=="win" and msvs_use_common_linker_extras', {
+ 'target_defaults': {
+ 'msvs_settings': {
+ 'VCLinkerTool': {
+ 'DelayLoadDLLs': [
+ 'dbghelp.dll',
+ 'dwmapi.dll',
+ 'uxtheme.dll',
+ ],
+ },
+ },
+ 'configurations': {
+ 'x86_Base': {
+ 'msvs_settings': {
+ 'VCLinkerTool': {
+ 'AdditionalOptions': [
+ '/safeseh',
+ '/dynamicbase',
+ '/ignore:4199',
+ '/ignore:4221',
+ '/nxcompat',
+ ],
+ },
+ },
+ },
+ 'x64_Base': {
+ 'msvs_settings': {
+ 'VCLinkerTool': {
+ 'AdditionalOptions': [
+ # safeseh is not compatible with x64
+ '/dynamicbase',
+ '/ignore:4199',
+ '/ignore:4221',
+ '/nxcompat',
+ ],
+ },
+ },
+ },
+ },
+ },
+ }],
+ ['enable_new_npdevice_api==1', {
+ 'target_defaults': {
+ 'defines': [
+ 'ENABLE_NEW_NPDEVICE_API',
+ ],
+ },
+ }],
+ ],
+ 'xcode_settings': {
+ # DON'T ADD ANYTHING NEW TO THIS BLOCK UNLESS YOU REALLY REALLY NEED IT!
+ # This block adds *project-wide* configuration settings to each project
+ # file. It's almost always wrong to put things here. Specify your
+ # custom xcode_settings in target_defaults to add them to targets instead.
+
+ # In an Xcode Project Info window, the "Base SDK for All Configurations"
+ # setting sets the SDK on a project-wide basis. In order to get the
+ # configured SDK to show properly in the Xcode UI, SDKROOT must be set
+ # here at the project level.
+ 'SDKROOT': 'macosx<(mac_sdk)', # -isysroot
+
+ # The Xcode generator will look for an xcode_settings section at the root
+ # of each dict and use it to apply settings on a file-wide basis. Most
+ # settings should not be here, they should be in target-specific
+ # xcode_settings sections, or better yet, should use non-Xcode-specific
+ # settings in target dicts. SYMROOT is a special case, because many other
+ # Xcode variables depend on it, including variables such as
+ # PROJECT_DERIVED_FILE_DIR. When a source group corresponding to something
+ # like PROJECT_DERIVED_FILE_DIR is added to a project, in order for the
+ # files to appear (when present) in the UI as actual files and not red
+ # red "missing file" proxies, the correct path to PROJECT_DERIVED_FILE_DIR,
+ # and therefore SYMROOT, needs to be set at the project level.
+ 'SYMROOT': '<(DEPTH)/xcodebuild',
+ },
+}
+
+# Local Variables:
+# tab-width:2
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/build/compiler_version.py b/build/compiler_version.py
new file mode 100755
index 0000000..69f0a50
--- /dev/null
+++ b/build/compiler_version.py
@@ -0,0 +1,50 @@
+#!/usr/bin/python
+
+# Copyright (c) 2009 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.
+
+"""Compiler version checking tool for gcc
+
+Print gcc version as XY if you are running gcc X.Y.*.
+This is used to tweak build flags for gcc 4.4.
+"""
+
+import os
+import re
+import subprocess
+import sys
+
+def GetVersion(compiler):
+ try:
+ # Note that compiler could be something tricky like "distcc g++".
+ compiler = compiler + " -dumpversion"
+ pipe = subprocess.Popen(compiler, stdout=subprocess.PIPE, shell=True)
+ gcc_output = pipe.communicate()[0]
+ result = re.match(r"(\d+)\.(\d+)", gcc_output)
+ return result.group(1) + result.group(2)
+ except Exception, e:
+ print >> sys.stderr, "compiler_version.py failed to execute:", compiler
+ print >> sys.stderr, e
+ return ""
+
+def main():
+ # Check if CXX environment variable exists and
+ # if it does use that compiler.
+ cxx = os.getenv("CXX", None)
+ if cxx:
+ cxxversion = GetVersion(cxx)
+ if cxxversion != "":
+ print cxxversion
+ return 0
+ else:
+ # Otherwise we check the g++ version.
+ gccversion = GetVersion("g++")
+ if gccversion != "":
+ print gccversion
+ return 0
+
+ return 1
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/build/dir_exists.py b/build/dir_exists.py
new file mode 100644
index 0000000..d1c194f
--- /dev/null
+++ b/build/dir_exists.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python
+# Copyright (c) 2009 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.
+
+import os.path
+import sys
+
+sys.stdout.write(str(os.path.isdir(sys.argv[1])))
+sys.exit(0)
diff --git a/build/extract_from_cab.py b/build/extract_from_cab.py
new file mode 100644
index 0000000..fd99184
--- /dev/null
+++ b/build/extract_from_cab.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python
+# Copyright (c) 2009 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.
+
+# Extracts a single file from a CAB archive.
+
+import os
+import subprocess
+import sys
+
+if len(sys.argv) != 4:
+ print 'Usage: extract_from_cab.py cab_path archived_file output_dir'
+ sys.exit(1)
+
+[cab_path, archived_file, output_dir] = sys.argv[1:]
+
+# Invoke the Windows expand utility to extract the file.
+level = subprocess.call(['expand', cab_path, '-F:' + archived_file, output_dir])
+if level != 0:
+ sys.exit(level)
+
+# The expand utility preserves the modification date and time of the archived
+# file. Touch the extracted file. This helps build systems that compare the
+# modification times of input and output files to determine whether to do an
+# action.
+os.utime(os.path.join(output_dir, archived_file), None)
diff --git a/build/features_override.gypi b/build/features_override.gypi
new file mode 100644
index 0000000..64b90ca
--- /dev/null
+++ b/build/features_override.gypi
@@ -0,0 +1,119 @@
+# Copyright (c) 2009 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.
+
+# This file is only included in full-chromium builds, and overrides the
+# feature_defines variable in
+# third_party/WebKit/Source/WebKit/chromium/features.gypi.
+{
+ 'variables': {
+ # WARNING: This list of strings completely replaces the list in
+ # features.gypi. Therefore, if an enable is listed in features.gypi
+ # but not listed below, it will revert to its hardcoded webkit value.
+ 'feature_defines': [
+ 'ENABLE_3D_PLUGIN=1',
+ 'ENABLE_BLOB=1',
+ 'ENABLE_BLOB_SLICE=1',
+ 'ENABLE_CHANNEL_MESSAGING=1',
+ 'ENABLE_CLIENT_BASED_GEOLOCATION=1',
+ 'ENABLE_DASHBOARD_SUPPORT=0',
+ 'ENABLE_DATABASE=1',
+ 'ENABLE_DATAGRID=0',
+ 'ENABLE_DATA_TRANSFER_ITEMS=1',
+ 'ENABLE_DEVICE_ORIENTATION=1',
+ 'ENABLE_DIRECTORY_UPLOAD=1',
+ 'ENABLE_DOM_STORAGE=1',
+ 'ENABLE_EVENTSOURCE=1',
+ 'ENABLE_JAVASCRIPT_I18N_API=1',
+ 'ENABLE_FILE_SYSTEM=1',
+ 'ENABLE_FILTERS=1',
+ 'ENABLE_GEOLOCATION=1',
+ 'ENABLE_ICONDATABASE=0',
+ 'ENABLE_INDEXED_DATABASE=1',
+ 'ENABLE_INPUT_SPEECH=1',
+ 'ENABLE_JAVASCRIPT_DEBUGGER=1',
+ 'ENABLE_JSC_MULTIPLE_THREADS=0',
+ 'ENABLE_LEVELDB=0',
+ 'ENABLE_LINK_PREFETCH=1',
+ 'ENABLE_METER_TAG=1',
+ 'ENABLE_MEDIA_STATISTICS=1',
+ 'ENABLE_MEDIA_STREAM=1',
+ 'ENABLE_NOTIFICATIONS=1',
+ 'ENABLE_OFFLINE_WEB_APPLICATIONS=1',
+ 'ENABLE_OPENTYPE_SANITIZER=1',
+ 'ENABLE_ORIENTATION_EVENTS=0',
+ 'ENABLE_PROGRESS_TAG=1',
+ 'ENABLE_REQUEST_ANIMATION_FRAME=1',
+ 'ENABLE_RUBY=1',
+ 'ENABLE_SANDBOX=1',
+ 'ENABLE_SHARED_WORKERS=1',
+ 'ENABLE_SKIA_GPU=<(use_skia_gpu)',
+ 'ENABLE_SVG=<(enable_svg)',
+ 'ENABLE_SVG_ANIMATION=<(enable_svg)',
+ 'ENABLE_SVG_AS_IMAGE=<(enable_svg)',
+ 'ENABLE_SVG_FONTS=<(enable_svg)',
+ 'ENABLE_SVG_FOREIGN_OBJECT=<(enable_svg)',
+ 'ENABLE_SVG_USE=<(enable_svg)',
+ 'ENABLE_TOUCH_EVENTS=<(enable_touch_events)',
+ 'ENABLE_V8_SCRIPT_DEBUG_SERVER=1',
+ 'ENABLE_VIDEO=1',
+ 'ENABLE_WEB_SOCKETS=1',
+ 'ENABLE_WEB_TIMING=1',
+ 'ENABLE_WEBGL=1',
+ 'ENABLE_WORKERS=1',
+ 'ENABLE_XHR_RESPONSE_BLOB=1',
+ 'ENABLE_XPATH=1',
+ 'ENABLE_XSLT=1',
+ 'WTF_USE_BUILTIN_UTF8_CODEC=1',
+ # WTF_USE_DYNAMIC_ANNOTATIONS=1 may be defined in build/common.gypi
+ # We can't define it here because it should be present only
+ # in Debug or release_valgrind_build=1 builds.
+ 'WTF_USE_WEBP=1',
+ 'WTF_USE_WEBKIT_IMAGE_DECODERS=1',
+ ],
+ # We have to nest variables inside variables so that they can be overridden
+ # through GYP_DEFINES.
+ 'variables': {
+ 'use_accelerated_compositing%': 1,
+ 'use_threaded_compositing%': 0,
+ 'enable_svg%': 1,
+ 'enable_touch_events%': 1,
+ 'use_skia_gpu%': 0,
+ },
+ 'use_accelerated_compositing%': '<(use_accelerated_compositing)',
+ 'use_threaded_compositing%': '<(use_threaded_compositing)',
+ 'enable_svg%': '<(enable_svg)',
+ 'enable_touch_events%': '<(enable_touch_events)',
+ 'conditions': [
+ ['(OS=="win" or OS=="linux" or OS=="mac") and use_accelerated_compositing==1', {
+ 'feature_defines': [
+ 'WTF_USE_ACCELERATED_COMPOSITING=1',
+ 'ENABLE_3D_RENDERING=1',
+ 'ENABLE_ACCELERATED_2D_CANVAS=1',
+ ],
+ 'use_accelerated_compositing': 1,
+ }],
+ ['use_accelerated_compositing==1 and use_threaded_compositing==1', {
+ 'feature_defines': [
+ 'WTF_USE_THREADED_COMPOSITING=1',
+ ],
+ 'use_threaded_compositing': 1,
+ }],
+ ['OS=="mac"', {
+ 'feature_defines': [
+ 'ENABLE_WEB_AUDIO=1',
+ ],
+ }],
+ ],
+ # TODO: If the need arises, create a mechanism that will intelligently
+ # merge the lists rather than replace one with the other. This may
+ # require changes in gyp.
+ },
+
+}
+
+# Local Variables:
+# tab-width:2
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/build/grit_action.gypi b/build/grit_action.gypi
new file mode 100644
index 0000000..041d704
--- /dev/null
+++ b/build/grit_action.gypi
@@ -0,0 +1,39 @@
+# Copyright (c) 2011 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.
+
+# This file is meant to be included into an action to invoke grit in a
+# consistent manner. To use this the following variables need to be
+# defined:
+# grit_grd_file: string: grd file path
+# grit_out_dir: string: the output directory path
+
+# It would be really nice to do this with a rule instead of actions, but it
+# would need to determine inputs and outputs via grit_info on a per-file
+# basis. GYP rules don’t currently support that. They could be extended to
+# do this, but then every generator would need to be updated to handle this.
+
+{
+ 'variables': {
+ 'grit_info_cmd': ['python', '<(DEPTH)/tools/grit/grit_info.py',
+ '<@(grit_defines)'],
+ 'grit_cmd': ['python', '<(DEPTH)/tools/grit/grit.py'],
+ },
+ 'inputs': [
+ '<!@(<(grit_info_cmd) --inputs <(grit_grd_file))',
+ ],
+ 'outputs': [
+ '<!@(<(grit_info_cmd) --outputs \'<(grit_out_dir)\' <(grit_grd_file))',
+ ],
+ 'action': ['<@(grit_cmd)',
+ '-i', '<(grit_grd_file)', 'build',
+ '-o', '<(grit_out_dir)',
+ '<@(grit_defines)' ],
+ 'message': 'Generating resources from <(grit_grd_file)',
+}
+
+# Local Variables:
+# tab-width:2
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/build/grit_target.gypi b/build/grit_target.gypi
new file mode 100644
index 0000000..5912d48
--- /dev/null
+++ b/build/grit_target.gypi
@@ -0,0 +1,39 @@
+# Copyright (c) 2011 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.
+
+# This file is meant to be included into a target that will have one or more
+# uses of grit_action.gypi. To use this the following variables need to be
+# defined:
+# grit_out_dir: string: the output directory path
+
+# NOTE: This file is optional, not all targets that use grit include it, some
+# do their own custom directives instead.
+{
+ 'conditions': [
+ # If the target is a direct binary, it needs to be able to find the header,
+ # otherwise it probably a supporting target just for grit so the include
+ # dir needs to be set on anything that depends on this action.
+ ['_type=="executable" or _type=="shared_library" or \
+ _type=="loadable_module" or _type=="static_library"', {
+ 'include_dirs': [
+ '<(grit_out_dir)',
+ ],
+ }, {
+ 'direct_dependent_settings': {
+ 'include_dirs': [
+ '<(grit_out_dir)',
+ ],
+ },
+ }],
+ ['OS=="win"', {
+ 'dependencies': ['<(DEPTH)/build/win/system.gyp:cygwin'],
+ }],
+ ],
+}
+
+# Local Variables:
+# tab-width:2
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/build/gyp_chromium b/build/gyp_chromium
new file mode 100755
index 0000000..3cddef6
--- /dev/null
+++ b/build/gyp_chromium
@@ -0,0 +1,167 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2011 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.
+
+# This script is wrapper for Chromium that adds some support for how GYP
+# is invoked by Chromium beyond what can be done in the gclient hooks.
+
+import glob
+import os
+import shlex
+import subprocess
+import sys
+
+script_dir = os.path.dirname(__file__)
+chrome_src = os.path.abspath(os.path.join(script_dir, os.pardir))
+
+sys.path.insert(0, os.path.join(chrome_src, 'tools', 'gyp', 'pylib'))
+import gyp
+
+# On Windows, Psyco shortens warm runs of build/gyp_chromium by about
+# 20 seconds on a z600 machine with 12 GB of RAM, from 90 down to 70
+# seconds. Conversely, memory usage of build/gyp_chromium with Psyco
+# maxes out at about 158 MB vs. 132 MB without it.
+#
+# Psyco uses native libraries, so we need to load a different
+# installation depending on which OS we are running under. It has not
+# been tested whether using Psyco on our Mac and Linux builds is worth
+# it (the GYP running time is a lot shorter, so the JIT startup cost
+# may not be worth it).
+if sys.platform == 'win32':
+ try:
+ sys.path.insert(0, os.path.join(chrome_src, 'third_party', 'psyco_win32'))
+ import psyco
+ except:
+ psyco = None
+else:
+ psyco = None
+
+def apply_gyp_environment(file_path=None):
+ """
+ Reads in a *.gyp_env file and applies the valid keys to os.environ.
+ """
+ if not file_path or not os.path.exists(file_path):
+ return
+ file_contents = open(file_path).read()
+ try:
+ file_data = eval(file_contents, {'__builtins__': None}, None)
+ except SyntaxError, e:
+ e.filename = os.path.abspath(file_path)
+ raise
+ supported_vars = ( 'CHROMIUM_GYP_FILE',
+ 'CHROMIUM_GYP_SYNTAX_CHECK',
+ 'GYP_DEFINES',
+ 'GYP_GENERATOR_FLAGS',
+ 'GYP_GENERATOR_OUTPUT', )
+ for var in supported_vars:
+ val = file_data.get(var)
+ if val:
+ if var in os.environ:
+ print 'INFO: Environment value for "%s" overrides value in %s.' % (
+ var, os.path.abspath(file_path)
+ )
+ else:
+ os.environ[var] = val
+
+def additional_include_files(args=[]):
+ """
+ Returns a list of additional (.gypi) files to include, without
+ duplicating ones that are already specified on the command line.
+ """
+ # Determine the include files specified on the command line.
+ # This doesn't cover all the different option formats you can use,
+ # but it's mainly intended to avoid duplicating flags on the automatic
+ # makefile regeneration which only uses this format.
+ specified_includes = set()
+ for arg in args:
+ if arg.startswith('-I') and len(arg) > 2:
+ specified_includes.add(os.path.realpath(arg[2:]))
+
+ result = []
+ def AddInclude(path):
+ if os.path.realpath(path) not in specified_includes:
+ result.append(path)
+
+ # Always include common.gypi & features_override.gypi
+ AddInclude(os.path.join(script_dir, 'common.gypi'))
+ AddInclude(os.path.join(script_dir, 'features_override.gypi'))
+
+ # Optionally add supplemental .gypi files if present.
+ supplements = glob.glob(os.path.join(chrome_src, '*', 'supplement.gypi'))
+ for supplement in supplements:
+ AddInclude(supplement)
+
+ return result
+
+if __name__ == '__main__':
+ args = sys.argv[1:]
+
+ # Use the Psyco JIT if available.
+ if psyco:
+ psyco.profile()
+ print "Enabled Psyco JIT."
+
+ # Fall back on hermetic python if we happen to get run under cygwin.
+ # TODO(bradnelson): take this out once this issue is fixed:
+ # http://code.google.com/p/gyp/issues/detail?id=177
+ if sys.platform == 'cygwin':
+ python_dir = os.path.join(chrome_src, 'third_party', 'python_26')
+ env = os.environ.copy()
+ env['PATH'] = python_dir + os.pathsep + env.get('PATH', '')
+ p = subprocess.Popen(
+ [os.path.join(python_dir, 'python.exe')] + sys.argv,
+ env=env, shell=False)
+ p.communicate()
+ sys.exit(p.returncode)
+
+ if 'SKIP_CHROMIUM_GYP_ENV' not in os.environ:
+ # Update the environment based on chromium.gyp_env
+ gyp_env_path = os.path.join(os.path.dirname(chrome_src), 'chromium.gyp_env')
+ apply_gyp_environment(gyp_env_path)
+
+ # This could give false positives since it doesn't actually do real option
+ # parsing. Oh well.
+ gyp_file_specified = False
+ for arg in args:
+ if arg.endswith('.gyp'):
+ gyp_file_specified = True
+ break
+
+ # If we didn't get a file, check an env var, and then fall back to
+ # assuming 'all.gyp' from the same directory as the script.
+ if not gyp_file_specified:
+ gyp_file = os.environ.get('CHROMIUM_GYP_FILE')
+ if gyp_file:
+ # Note that CHROMIUM_GYP_FILE values can't have backslashes as
+ # path separators even on Windows due to the use of shlex.split().
+ args.extend(shlex.split(gyp_file))
+ else:
+ args.append(os.path.join(script_dir, 'all.gyp'))
+
+ args.extend(['-I' + i for i in additional_include_files(args)])
+
+ # There shouldn't be a circular dependency relationship between .gyp files,
+ # but in Chromium's .gyp files, on non-Mac platforms, circular relationships
+ # currently exist. The check for circular dependencies is currently
+ # bypassed on other platforms, but is left enabled on the Mac, where a
+ # violation of the rule causes Xcode to misbehave badly.
+ # TODO(mark): Find and kill remaining circular dependencies, and remove this
+ # option. http://crbug.com/35878.
+ # TODO(tc): Fix circular dependencies in ChromiumOS then add linux2 to the
+ # list.
+ if sys.platform not in ('darwin',):
+ args.append('--no-circular-check')
+
+ # If CHROMIUM_GYP_SYNTAX_CHECK is set to 1, it will invoke gyp with --check
+ # to enfore syntax checking.
+ syntax_check = os.environ.get('CHROMIUM_GYP_SYNTAX_CHECK')
+ if syntax_check and int(syntax_check):
+ args.append('--check')
+
+ print 'Updating projects from gyp files...'
+ sys.stdout.flush()
+
+ # Off we go...
+ sys.exit(gyp.main(args))
diff --git a/build/install-build-deps.sh b/build/install-build-deps.sh
new file mode 100755
index 0000000..b30e08a
--- /dev/null
+++ b/build/install-build-deps.sh
@@ -0,0 +1,515 @@
+#!/bin/bash -e
+
+# Copyright (c) 2011 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.
+
+# Script to install everything needed to build chromium (well, ideally, anyway)
+# See http://code.google.com/p/chromium/wiki/LinuxBuildInstructions
+# and http://code.google.com/p/chromium/wiki/LinuxBuild64Bit
+
+usage() {
+ echo "Usage: $0 [--options]"
+ echo "Options:"
+ echo "--[no-]syms: enable or disable installation of debugging symbols"
+ echo "--[no-]gold: enable or disable installation of gold linker"
+ echo "--[no-]lib32: enable or disable installation of 32 bit libraries"
+ echo "Script will prompt interactively if options not given."
+ exit 1
+}
+
+while test "$1" != ""
+do
+ case "$1" in
+ --syms) do_inst_syms=1;;
+ --no-syms) do_inst_syms=0;;
+ --gold) do_inst_gold=1;;
+ --no-gold) do_inst_gold=0;;
+ --lib32) do_inst_lib32=1;;
+ --no-lib32) do_inst_lib32=0;;
+ *) usage;;
+ esac
+ shift
+done
+
+install_gold() {
+ # Gold is optional; it's a faster replacement for ld,
+ # and makes life on 2GB machines much more pleasant.
+
+ # First make sure root can access this directory, as that's tripped
+ # up some folks.
+ if sudo touch xyz.$$
+ then
+ sudo rm xyz.$$
+ else
+ echo root cannot write to the current directory, not installing gold
+ return
+ fi
+
+ BINUTILS=binutils-2.21
+ BINUTILS_URL=http://ftp.gnu.org/gnu/binutils/$BINUTILS.tar.bz2
+ BINUTILS_SHA1=ef93235588eb443e4c4a77f229a8d131bccaecc6
+
+ test -f $BINUTILS.tar.bz2 || wget $BINUTILS_URL
+ if test "`sha1sum $BINUTILS.tar.bz2|cut -d' ' -f1`" != "$BINUTILS_SHA1"
+ then
+ echo Bad sha1sum for $BINUTILS.tar.bz2
+ exit 1
+ fi
+
+ tar -xjvf $BINUTILS.tar.bz2
+ cd $BINUTILS
+ patch -p1 <<EOF
+diff -u -r1.103 -r1.103.2.1
+--- src/gold/object.h 2010/09/08 23:54:51 1.103
++++ src/gold/object.h 2011/02/10 01:15:28 1.103.2.1
+@@ -1,6 +1,6 @@
+ // object.h -- support for an object file for linking in gold -*- C++ -*-
+
+-// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
++// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+ // Written by Ian Lance Taylor <iant@google.com>.
+
+ // This file is part of gold.
+@@ -2165,15 +2165,6 @@
+ Output_symtab_xindex*,
+ Output_symtab_xindex*);
+
+- // Clear the local symbol information.
+- void
+- clear_local_symbols()
+- {
+- this->local_values_.clear();
+- this->local_got_offsets_.clear();
+- this->local_plt_offsets_.clear();
+- }
+-
+ // Record a mapping from discarded section SHNDX to the corresponding
+ // kept section.
+ void
+diff -u -r1.60 -r1.60.2.1
+--- src/gold/reloc.cc 2010/10/14 22:10:22 1.60
++++ src/gold/reloc.cc 2011/02/10 01:15:28 1.60.2.1
+@@ -1,6 +1,6 @@
+ // reloc.cc -- relocate input files for gold.
+
+-// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
++// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+ // Written by Ian Lance Taylor <iant@google.com>.
+
+ // This file is part of gold.
+@@ -685,9 +685,6 @@
+ // Write out the local symbols.
+ this->write_local_symbols(of, layout->sympool(), layout->dynpool(),
+ layout->symtab_xindex(), layout->dynsym_xindex());
+-
+- // We should no longer need the local symbol values.
+- this->clear_local_symbols();
+ }
+
+ // Sort a Read_multiple vector by file offset.
+EOF
+ ./configure --prefix=/usr/local/gold --enable-gold --enable-threads
+ make maybe-all-binutils maybe-all-gold -j4
+ if sudo make maybe-install-binutils maybe-install-gold
+ then
+ # Still need to figure out graceful way of pointing gyp to use
+ # /usr/local/gold/bin/ld without requiring him to set environment
+ # variables. That will go into bootstrap-linux.sh when it's ready.
+ echo "Installing gold as /usr/bin/ld."
+ echo "To uninstall, do 'cd /usr/bin; sudo rm ld; sudo mv ld.orig ld'"
+ test -f /usr/bin/ld && test ! -f /usr/bin/ld.orig && \
+ sudo mv /usr/bin/ld /usr/bin/ld.orig
+ sudo strip /usr/local/gold/bin/ld
+ sudo ln -fs /usr/local/gold/bin/ld /usr/bin/ld.gold
+ sudo ln -fs /usr/bin/ld.gold /usr/bin/ld
+ else
+ echo "make install failed, not installing gold"
+ fi
+}
+
+if ! egrep -q \
+ 'Ubuntu (8\.04|8\.10|9\.04|9\.10|10\.04|10\.10|karmic|lucid|maverick)' \
+ /etc/issue; then
+ echo "Only Ubuntu 8.04 (hardy) through 10.10 (maverick) are currently" \
+ "supported" >&2
+ exit 1
+fi
+
+if ! uname -m | egrep -q "i686|x86_64"; then
+ echo "Only x86 architectures are currently supported" >&2
+ exit
+fi
+
+if [ "x$(id -u)" != x0 ]; then
+ echo "Running as non-root user."
+ echo "You might have to enter your password one or more times for 'sudo'."
+ echo
+fi
+
+# Packages needed for chromeos only
+chromeos_dev_list="libpulse-dev"
+
+# Packages need for development
+dev_list="bison fakeroot flex g++ gperf libapache2-mod-php5 libasound2-dev
+ libbz2-dev libcairo2-dev libdbus-glib-1-dev libgconf2-dev
+ libgl1-mesa-dev libglu1-mesa-dev libglib2.0-dev libgnome-keyring-dev
+ libgtk2.0-dev libjpeg62-dev libnspr4-dev libnss3-dev libpam0g-dev
+ libsctp-dev libsqlite3-dev libxslt1-dev libxss-dev libxtst-dev
+ mesa-common-dev msttcorefonts patch perl php5-cgi pkg-config python
+ python-dev rpm subversion ttf-dejavu-core ttf-kochi-gothic
+ ttf-kochi-mincho wdiff libcurl4-gnutls-dev
+ $chromeos_dev_list"
+
+# Run-time libraries required by chromeos only
+chromeos_lib_list="libpulse0 libbz2-1.0 libcurl4-gnutls-dev"
+
+# Full list of required run-time libraries
+lib_list="libatk1.0-0 libc6 libasound2 libcairo2 libdbus-glib-1-2 libexpat1
+ libfontconfig1 libfreetype6 libglib2.0-0 libgnome-keyring0 libgtk2.0-0
+ libnspr4-0d libnss3-1d libpam0g libpango1.0-0 libpcre3 libpixman-1-0
+ libpng12-0 libstdc++6 libsqlite3-0 libx11-6 libxau6 libxcb1
+ libxcomposite1 libxcursor1 libxdamage1 libxdmcp6 libxext6 libxfixes3
+ libxi6 libxinerama1 libxrandr2 libxrender1 libxtst6 zlib1g
+ $chromeos_lib_list"
+
+# Debugging symbols for all of the run-time libraries
+dbg_list="libatk1.0-dbg libc6-dbg libcairo2-dbg
+ libfontconfig1-dbg libglib2.0-0-dbg libgtk2.0-0-dbg libnspr4-0d-dbg
+ libnss3-1d-dbg libpango1.0-0-dbg libpcre3-dbg libpixman-1-0-dbg
+ libx11-6-dbg libxau6-dbg libxcb1-dbg libxcomposite1-dbg
+ libxcursor1-dbg libxdamage1-dbg libxdmcp6-dbg libxext6-dbg
+ libxfixes3-dbg libxi6-dbg libxinerama1-dbg libxrandr2-dbg
+ libxrender1-dbg libxtst6-dbg zlib1g-dbg"
+
+# CUPS package changed its name from hardy to the next version. Include
+# proper package here depending on the system.
+if egrep -q 'Ubuntu (8\.04|8\.10)' /etc/issue; then
+ dev_list="${dev_list} libcupsys2-dev"
+else
+ dev_list="${dev_list} libcups2-dev"
+fi
+
+# apache2.2-bin package was introduced in karmic.
+if egrep -q 'Ubuntu (8\.04|8\.10|9\.04)' /etc/issue; then
+ dev_list="${dev_list} apache2"
+else
+ dev_list="${dev_list} apache2.2-bin"
+fi
+
+# Waits for the user to press 'Y' or 'N'. Either uppercase of lowercase is
+# accepted. Returns 0 for 'Y' and 1 for 'N'. If an optional parameter has
+# been provided to yes_no(), the function also accepts RETURN as a user input.
+# The parameter specifies the exit code that should be returned in that case.
+# The function will echo the user's selection followed by a newline character.
+# Users can abort the function by pressing CTRL-C. This will call "exit 1".
+yes_no() {
+ local c
+ while :; do
+ c="$(trap 'stty echo -iuclc icanon 2>/dev/null' EXIT INT TERM QUIT
+ stty -echo iuclc -icanon 2>/dev/null
+ dd count=1 bs=1 2>/dev/null | od -An -tx1)"
+ case "$c" in
+ " 0a") if [ -n "$1" ]; then
+ [ $1 -eq 0 ] && echo "Y" || echo "N"
+ return $1
+ fi
+ ;;
+ " 79") echo "Y"
+ return 0
+ ;;
+ " 6e") echo "N"
+ return 1
+ ;;
+ "") echo "Aborted" >&2
+ exit 1
+ ;;
+ *) # The user pressed an unrecognized key. As we are not echoing
+ # any incorrect user input, alert the user by ringing the bell.
+ (tput bel) 2>/dev/null
+ ;;
+ esac
+ done
+}
+
+if test "$do_inst_syms" = ""
+then
+ echo "This script installs all tools and libraries needed to build Chromium."
+ echo ""
+ echo "For most of the libraries, it can also install debugging symbols, which"
+ echo "will allow you to debug code in the system libraries. Most developers"
+ echo "won't need these symbols."
+ echo -n "Do you want me to install them for you (y/N) "
+ if yes_no 1; then
+ do_inst_syms=1
+ fi
+fi
+if test "$do_inst_syms" = "1"; then
+ echo "Installing debugging symbols."
+else
+ echo "Skipping installation of debugging symbols."
+ dbg_list=
+fi
+
+sudo apt-get update
+
+# We initially run "apt-get" with the --reinstall option and parse its output.
+# This way, we can find all the packages that need to be newly installed
+# without accidentally promoting any packages from "auto" to "manual".
+# We then re-run "apt-get" with just the list of missing packages.
+echo "Finding missing packages..."
+packages="${dev_list} ${lib_list} ${dbg_list}"
+# Intentially leaving $packages unquoted so it's more readable.
+echo "Packages required: " $packages
+echo
+new_list_cmd="sudo apt-get install --reinstall $(echo $packages)"
+if new_list="$(yes n | LANG=C $new_list_cmd)"; then
+ # We probably never hit this following line.
+ echo "No missing packages, and the packages are up-to-date."
+elif [ $? -eq 1 ]; then
+ # We expect apt-get to have exit status of 1.
+ # This indicates that we canceled the install with "yes n|".
+ new_list=$(echo "$new_list" |
+ sed -e '1,/The following NEW packages will be installed:/d;s/^ //;t;d')
+ new_list=$(echo "$new_list" | sed 's/ *$//')
+ if [ -z "$new_list" ] ; then
+ echo "No missing packages, and the packages are up-to-date."
+ else
+ echo "Installing missing packages: $new_list."
+ sudo apt-get install ${new_list}
+ fi
+ echo
+else
+ # An apt-get exit status of 100 indicates that a real error has occurred.
+
+ # I am intentionally leaving out the '"'s around new_list_cmd,
+ # as this makes it easier to cut and paste the output
+ echo "The following command failed: " ${new_list_cmd}
+ echo
+ echo "It produces the following output:"
+ yes n | $new_list_cmd || true
+ echo
+ echo "You will have to install the above packages yourself."
+ echo
+ exit 100
+fi
+
+# Some operating systems already ship gold (on recent Debian and
+# Ubuntu you can do "apt-get install binutils-gold" to get it), but
+# older releases didn't. Additionally, gold 2.20 (included in Ubuntu
+# Lucid) makes binaries that just segfault, and 2.20.1 does not support
+# --map-whole-files.
+# So install from source if we don't have a good version.
+
+case `ld --version` in
+*gold*2.2[1-9].*) ;;
+* )
+ if test "$do_inst_gold" = ""
+ then
+ echo "Gold is a new linker that links Chrome 5x faster than ld."
+ echo "Don't use it if you need to link other apps (e.g. valgrind, wine)"
+ echo -n "REPLACE SYSTEM LINKER ld with gold and back up ld? (y/N) "
+ if yes_no 1; then
+ do_inst_gold=1
+ fi
+ fi
+ if test "$do_inst_gold" = "1"
+ then
+ # If the system provides a good version of gold, just install it.
+ if apt-cache show binutils-gold | grep -Eq 'Version: 2.2[1-9].*'; then
+ echo "Installing binutils-gold. Backing up ld as ld.single."
+ sudo apt-get install binutils-gold
+ else
+ # FIXME: avoid installing as /usr/bin/ld
+ echo "Building binutils. Backing up ld as ld.orig."
+ install_gold || exit 99
+ fi
+ else
+ echo "Not installing gold."
+ fi
+esac
+
+# Install 32bit backwards compatibility support for 64bit systems
+if [ "$(uname -m)" = "x86_64" ]; then
+ if test "$do_inst_lib32" = ""
+ then
+ echo "Installing 32bit libraries not already provided by the system"
+ echo
+ echo "This is only needed to build a 32-bit Chrome on your 64-bit system."
+ echo
+ echo "While we only need to install a relatively small number of library"
+ echo "files, we temporarily need to download a lot of large *.deb packages"
+ echo "that contain these files. We will create new *.deb packages that"
+ echo "include just the 32bit libraries. These files will then be found on"
+ echo "your system in places like /lib32, /usr/lib32, /usr/lib/debug/lib32,"
+ echo "/usr/lib/debug/usr/lib32. If you ever need to uninstall these files,"
+ echo "look for packages named *-ia32.deb."
+ echo "Do you want me to download all packages needed to build new 32bit"
+ echo -n "package files (Y/n) "
+ if yes_no 0; then
+ do_inst_lib32=1
+ fi
+ fi
+ if test "$do_inst_lib32" != "1"
+ then
+ echo "Exiting without installing any 32bit libraries."
+ exit 0
+ fi
+
+ # Standard 32bit compatibility libraries
+ echo "First, installing the limited existing 32-bit support..."
+ cmp_list="ia32-libs lib32asound2-dev lib32readline5-dev lib32stdc++6 lib32z1
+ lib32z1-dev libc6-dev-i386 libc6-i386 g++-multilib"
+ sudo apt-get install $cmp_list
+
+ tmp=/tmp/install-32bit.$$
+ trap 'rm -rf "${tmp}"' EXIT INT TERM QUIT
+ mkdir -p "${tmp}/apt/lists/partial" "${tmp}/cache" "${tmp}/partial"
+ touch "${tmp}/status"
+
+ [ -r /etc/apt/apt.conf ] && cp /etc/apt/apt.conf "${tmp}/apt/"
+ cat >>"${tmp}/apt/apt.conf" <<EOF
+ Apt::Architecture "i386";
+ Dir::Cache "${tmp}/cache";
+ Dir::Cache::Archives "${tmp}/";
+ Dir::State::Lists "${tmp}/apt/lists/";
+ Dir::State::status "${tmp}/status";
+EOF
+
+ # Download 32bit packages
+ echo "Computing list of available 32bit packages..."
+ sudo apt-get -c="${tmp}/apt/apt.conf" update
+
+ echo "Downloading available 32bit packages..."
+ sudo apt-get -c="${tmp}/apt/apt.conf" \
+ --yes --download-only --force-yes --reinstall install \
+ ${lib_list} ${dbg_list}
+
+ # Open packages, remove everything that is not a library, move the
+ # library to a lib32 directory and package everything as a *.deb file.
+ echo "Repackaging and installing 32bit packages for use on 64bit systems..."
+ for i in ${lib_list} ${dbg_list}; do
+ orig="$(echo "${tmp}/${i}"_*_i386.deb)"
+ compat="$(echo "${orig}" |
+ sed -e 's,\(_[^_/]*_\)i386\(.deb\),-ia32\1amd64\2,')"
+ rm -rf "${tmp}/staging"
+ msg="$(fakeroot -u sh -exc '
+ # Unpack 32bit Debian archive
+ umask 022
+ mkdir -p "'"${tmp}"'/staging/dpkg/DEBIAN"
+ cd "'"${tmp}"'/staging"
+ ar x "'${orig}'"
+ tar zCfx dpkg data.tar.gz
+ tar zCfx dpkg/DEBIAN control.tar.gz
+
+ # Create a posix extended regular expression fragment that will
+ # recognize the includes which have changed. Should be rare,
+ # will almost always be empty.
+ includes=`sed -n -e "s/^[0-9a-z]* //g" \
+ -e "\,usr/include/,p" dpkg/DEBIAN/md5sums |
+ xargs -n 1 -I FILE /bin/sh -c \
+ "cmp -s dpkg/FILE /FILE || echo FILE" |
+ tr "\n" "|" |
+ sed -e "s,|$,,"`
+
+ # If empty, set it to not match anything.
+ test -z "$includes" && includes="^//"
+
+ # Turn the conflicts into an extended RE for removal from the
+ # Provides line.
+ conflicts=`sed -n -e "/Conflicts/s/Conflicts: *//;T;s/, */|/g;p" \
+ dpkg/DEBIAN/control`
+
+ # Rename package, change architecture, remove conflicts and dependencies
+ sed -r -i \
+ -e "/Package/s/$/-ia32/" \
+ -e "/Architecture/s/:.*$/: amd64/" \
+ -e "/Depends/s/:.*/: ia32-libs/" \
+ -e "/Provides/s/($conflicts)(, *)?//g;T1;s/, *$//;:1" \
+ -e "/Recommends/d" \
+ -e "/Conflicts/d" \
+ dpkg/DEBIAN/control
+
+ # Only keep files that live in "lib" directories or the includes
+ # that have changed.
+ sed -r -i \
+ -e "/\/lib64\//d" -e "/\/.?bin\//d" \
+ -e "\,$includes,s,[ /]include/,&32/,g;s,include/32/,include32/,g" \
+ -e "s, lib/, lib32/,g" \
+ -e "s,/lib/,/lib32/,g" \
+ -e "t;d" \
+ -e "\,^/usr/lib32/debug\(.*/lib32\),s,^/usr/lib32/debug,/usr/lib/debug," \
+ dpkg/DEBIAN/md5sums
+
+ # Re-run ldconfig after installation/removal
+ { echo "#!/bin/sh"; echo "[ \"x\$1\" = xconfigure ]&&ldconfig||:"; } \
+ >dpkg/DEBIAN/postinst
+ { echo "#!/bin/sh"; echo "[ \"x\$1\" = xremove ]&&ldconfig||:"; } \
+ >dpkg/DEBIAN/postrm
+ chmod 755 dpkg/DEBIAN/postinst dpkg/DEBIAN/postrm
+
+ # Remove any other control files
+ find dpkg/DEBIAN -mindepth 1 "(" -name control -o -name md5sums -o \
+ -name postinst -o -name postrm ")" -o -print |
+ xargs -r rm -rf
+
+ # Remove any files/dirs that live outside of "lib" directories,
+ # or are not in our list of changed includes.
+ find dpkg -mindepth 1 -regextype posix-extended \
+ "(" -name DEBIAN -o -name lib -o -regex "dpkg/($includes)" ")" \
+ -prune -o -print | tac |
+ xargs -r -n 1 sh -c "rm \$0 2>/dev/null || rmdir \$0 2>/dev/null || : "
+ find dpkg -name lib64 -o -name bin -o -name "?bin" |
+ tac | xargs -r rm -rf
+
+ # Remove any symbolic links that were broken by the above steps.
+ find -L dpkg -type l -print | tac | xargs -r rm -rf
+
+ # Rename lib to lib32, but keep debug symbols in /usr/lib/debug/usr/lib32
+ # That is where gdb looks for them.
+ find dpkg -type d -o -path "*/lib/*" -print |
+ xargs -r -n 1 sh -c "
+ i=\$(echo \"\${0}\" |
+ sed -e s,/lib/,/lib32/,g \
+ -e s,/usr/lib32/debug\\\\\(.*/lib32\\\\\),/usr/lib/debug\\\\1,);
+ mkdir -p \"\${i%/*}\";
+ mv \"\${0}\" \"\${i}\""
+
+ # Rename include to include32.
+ [ -d "dpkg/usr/include" ] && mv "dpkg/usr/include" "dpkg/usr/include32"
+
+ # Prune any empty directories
+ find dpkg -type d | tac | xargs -r -n 1 rmdir 2>/dev/null || :
+
+ # Create our own Debian package
+ cd ..
+ dpkg --build staging/dpkg .' 2>&1)"
+ compat="$(eval echo $(echo "${compat}" |
+ sed -e 's,_[^_/]*_amd64.deb,_*_amd64.deb,'))"
+ [ -r "${compat}" ] || {
+ echo "${msg}" >&2
+ echo "Failed to build new Debian archive!" >&2
+ exit 1
+ }
+
+ msg="$(sudo dpkg -i "${compat}" 2>&1)" && {
+ echo "Installed ${compat##*/}"
+ } || {
+ # echo "${msg}" >&2
+ echo "Skipped ${compat##*/}"
+ }
+ done
+
+ # Add symbolic links for developing 32bit code
+ echo "Adding missing symbolic links, enabling 32bit code development..."
+ for i in $(find /lib32 /usr/lib32 -maxdepth 1 -name \*.so.\* |
+ sed -e 's/[.]so[.][0-9].*/.so/' |
+ sort -u); do
+ [ "x${i##*/}" = "xld-linux.so" ] && continue
+ [ -r "$i" ] && continue
+ j="$(ls "$i."* | sed -e 's/.*[.]so[.]\([^.]*\)$/\1/;t;d' |
+ sort -n | tail -n 1)"
+ [ -r "$i.$j" ] || continue
+ sudo ln -s "${i##*/}.$j" "$i"
+ done
+fi
diff --git a/build/install-chroot.sh b/build/install-chroot.sh
new file mode 100755
index 0000000..b80aea0
--- /dev/null
+++ b/build/install-chroot.sh
@@ -0,0 +1,325 @@
+#!/bin/bash -e
+
+# Copyright (c) 2010 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.
+
+# This script installs Debian-derived distributions in a chroot environment.
+# It can for example be used to have an accurate 32bit build and test
+# environment when otherwise working on a 64bit machine.
+# N. B. it is unlikely that this script will ever work on anything other than a
+# Debian-derived system.
+
+usage() {
+ echo "usage: ${0##*/} [-m mirror] [-g group,...] [-s] [-c]"
+ echo "-g group,... groups that can use the chroot unauthenticated"
+ echo " Default: 'admin' and current user's group ('$(id -gn)')"
+ echo "-m mirror an alternate repository mirror for package downloads"
+ echo "-s configure default deb-srcs"
+ echo "-c always copy 64bit helper binaries to 32bit chroot"
+ echo "-h this help message"
+}
+
+process_opts() {
+ local OPTNAME OPTIND OPTERR OPTARG
+ while getopts ":g:m:sch" OPTNAME; do
+ case "$OPTNAME" in
+ g)
+ [ -n "${OPTARG}" ] &&
+ chroot_groups="${chroot_groups}${chroot_groups:+,}${OPTARG}"
+ ;;
+ m)
+ if [ -n "${mirror}" ]; then
+ echo "You can only specify exactly one mirror location"
+ usage
+ exit 1
+ fi
+ mirror="$OPTARG"
+ ;;
+ s)
+ add_srcs="y"
+ ;;
+ c)
+ copy_64="y"
+ ;;
+ h)
+ usage
+ exit 0
+ ;;
+ \:)
+ echo "'-$OPTARG' needs an argument."
+ usage
+ exit 1
+ ;;
+ *)
+ echo "invalid command-line option: $OPTARG"
+ usage
+ exit 1
+ ;;
+ esac
+ done
+
+ if [ $# -ge ${OPTIND} ]; then
+ eval echo "Unexpected command line argument: \${${OPTIND}}"
+ usage
+ exit 1
+ fi
+}
+
+
+# Check that we are running as a regular user
+[ "$(id -nu)" = root ] && {
+ echo "Run this script as a regular user and provide your \"sudo\"" \
+ "password if requested" >&2
+ exit 1
+}
+mkdir -p "$HOME/chroot/"
+
+process_opts "$@"
+
+# Error handler
+trap 'exit 1' INT TERM QUIT
+trap 'sudo apt-get clean; tput bel; echo; echo Failed' EXIT
+
+# Install any missing applications that this script relies on. If these packages
+# are already installed, don't force another "apt-get install". That would
+# prevent them from being auto-removed, if they ever become eligible for that.
+# And as this script only needs the packages once, there is no good reason to
+# introduce a hard dependency on things such as dchroot and debootstrap.
+dep=
+for i in dchroot debootstrap; do
+ [ -d /usr/share/doc/"$i" ] || dep="$dep $i"
+done
+[ -n "$dep" ] && sudo apt-get -y install $dep
+sudo apt-get -y install schroot
+
+# Create directory for chroot
+sudo mkdir -p /var/lib/chroot
+
+# Find chroot environments that can be installed with debootstrap
+targets="$(cd /usr/share/debootstrap/scripts
+ ls | grep '^[a-z]*$')"
+
+# Ask user to pick one of the available targets
+echo "The following targets are available to be installed in a chroot:"
+j=1; for i in $targets; do
+ printf '%4d: %s\n' "$j" "$i"
+ j=$(($j+1))
+done
+while :; do
+ printf "Which target would you like to install: "
+ read n
+ [ "$n" -gt 0 -a "$n" -lt "$j" ] >&/dev/null && break
+done
+j=1; for i in $targets; do
+ [ "$j" -eq "$n" ] && { distname="$i"; break; }
+ j=$(($j+1))
+done
+
+# On x86-64, ask whether the user wants to install x86-32 or x86-64
+archflag=
+arch=
+if [ "$(uname -m)" = x86_64 ]; then
+ while :; do
+ echo "You are running a 64bit kernel. This allows you to install either a"
+ printf "32bit or a 64bit chroot environment. %s" \
+ "Which one do you want (32, 64) "
+ read arch
+ [ "${arch}" == 32 -o "${arch}" == 64 ] && break
+ done
+ [ "${arch}" == 32 ] && archflag="--arch i386" || archflag="--arch amd64"
+ arch="${arch}bit"
+fi
+target="${distname}${arch}"
+
+# Don't overwrite an existing installation
+[ -d /var/lib/chroot/"${target}" ] && {
+ echo "This chroot already exists on your machine." >&2
+ echo "Delete /var/lib/chroot/${target} if you want to start over." >&2
+ exit 1
+}
+sudo mkdir -p /var/lib/chroot/"${target}"
+
+# Offer to include additional standard repositories for Ubuntu-based chroots.
+alt_repos=
+grep ubuntu.com /usr/share/debootstrap/scripts/"${distname}" >&/dev/null && {
+ while :; do
+ echo "Would you like to add ${distname}-updates and ${distname}-security "
+ echo -n "to the chroot's sources.list (y/n)? "
+ read alt_repos
+ case "${alt_repos}" in
+ y|Y)
+ alt_repos="y"
+ break
+ ;;
+ n|N)
+ break
+ ;;
+ esac
+ done
+}
+
+# Remove stale entry from /etc/schroot/schroot.conf. Entries start
+# with the target name in square brackets, followed by an arbitrary
+# number of lines. The entry stops when either the end of file has
+# been reached, or when the beginning of a new target is encountered.
+# This means, we cannot easily match for a range of lines in
+# "sed". Instead, we actually have to iterate over each line and check
+# whether it is the beginning of a new entry.
+sudo sed -ni '/^[[]'"${target%bit}"']$/,${:1;n;/^[[]/b2;b1;:2;p;n;b2};p' \
+ /etc/schroot/schroot.conf
+
+# Download base system. This takes some time
+if [ -z "${mirror}" ]; then
+ grep ubuntu.com /usr/share/debootstrap/scripts/"${distname}" >&/dev/null &&
+ mirror="http://archive.ubuntu.com/ubuntu" ||
+ mirror="http://ftp.us.debian.org/debian"
+fi
+ sudo debootstrap ${archflag} "${distname}" /var/lib/chroot/"${target}" \
+ "$mirror"
+
+# Add new entry to /etc/schroot/schroot.conf
+grep ubuntu.com /usr/share/debootstrap/scripts/"${distname}" >&/dev/null &&
+ brand="Ubuntu" || brand="Debian"
+if [ -z "${chroot_groups}" ]; then
+ chroot_groups="admin,$(id -gn)"
+fi
+sudo sh -c 'cat >>/etc/schroot/schroot.conf' <<EOF
+[${target%bit}]
+description=${brand} ${distname} ${arch}
+type=directory
+directory=/var/lib/chroot/${target}
+priority=3
+users=root
+groups=${chroot_groups}
+root-groups=${chroot_groups}
+personality=linux$([ "${arch}" != 64bit ] && echo 32)
+script-config=script-${target}
+
+EOF
+
+# Set up a special directory that changes contents depending on the target
+# that is executing.
+sed '/^FSTAB=/s,/mount-defaults",/mount-'"${target}"'",' \
+ /etc/schroot/script-defaults |
+ sudo sh -c 'cat >/etc/schroot/script-'"${target}"
+sudo cp /etc/schroot/mount-defaults /etc/schroot/mount-"${target}"
+echo "$HOME/chroot/.${target} $HOME/chroot none rw,bind 0 0" |
+ sudo sh -c 'cat >>/etc/schroot/mount-'"${target}"
+mkdir -p "$HOME/chroot/.${target}"
+
+# Install a helper script to launch commands in the chroot
+sudo sh -c 'cat >/usr/local/bin/'"${target%bit}" <<EOF
+#!/bin/bash
+if [ \$# -eq 0 ]; then
+ exec schroot -c ${target%bit} -p
+else
+ p="\$1"; shift
+ exec schroot -c ${target%bit} -p "\$p" -- "\$@"
+fi
+exit 1
+EOF
+sudo chown root:root /usr/local/bin/"${target%bit}"
+sudo chmod 755 /usr/local/bin/"${target%bit}"
+
+# Add the standard Ubuntu update repositories if requested.
+[ "${alt_repos}" = "y" -a \
+ -r "/var/lib/chroot/${target}/etc/apt/sources.list" ] &&
+sudo sed -i '/^deb .* [^ -]\+ main$/p
+ s/^\(deb .* [^ -]\+\) main/\1-security main/
+ p
+ t1
+ d
+ :1;s/-security main/-updates main/
+ t
+ d' "/var/lib/chroot/${target}/etc/apt/sources.list"
+
+# Add a few more repositories to the chroot
+[ "${add_srcs}" = "y" -a \
+ -r "/var/lib/chroot/${target}/etc/apt/sources.list" ] &&
+sudo sed -i 's/ main$/ main restricted universe multiverse/
+ p
+ t1
+ d
+ :1;s/^deb/deb-src/
+ t
+ d' "/var/lib/chroot/${target}/etc/apt/sources.list"
+
+# Update packages
+sudo schroot -c "${target%bit}" -p -- /bin/sh -c '
+ apt-get update; apt-get -y dist-upgrade' || :
+
+# Install a couple of missing packages
+for i in debian-keyring ubuntu-keyring locales sudo; do
+ [ -d "/var/lib/chroot/${target}/usr/share/doc/$i" ] ||
+ sudo schroot -c "${target%bit}" -p -- apt-get -y install "$i" || :
+done
+
+# Configure locales
+sudo schroot -c "${target%bit}" -p -- /bin/sh -c '
+ l='"${LANG:-en_US}"'; l="${l%%.*}"
+ [ -r /etc/locale.gen ] &&
+ sed -i "s/^# \($l\)/\1/" /etc/locale.gen
+ locale-gen $LANG en_US en_US.UTF-8' || :
+
+# Configure "sudo" package
+sudo schroot -c "${target%bit}" -p -- /bin/sh -c '
+ egrep '"'^$(id -nu) '"' /etc/sudoers >/dev/null 2>&1 ||
+ echo '"'$(id -nu) ALL=(ALL) ALL'"' >>/etc/sudoers'
+
+# Install a few more commonly used packages
+sudo schroot -c "${target%bit}" -p -- apt-get -y install \
+ autoconf automake1.9 dpkg-dev g++-multilib gcc-multilib gdb less libtool \
+ strace
+
+# If running a 32bit environment on a 64bit machine, install a few binaries
+# as 64bit. This is only done automatically if the chroot distro is the same as
+# the host, otherwise there might be incompatibilities in build settings or
+# runtime dependencies. The user can force it with the '-c' flag.
+host_distro=$(grep DISTRIB_CODENAME /etc/lsb-release 2>/dev/null | \
+ cut -d "=" -f 2)
+if [ "${copy_64}" = "y" -o \
+ "${host_distro}" = "${distname}" -a "${arch}" = 32bit ] && \
+ file /bin/bash 2>/dev/null | grep -q x86-64; then
+ readlinepkg=$(sudo schroot -c "${target%bit}" -p -- sh -c \
+ 'apt-cache search "lib64readline.\$" | sort | tail -n 1 | cut -d " " -f 1')
+ sudo schroot -c "${target%bit}" -p -- apt-get -y install \
+ lib64expat1 lib64ncurses5 ${readlinepkg} lib64z1
+ dep=
+ for i in binutils gdb strace; do
+ [ -d /usr/share/doc/"$i" ] || dep="$dep $i"
+ done
+ [ -n "$dep" ] && sudo apt-get -y install $dep
+ sudo cp /usr/bin/gdb "/var/lib/chroot/${target}/usr/local/bin/"
+ sudo cp /usr/bin/ld "/var/lib/chroot/${target}/usr/local/bin/"
+ for i in libbfd libpython; do
+ lib="$({ ldd /usr/bin/ld; ldd /usr/bin/gdb; } |
+ grep "$i" | awk '{ print $3 }')"
+ if [ -n "$lib" -a -r "$lib" ]; then
+ sudo cp "$lib" "/var/lib/chroot/${target}/usr/lib64/"
+ fi
+ done
+ for lib in libssl libcrypt; do
+ sudo cp /usr/lib/$lib* "/var/lib/chroot/${target}/usr/lib64/" || :
+ done
+fi
+
+# Clean up package files
+sudo schroot -c "${target%bit}" -p -- apt-get clean
+sudo apt-get clean
+
+# Let the user know what we did
+trap '' INT TERM QUIT
+trap '' EXIT
+cat <<EOF
+
+
+Successfully installed ${distname} ${arch}
+
+You can run programs inside of the chroot by invoking the "${target%bit}"
+command.
+
+Your home directory is shared between the host and the chroot. But I configured
+$HOME/chroot to be private to the chroot environment. You can use it
+for files that need to differ between environments.
+EOF
diff --git a/build/internal/README.chromium b/build/internal/README.chromium
new file mode 100644
index 0000000..4624830
--- /dev/null
+++ b/build/internal/README.chromium
@@ -0,0 +1,24 @@
+Internal property sheets:
+ essential.vsprops
+ Contains the common settings used throughout the projects. Is included by either ..\debug.vsprops or ..\release.vsprops, so in general, it is not included directly.
+
+ release_defaults.vsprops
+ Included by ..\release.vsprops. Its settings are overriden by release_impl$(CHROME_BUILD_TYPE).vsprops. Uses the default VS setting which is "Maximize Speed". Results in relatively fast build with reasonable optimization level but without whole program optimization to reduce build time.
+
+ release_impl.vsprops
+ Included by ..\release.vsprops by default when CHROME_BUILD_TYPE is undefined. Includes release_defaults.vsprops.
+
+ release_impl_checksenabled.vsprops
+ Included by ..\release.vsprops when CHROME_BUILD_TYPE=_checksenabled. Matches what release_defaults.vsprops does, but doesn't actually inherit from it as we couldn't quite get that working. The only difference is that _DEBUG is set instead of NDEBUG. Used for keeping debug checks enabled with a build that is fast enough to dogfood with.
+
+ release_impl_official.vsprops
+ Included by ..\release.vsprops when CHROME_BUILD_TYPE=_official. Includes release_defaults.vsprops. Enables Whole Program Optimizations (WPO), which doubles the build time. Results in much more optimized build. Uses "Full Optimization" and "Flavor small code".
+
+ release_impl_pgo_instrument.vsprops
+ Included by ..\release.vsprops when CHROME_BUILD_TYPE=_pgo_instrument. Includes release_defaults.vsprops. Enables Profile Guided Optimization (PGO) instrumentation (first pass). Uses "Full Optimization" and "Flavor small code".
+
+ release_impl_pgo_optimize.vsprops
+ Included by ..\release.vsprops when CHROME_BUILD_TYPE=_pgo_optimize. Includes release_defaults.vsprops. Enables Profile Guided Optimization (PGO) optimization (second pass). Uses "Full Optimization" and "Flavor small code".
+
+ release_impl_purify.vsprops
+ Included by ..\release.vsprops when CHROME_BUILD_TYPE=_purify. Includes release_defaults.vsprops. Disables optimizations. Used with Purify to test without debug tools and without optimization; i.e. NDEBUG is defined but the compiler doesn't optimize the binary.
diff --git a/build/internal/release_defaults.gypi b/build/internal/release_defaults.gypi
new file mode 100644
index 0000000..1bf6bbe
--- /dev/null
+++ b/build/internal/release_defaults.gypi
@@ -0,0 +1,15 @@
+{
+ 'msvs_settings': {
+ 'VCCLCompilerTool': {
+ 'Optimization': '2',
+ 'StringPooling': 'true',
+ 'OmitFramePointers': 'true',
+ },
+ 'VCLinkerTool': {
+ 'LinkIncremental': '1',
+ 'OptimizeReferences': '2',
+ 'EnableCOMDATFolding': '2',
+ 'OptimizeForWindows98': '1',
+ },
+ },
+}
diff --git a/build/internal/release_impl.gypi b/build/internal/release_impl.gypi
new file mode 100644
index 0000000..aff06dc
--- /dev/null
+++ b/build/internal/release_impl.gypi
@@ -0,0 +1,3 @@
+{
+ 'includes': ['release_defaults.gypi'],
+}
diff --git a/build/internal/release_impl_official.gypi b/build/internal/release_impl_official.gypi
new file mode 100644
index 0000000..18f7928
--- /dev/null
+++ b/build/internal/release_impl_official.gypi
@@ -0,0 +1,21 @@
+{
+ 'includes': ['release_defaults.gypi'],
+ 'defines': ['OFFICIAL_BUILD'],
+ 'msvs_settings': {
+ 'VCCLCompilerTool': {
+ 'Optimization': '3',
+ 'InlineFunctionExpansion': '2',
+ 'EnableIntrinsicFunctions': 'true',
+ 'FavorSizeOrSpeed': '2',
+ 'OmitFramePointers': 'true',
+ 'EnableFiberSafeOptimizations': 'true',
+ 'WholeProgramOptimization': 'true',
+ },
+ 'VCLibrarianTool': {
+ 'AdditionalOptions': ['/ltcg', '/expectedoutputsize:120000000'],
+ },
+ 'VCLinkerTool': {
+ 'LinkTimeCodeGeneration': '1',
+ },
+ },
+}
diff --git a/build/linux/chrome_linux.croc b/build/linux/chrome_linux.croc
new file mode 100644
index 0000000..f400306
--- /dev/null
+++ b/build/linux/chrome_linux.croc
@@ -0,0 +1,29 @@
+# -*- python -*-
+# Crocodile config file for Chromium linux
+
+# TODO(jhawkins): We'll need to add a chromeos.croc once we get a coverage bot
+# for that platform.
+
+{
+ # List of rules, applied in order
+ 'rules' : [
+ # Specify inclusions before exclusions, since rules are in order.
+
+ # Don't include non-Linux platform dirs
+ {
+ 'regexp' : '.*/(chromeos|views)/',
+ 'include' : 0,
+ },
+ # Don't include chromeos, windows, or mac specific files
+ {
+ 'regexp' : '.*(_|/)(chromeos|mac|win|views)(\\.|_)',
+ 'include' : 0,
+ },
+
+ # Groups
+ {
+ 'regexp' : '.*_test_linux\\.',
+ 'group' : 'test',
+ },
+ ],
+}
diff --git a/build/linux/dump_app_syms b/build/linux/dump_app_syms
new file mode 100755
index 0000000..632bcc7
--- /dev/null
+++ b/build/linux/dump_app_syms
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+# Copyright (c) 2010 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.
+#
+# Helper script to run dump_syms on Chrome Linux executables and strip
+# them if needed.
+
+set -e
+
+usage() {
+ echo -n "$0 <dump_syms_exe> <strip_binary> " >&2
+ echo "<binary_with_symbols> <symbols_output>" >&2
+}
+
+
+if [ $# -ne 4 ]; then
+ usage
+ exit 1
+fi
+
+SCRIPTDIR="$(readlink -f "$(dirname "$0")")"
+DUMPSYMS="$1"
+STRIP_BINARY="$2"
+INFILE="$3"
+OUTFILE="$4"
+
+# Dump the symbols from the given binary.
+if [ ! -e "$OUTFILE" -o "$INFILE" -nt "$OUTFILE" ]; then
+ "$DUMPSYMS" "$INFILE" > "$OUTFILE"
+fi
+
+if [ "$STRIP_BINARY" != "0" ]; then
+ strip "$INFILE"
+fi
diff --git a/build/linux/pkg-config-wrapper b/build/linux/pkg-config-wrapper
new file mode 100755
index 0000000..4b5455b
--- /dev/null
+++ b/build/linux/pkg-config-wrapper
@@ -0,0 +1,37 @@
+#!/bin/bash
+# Copyright (c) 2010 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.
+
+# This program wraps around pkg-config to generate the correct include and
+# library paths when cross-compiling using a sysroot.
+# The assumption is that the sysroot contains the .pc files in usr/lib/pkgconfig
+# and usr/share/pkgconfig (relative to the sysroot) and that they output paths
+# relative to some parent path of the sysroot.
+# This assumption is valid for a range of sysroots, in particular: a
+# LSB-compliant root filesystem mounted at the sysroot, and a board build
+# directory of a Chromium OS chroot.
+
+root="$1"
+if [ -z "$root" ]
+then
+ echo "usage: $0 /path/to/sysroot [pkg-config-arguments] package" >&2
+ exit 1
+fi
+
+rewrite=`dirname $0`/rewrite_dirs.py
+package=${!#}
+
+shift
+config_path=$root/usr/lib/pkgconfig:$root/usr/share/pkgconfig
+set -e
+# Some sysroots, like the Chromium OS ones, may generate paths that are not
+# relative to the sysroot. For example,
+# /path/to/chroot/build/x86-generic/usr/lib/pkgconfig/pkg.pc may have all paths
+# relative to /path/to/chroot (i.e. prefix=/build/x86-generic/usr) instead of
+# relative to /path/to/chroot/build/x86-generic (i.e prefix=/usr).
+# To support this correctly, it's necessary to extract the prefix to strip from
+# pkg-config's |prefix| variable.
+prefix=`PKG_CONFIG_PATH=$config_path pkg-config --variable=prefix "$package" | sed -e 's|/usr$||'`
+result=`PKG_CONFIG_PATH=$config_path pkg-config "$@"`
+echo "$result"| $rewrite --sysroot "$root" --strip-prefix "$prefix"
diff --git a/build/linux/python_arch.sh b/build/linux/python_arch.sh
new file mode 100755
index 0000000..01e41d0
--- /dev/null
+++ b/build/linux/python_arch.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+# Copyright (c) 2011 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.
+
+# This figures out the architecture of the version of Python we are building
+# pyautolib against.
+#
+# python_arch.sh /usr/lib/libpython2.5.so.1.0
+# python_arch.sh /path/to/sysroot/usr/lib/libpython2.4.so.1.0
+#
+
+python=$(readlink -f "$1")
+if [ ! -r "$python" ]; then
+ echo unknown
+ exit 0
+fi
+file_out=$(file "$python")
+if [ $? -ne 0 ]; then
+ echo unknown
+ exit 0
+fi
+
+echo $file_out | grep -qs "ARM"
+if [ $? -eq 0 ]; then
+ echo arm
+ exit 0
+fi
+
+echo $file_out | grep -qs "x86-64"
+if [ $? -eq 0 ]; then
+ echo x64
+ exit 0
+fi
+
+echo $file_out | grep -qs "Intel 80386"
+if [ $? -eq 0 ]; then
+ echo ia32
+ exit 0
+fi
+
+exit 1
diff --git a/build/linux/rewrite_dirs.py b/build/linux/rewrite_dirs.py
new file mode 100755
index 0000000..9e166d0
--- /dev/null
+++ b/build/linux/rewrite_dirs.py
@@ -0,0 +1,68 @@
+#!/usr/bin/python
+# Copyright (c) 2009 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.
+
+"""Rewrites paths in -I, -L and other option to be relative to a sysroot."""
+
+import sys
+import os
+import optparse
+
+REWRITE_PREFIX = ['-I',
+ '-idirafter',
+ '-imacros',
+ '-imultilib',
+ '-include',
+ '-iprefix',
+ '-iquote',
+ '-isystem',
+ '-L']
+
+def RewritePath(path, opts):
+ """Rewrites a path by stripping the prefix and prepending the sysroot."""
+ sysroot = opts.sysroot
+ prefix = opts.strip_prefix
+ if os.path.isabs(path) and not path.startswith(sysroot):
+ if path.startswith(prefix):
+ path = path[len(prefix):]
+ path = path.lstrip('/')
+ return os.path.join(sysroot, path)
+ else:
+ return path
+
+def RewriteLine(line, opts):
+ """Rewrites all the paths in recognized options."""
+ args = line.split()
+ count = len(args)
+ i = 0
+ while i < count:
+ for prefix in REWRITE_PREFIX:
+ # The option can be either in the form "-I /path/to/dir" or
+ # "-I/path/to/dir" so handle both.
+ if args[i] == prefix:
+ i += 1
+ try:
+ args[i] = RewritePath(args[i], opts)
+ except IndexError:
+ sys.stderr.write('Missing argument following %s\n' % prefix)
+ break
+ elif args[i].startswith(prefix):
+ args[i] = prefix + RewritePath(args[i][len(prefix):], opts)
+ i += 1
+
+ return ' '.join(args)
+
+def main(argv):
+ parser = optparse.OptionParser()
+ parser.add_option('-s', '--sysroot', default='/', help='sysroot to prepend')
+ parser.add_option('-p', '--strip-prefix', default='', help='prefix to strip')
+ opts, args = parser.parse_args(argv[1:])
+
+ for line in sys.stdin.readlines():
+ line = RewriteLine(line.strip(), opts)
+ print line
+ return 0
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv))
diff --git a/build/linux/system.gyp b/build/linux/system.gyp
new file mode 100644
index 0000000..a52083b
--- /dev/null
+++ b/build/linux/system.gyp
@@ -0,0 +1,380 @@
+# Copyright (c) 2009 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.
+
+{
+ 'conditions': [
+ ['sysroot!=""', {
+ 'variables': {
+ 'pkg-config': './pkg-config-wrapper "<(sysroot)"',
+ },
+ }, {
+ 'variables': {
+ 'pkg-config': 'pkg-config'
+ },
+ }],
+ [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', {
+ 'variables': {
+ # We use our own copy of libssl3, although we still need to link against
+ # the rest of NSS.
+ 'use_system_ssl%': 0,
+ },
+ }, { # OS!="linux"
+ 'variables': {
+ 'use_system_ssl%': 1,
+ },
+ }],
+ ],
+
+
+ 'targets': [
+ {
+ 'target_name': 'gtk',
+ 'type': 'settings',
+ 'conditions': [
+ ['_toolset=="target"', {
+ 'direct_dependent_settings': {
+ 'cflags': [
+ '<!@(<(pkg-config) --cflags gtk+-2.0 gthread-2.0)',
+ ],
+ },
+ 'link_settings': {
+ 'ldflags': [
+ '<!@(<(pkg-config) --libs-only-L --libs-only-other gtk+-2.0 gthread-2.0)',
+ ],
+ 'libraries': [
+ '<!@(<(pkg-config) --libs-only-l gtk+-2.0 gthread-2.0)',
+ ],
+ },
+ }],
+ [ 'chromeos==1', {
+ 'link_settings': {
+ 'libraries': [ '-lXtst' ]
+ }
+ }]]
+ },
+ {
+ 'target_name': 'gtkprint',
+ 'type': 'settings',
+ 'conditions': [
+ ['_toolset=="target"', {
+ 'direct_dependent_settings': {
+ 'cflags': [
+ '<!@(<(pkg-config) --cflags gtk+-unix-print-2.0)',
+ ],
+ },
+ 'link_settings': {
+ 'ldflags': [
+ '<!@(<(pkg-config) --libs-only-L --libs-only-other gtk+-unix-print-2.0)',
+ ],
+ 'libraries': [
+ '<!@(<(pkg-config) --libs-only-l gtk+-unix-print-2.0)',
+ ],
+ },
+ }]]
+ },
+ {
+ 'target_name': 'nss',
+ 'type': 'settings',
+ 'conditions': [
+ ['_toolset=="target"', {
+ 'conditions': [
+ ['use_system_ssl==0', {
+ 'dependencies': [
+ '../../net/third_party/nss/ssl.gyp:ssl',
+ '../../third_party/zlib/zlib.gyp:zlib',
+ ],
+ 'direct_dependent_settings': {
+ 'cflags': [
+ # We need for our local copies of the libssl3 headers to come
+ # first, otherwise the code will build, but will fallback to
+ # the set of features advertised in the system headers.
+ # Unfortunately, there's no include path that we can filter
+ # out of $(pkg-config --cflags nss) and GYP include paths
+ # come after cflags on the command line. So we have these
+ # bodges:
+ '-Inet/third_party/nss/ssl', # for make
+ '-ISource/WebKit/chromium/net/third_party/nss/ssl', # for make in webkit
+ '<!@(<(pkg-config) --cflags nss)',
+ ],
+ },
+ 'link_settings': {
+ 'ldflags': [
+ '<!@(<(pkg-config) --libs-only-L --libs-only-other nss)',
+ ],
+ 'libraries': [
+ '<!@(<(pkg-config) --libs-only-l nss | sed -e "s/-lssl3//")',
+ ],
+ },
+ }, {
+ 'direct_dependent_settings': {
+ 'cflags': [
+ '<!@(<(pkg-config) --cflags nss)',
+ ],
+ 'defines': [
+ 'USE_SYSTEM_SSL',
+ ],
+ },
+ 'link_settings': {
+ 'ldflags': [
+ '<!@(<(pkg-config) --libs-only-L --libs-only-other nss)',
+ ],
+ 'libraries': [
+ '<!@(<(pkg-config) --libs-only-l nss)',
+ ],
+ },
+ }
+ ]]
+ }],
+ ],
+ },
+ {
+ 'target_name': 'freetype2',
+ 'type': 'settings',
+ 'conditions': [
+ ['_toolset=="target"', {
+ 'direct_dependent_settings': {
+ 'cflags': [
+ '<!@(<(pkg-config) --cflags freetype2)',
+ ],
+ },
+ 'link_settings': {
+ 'ldflags': [
+ '<!@(<(pkg-config) --libs-only-L --libs-only-other freetype2)',
+ ],
+ 'libraries': [
+ '<!@(<(pkg-config) --libs-only-l freetype2)',
+ ],
+ },
+ }]]
+ },
+ {
+ 'target_name': 'fontconfig',
+ 'type': 'settings',
+ 'conditions': [
+ ['_toolset=="target"', {
+ 'direct_dependent_settings': {
+ 'cflags': [
+ '<!@(<(pkg-config) --cflags fontconfig)',
+ ],
+ },
+ 'link_settings': {
+ 'ldflags': [
+ '<!@(<(pkg-config) --libs-only-L --libs-only-other fontconfig)',
+ ],
+ 'libraries': [
+ '<!@(<(pkg-config) --libs-only-l fontconfig)',
+ ],
+ },
+ }]]
+ },
+ {
+ 'target_name': 'gdk',
+ 'type': 'settings',
+ 'conditions': [
+ ['_toolset=="target"', {
+ 'direct_dependent_settings': {
+ 'cflags': [
+ '<!@(<(pkg-config) --cflags gdk-2.0)',
+ ],
+ },
+ 'link_settings': {
+ 'ldflags': [
+ '<!@(<(pkg-config) --libs-only-L --libs-only-other gdk-2.0)',
+ ],
+ 'libraries': [
+ '<!@(<(pkg-config) --libs-only-l gdk-2.0)',
+ ],
+ },
+ }]]
+ },
+ {
+ 'target_name': 'gconf',
+ 'type': 'settings',
+ 'conditions': [
+ ['use_gconf==1 and _toolset=="target"', {
+ 'direct_dependent_settings': {
+ 'cflags': [
+ '<!@(<(pkg-config) --cflags gconf-2.0)',
+ ],
+ 'defines': [
+ 'USE_GCONF',
+ ],
+ },
+ 'link_settings': {
+ 'ldflags': [
+ '<!@(<(pkg-config) --libs-only-L --libs-only-other gconf-2.0)',
+ ],
+ 'libraries': [
+ '<!@(<(pkg-config) --libs-only-l gconf-2.0)',
+ ],
+ },
+ }]]
+ },
+ {
+ 'target_name': 'x11',
+ 'type': 'settings',
+ 'conditions': [
+ ['_toolset=="target"', {
+ 'direct_dependent_settings': {
+ 'cflags': [
+ '<!@(<(pkg-config) --cflags x11)',
+ ],
+ },
+ 'link_settings': {
+ 'ldflags': [
+ '<!@(<(pkg-config) --libs-only-L --libs-only-other x11)',
+ ],
+ 'libraries': [
+ '<!@(<(pkg-config) --libs-only-l x11)',
+ ],
+ },
+ }],
+ # When XInput2 is available (i.e. inputproto version is 2.0), the
+ # pkg-config command will succeed, so the output will be empty.
+ ['"<!@(<(pkg-config) --atleast-version=2.0 inputproto || echo $?)"==""', {
+ 'direct_dependent_settings': {
+ 'defines': [
+ 'HAVE_XINPUT2',
+ ],
+ },
+ 'link_settings': {
+ 'ldflags': [
+ '<!@(<(pkg-config) --libs-only-L --libs-only-other xi)',
+ ],
+ 'libraries': [
+ '<!@(<(pkg-config) --libs-only-l xi)',
+ ],
+ }
+ }],
+ ],
+ },
+ {
+ 'target_name': 'xext',
+ 'type': 'settings',
+ 'conditions': [
+ ['_toolset=="target"', {
+ 'direct_dependent_settings': {
+ 'cflags': [
+ '<!@(<(pkg-config) --cflags xext)',
+ ],
+ },
+ 'link_settings': {
+ 'ldflags': [
+ '<!@(<(pkg-config) --libs-only-L --libs-only-other xext)',
+ ],
+ 'libraries': [
+ '<!@(<(pkg-config) --libs-only-l xext)',
+ ],
+ },
+ }]]
+ },
+ {
+ 'target_name': 'selinux',
+ 'type': 'settings',
+ 'conditions': [
+ ['_toolset=="target"', {
+ 'link_settings': {
+ 'libraries': [
+ '-lselinux',
+ ],
+ },
+ }]]
+ },
+ {
+ 'target_name': 'gnome-keyring',
+ 'type': 'settings',
+ 'conditions': [
+ ['use_gnome_keyring==1', {
+ 'direct_dependent_settings': {
+ 'cflags': [
+ '<!@(<(pkg-config) --cflags gnome-keyring-1)',
+ ],
+ 'defines': [
+ 'USE_GNOME_KEYRING',
+ ],
+ 'conditions': [
+ ['linux_link_gnome_keyring==0', {
+ 'defines': ['DLOPEN_GNOME_KEYRING'],
+ }],
+ ],
+ },
+ 'conditions': [
+ ['linux_link_gnome_keyring!=0', {
+ 'link_settings': {
+ 'ldflags': [
+ '<!@(<(pkg-config) --libs-only-L --libs-only-other gnome-keyring-1)',
+ ],
+ 'libraries': [
+ '<!@(<(pkg-config) --libs-only-l gnome-keyring-1)',
+ ],
+ },
+ }, {
+ 'link_settings': {
+ 'libraries': [
+ '-ldl',
+ ],
+ },
+ }],
+ ],
+ }],
+ ],
+ },
+ {
+ 'target_name': 'dbus-glib',
+ 'type': 'settings',
+ 'direct_dependent_settings': {
+ 'cflags': [
+ '<!@(<(pkg-config) --cflags dbus-glib-1)',
+ ],
+ },
+ 'link_settings': {
+ 'ldflags': [
+ '<!@(<(pkg-config) --libs-only-L --libs-only-other dbus-glib-1)',
+ ],
+ 'libraries': [
+ '<!@(<(pkg-config) --libs-only-l dbus-glib-1)',
+ ],
+ },
+ },
+ {
+ 'target_name': 'libresolv',
+ 'type': 'settings',
+ 'link_settings': {
+ 'libraries': [
+ '-lresolv',
+ ],
+ },
+ },
+ {
+ 'target_name': 'ibus',
+ 'type': 'settings',
+ 'conditions': [
+ ['"<!@(<(pkg-config) --atleast-version=1.3.99 ibus-1.0 || echo $?)"==""', {
+ 'variables': {
+ 'ibus': 1
+ },
+ 'direct_dependent_settings': {
+ 'cflags': [
+ '<!@(<(pkg-config) --cflags ibus-1.0)',
+ ],
+ },
+ 'link_settings': {
+ 'ldflags': [
+ '<!@(<(pkg-config) --libs-only-L --libs-only-other ibus-1.0)',
+ ],
+ 'libraries': [
+ '<!@(<(pkg-config) --libs-only-l ibus-1.0)',
+ ],
+ },
+ }],
+ ],
+ },
+ ],
+}
+
+# Local Variables:
+# tab-width:2
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/build/mac/chrome_mac.croc b/build/mac/chrome_mac.croc
new file mode 100644
index 0000000..8cde00c
--- /dev/null
+++ b/build/mac/chrome_mac.croc
@@ -0,0 +1,36 @@
+# -*- python -*-
+# Crocodile config file for Chromium mac
+
+{
+ # List of rules, applied in order
+ 'rules' : [
+ # Specify inclusions before exclusions, since rules are in order.
+
+ # Don't include chromeos, linux, or windows specific files
+ {
+ 'regexp' : '.*(_|/)(chromeos|linux|win|views)(\\.|_)',
+ 'include' : 0,
+ },
+ # Don't include ChromeOS dirs
+ {
+ 'regexp' : '.*/chromeos/',
+ 'include' : 0,
+ },
+
+ # Groups
+ {
+ 'regexp' : '.*_test_mac\\.',
+ 'group' : 'test',
+ },
+
+ # Languages
+ {
+ 'regexp' : '.*\\.m$',
+ 'language' : 'ObjC',
+ },
+ {
+ 'regexp' : '.*\\.mm$',
+ 'language' : 'ObjC++',
+ },
+ ],
+}
diff --git a/build/mac/strip_from_xcode b/build/mac/strip_from_xcode
new file mode 100755
index 0000000..c26b9fb
--- /dev/null
+++ b/build/mac/strip_from_xcode
@@ -0,0 +1,62 @@
+#!/bin/bash
+
+# Copyright (c) 2008 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.
+
+# This is a handy wrapper script that figures out how to call the strip
+# utility (strip_save_dsym in this case), if it even needs to be called at all,
+# and then does it. This script should be called by a post-link phase in
+# targets that might generate Mach-O executables, dynamic libraries, or
+# loadable bundles.
+#
+# An example "Strip If Needed" build phase placed after "Link Binary With
+# Libraries" would do:
+# exec "${XCODEPROJ_DEPTH}/build/mac/strip_from_xcode"
+
+if [ "${CONFIGURATION}" != "Release" ] ; then
+ # Only strip in release mode.
+ exit 0
+fi
+
+declare -a FLAGS
+
+# MACH_O_TYPE is not set for a command-line tool, so check PRODUCT_TYPE too.
+# Weird.
+if [ "${MACH_O_TYPE}" = "mh_execute" ] || \
+ [ "${PRODUCT_TYPE}" = "com.apple.product-type.tool" ] ; then
+ # Strip everything (no special flags). No-op.
+ true
+elif [ "${MACH_O_TYPE}" = "mh_dylib" ] || \
+ [ "${MACH_O_TYPE}" = "mh_bundle" ]; then
+ # Strip debugging symbols and local symbols
+ FLAGS[${#FLAGS[@]}]=-S
+ FLAGS[${#FLAGS[@]}]=-x
+elif [ "${MACH_O_TYPE}" = "staticlib" ] ; then
+ # Don't strip static libraries.
+ exit 0
+else
+ # Warn, but don't treat this as an error.
+ echo $0: warning: unrecognized MACH_O_TYPE ${MACH_O_TYPE}
+ exit 0
+fi
+
+if [ -n "${STRIPFLAGS}" ] ; then
+ # Pick up the standard STRIPFLAGS Xcode setting, used for "Additional Strip
+ # Flags".
+ for stripflag in "${STRIPFLAGS}" ; do
+ FLAGS[${#FLAGS[@]}]="${stripflag}"
+ done
+fi
+
+if [ -n "${CHROMIUM_STRIP_SAVE_FILE}" ] ; then
+ # An Xcode project can communicate a file listing symbols to saved in this
+ # environment variable by setting it as a build setting. This isn't a
+ # standard Xcode setting. It's used in preference to STRIPFLAGS to
+ # eliminate quoting ambiguity concerns.
+ FLAGS[${#FLAGS[@]}]=-s
+ FLAGS[${#FLAGS[@]}]="${CHROMIUM_STRIP_SAVE_FILE}"
+fi
+
+exec "$(dirname ${0})/strip_save_dsym" "${FLAGS[@]}" \
+ "${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}"
diff --git a/build/mac/strip_save_dsym b/build/mac/strip_save_dsym
new file mode 100755
index 0000000..d99ee2e
--- /dev/null
+++ b/build/mac/strip_save_dsym
@@ -0,0 +1,343 @@
+#!/usr/bin/python
+
+# Copyright (c) 2008 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.
+
+# Usage: strip_save_dsym <whatever-arguments-you-would-pass-to-strip>
+#
+# strip_save_dsym is a wrapper around the standard strip utility. Given an
+# input Mach-O file, strip_save_dsym will save a copy of the file in a "fake"
+# .dSYM bundle for debugging, and then call strip to strip the Mach-O file.
+# Note that the .dSYM file is a "fake" in that it's not a self-contained
+# .dSYM bundle, it just contains a copy of the original (unstripped) Mach-O
+# file, and therefore contains references to object files on the filesystem.
+# The generated .dSYM bundle is therefore unsuitable for debugging in the
+# absence of these .o files.
+#
+# If a .dSYM already exists and has a newer timestamp than the Mach-O file,
+# this utility does nothing. That allows strip_save_dsym to be run on a file
+# that has already been stripped without trashing the .dSYM.
+#
+# Rationale: the "right" way to generate dSYM bundles, dsymutil, is incredibly
+# slow. On the other hand, doing a file copy (which is really all that
+# dsymutil does) is comparatively fast. Since we usually just want to strip
+# a release-mode executable but still be able to debug it, and we don't care
+# so much about generating a hermetic dSYM bundle, we'll prefer the file copy.
+# If a real dSYM is ever needed, it's still possible to create one by running
+# dsymutil and pointing it at the original Mach-O file inside the "fake"
+# bundle, provided that the object files are available.
+
+import errno
+import os
+import re
+import shutil
+import subprocess
+import sys
+import time
+
+# Returns a list of architectures contained in a Mach-O file. The file can be
+# a universal (fat) file, in which case there will be one list element for
+# each contained architecture, or it can be a thin single-architecture Mach-O
+# file, in which case the list will contain a single element identifying the
+# architecture. On error, returns an empty list. Determines the architecture
+# list by calling file.
+def macho_archs(macho):
+ macho_types = ["executable",
+ "dynamically linked shared library",
+ "bundle"]
+ macho_types_re = "Mach-O (?:64-bit )?(?:" + "|".join(macho_types) + ")"
+
+ file_cmd = subprocess.Popen(["/usr/bin/file", "-b", "--", macho],
+ stdout=subprocess.PIPE)
+
+ archs = []
+
+ type_line = file_cmd.stdout.readline()
+ type_match = re.match("^%s (.*)$" % macho_types_re, type_line)
+ if type_match:
+ archs.append(type_match.group(1))
+ return [type_match.group(1)]
+ else:
+ type_match = re.match("^Mach-O universal binary with (.*) architectures$",
+ type_line)
+ if type_match:
+ for i in range(0, int(type_match.group(1))):
+ arch_line = file_cmd.stdout.readline()
+ arch_match = re.match(
+ "^.* \(for architecture (.*)\):\t%s .*$" % macho_types_re,
+ arch_line)
+ if arch_match:
+ archs.append(arch_match.group(1))
+
+ if file_cmd.wait() != 0:
+ archs = []
+
+ if len(archs) == 0:
+ print >> sys.stderr, "No architectures in %s" % macho
+
+ return archs
+
+# Returns a dictionary mapping architectures contained in the file as returned
+# by macho_archs to the LC_UUID load command for that architecture.
+# Architectures with no LC_UUID load command are omitted from the dictionary.
+# Determines the UUID value by calling otool.
+def macho_uuids(macho):
+ uuids = {}
+
+ archs = macho_archs(macho)
+ if len(archs) == 0:
+ return uuids
+
+ for arch in archs:
+ if arch == "":
+ continue
+
+ otool_cmd = subprocess.Popen(["/usr/bin/otool", "-arch", arch, "-l", "-",
+ macho],
+ stdout=subprocess.PIPE)
+ # state 0 is when nothing UUID-related has been seen yet. State 1 is
+ # entered after a load command begins, but it may not be an LC_UUID load
+ # command. States 2, 3, and 4 are intermediate states while reading an
+ # LC_UUID command. State 5 is the terminal state for a successful LC_UUID
+ # read. State 6 is the error state.
+ state = 0
+ uuid = ""
+ for otool_line in otool_cmd.stdout:
+ if state == 0:
+ if re.match("^Load command .*$", otool_line):
+ state = 1
+ elif state == 1:
+ if re.match("^ cmd LC_UUID$", otool_line):
+ state = 2
+ else:
+ state = 0
+ elif state == 2:
+ if re.match("^ cmdsize 24$", otool_line):
+ state = 3
+ else:
+ state = 6
+ elif state == 3:
+ # The UUID display format changed in the version of otool shipping
+ # with the Xcode 3.2.2 prerelease. The new format is traditional:
+ # uuid 4D7135B2-9C56-C5F5-5F49-A994258E0955
+ # and with Xcode 3.2.6, then line is indented one more space:
+ # uuid 4D7135B2-9C56-C5F5-5F49-A994258E0955
+ # The old format, from cctools-750 and older's otool, breaks the UUID
+ # up into a sequence of bytes:
+ # uuid 0x4d 0x71 0x35 0xb2 0x9c 0x56 0xc5 0xf5
+ # 0x5f 0x49 0xa9 0x94 0x25 0x8e 0x09 0x55
+ new_uuid_match = re.match("^ {3,4}uuid (.{8}-.{4}-.{4}-.{4}-.{12})$",
+ otool_line)
+ if new_uuid_match:
+ uuid = new_uuid_match.group(1)
+
+ # Skip state 4, there is no second line to read.
+ state = 5
+ else:
+ old_uuid_match = re.match("^ uuid 0x(..) 0x(..) 0x(..) 0x(..) "
+ "0x(..) 0x(..) 0x(..) 0x(..)$",
+ otool_line)
+ if old_uuid_match:
+ state = 4
+ uuid = old_uuid_match.group(1) + old_uuid_match.group(2) + \
+ old_uuid_match.group(3) + old_uuid_match.group(4) + "-" + \
+ old_uuid_match.group(5) + old_uuid_match.group(6) + "-" + \
+ old_uuid_match.group(7) + old_uuid_match.group(8) + "-"
+ else:
+ state = 6
+ elif state == 4:
+ old_uuid_match = re.match("^ 0x(..) 0x(..) 0x(..) 0x(..) "
+ "0x(..) 0x(..) 0x(..) 0x(..)$",
+ otool_line)
+ if old_uuid_match:
+ state = 5
+ uuid += old_uuid_match.group(1) + old_uuid_match.group(2) + "-" + \
+ old_uuid_match.group(3) + old_uuid_match.group(4) + \
+ old_uuid_match.group(5) + old_uuid_match.group(6) + \
+ old_uuid_match.group(7) + old_uuid_match.group(8)
+ else:
+ state = 6
+
+ if otool_cmd.wait() != 0:
+ state = 6
+
+ if state == 5:
+ uuids[arch] = uuid.upper()
+
+ if len(uuids) == 0:
+ print >> sys.stderr, "No UUIDs in %s" % macho
+
+ return uuids
+
+# Given a path to a Mach-O file and possible information from the environment,
+# determines the desired path to the .dSYM.
+def dsym_path(macho):
+ # If building a bundle, the .dSYM should be placed next to the bundle. Use
+ # WRAPPER_NAME to make this determination. If called from xcodebuild,
+ # WRAPPER_NAME will be set to the name of the bundle.
+ dsym = ""
+ if "WRAPPER_NAME" in os.environ:
+ if "BUILT_PRODUCTS_DIR" in os.environ:
+ dsym = os.path.join(os.environ["BUILT_PRODUCTS_DIR"],
+ os.environ["WRAPPER_NAME"])
+ else:
+ dsym = os.environ["WRAPPER_NAME"]
+ else:
+ dsym = macho
+
+ dsym += ".dSYM"
+
+ return dsym
+
+# Creates a fake .dSYM bundle at dsym for macho, a Mach-O image with the
+# architectures and UUIDs specified by the uuids map.
+def make_fake_dsym(macho, dsym):
+ uuids = macho_uuids(macho)
+ if len(uuids) == 0:
+ return False
+
+ dwarf_dir = os.path.join(dsym, "Contents", "Resources", "DWARF")
+ dwarf_file = os.path.join(dwarf_dir, os.path.basename(macho))
+ try:
+ os.makedirs(dwarf_dir)
+ except OSError, (err, error_string):
+ if err != errno.EEXIST:
+ raise
+ shutil.copyfile(macho, dwarf_file)
+
+ # info_template is the same as what dsymutil would have written, with the
+ # addition of the fake_dsym key.
+ info_template = \
+'''<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+ <dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.apple.xcode.dsym.%(root_name)s</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>dSYM</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleVersion</key>
+ <string>1</string>
+ <key>dSYM_UUID</key>
+ <dict>
+%(uuid_dict)s </dict>
+ <key>fake_dsym</key>
+ <true/>
+ </dict>
+</plist>
+'''
+
+ root_name = os.path.basename(dsym)[:-5] # whatever.dSYM without .dSYM
+ uuid_dict = ""
+ for arch in sorted(uuids):
+ uuid_dict += "\t\t\t<key>" + arch + "</key>\n"\
+ "\t\t\t<string>" + uuids[arch] + "</string>\n"
+ info_dict = {
+ "root_name": root_name,
+ "uuid_dict": uuid_dict,
+ }
+ info_contents = info_template % info_dict
+ info_file = os.path.join(dsym, "Contents", "Info.plist")
+ info_fd = open(info_file, "w")
+ info_fd.write(info_contents)
+ info_fd.close()
+
+ return True
+
+# For a Mach-O file, determines where the .dSYM bundle should be located. If
+# the bundle does not exist or has a modification time older than the Mach-O
+# file, calls make_fake_dsym to create a fake .dSYM bundle there, then strips
+# the Mach-O file and sets the modification time on the .dSYM bundle and Mach-O
+# file to be identical.
+def strip_and_make_fake_dsym(macho):
+ dsym = dsym_path(macho)
+ macho_stat = os.stat(macho)
+ dsym_stat = None
+ try:
+ dsym_stat = os.stat(dsym)
+ except OSError, (err, error_string):
+ if err != errno.ENOENT:
+ raise
+
+ if dsym_stat is None or dsym_stat.st_mtime < macho_stat.st_mtime:
+ # Make a .dSYM bundle
+ if not make_fake_dsym(macho, dsym):
+ return False
+
+ # Strip the Mach-O file
+ remove_dsym = True
+ try:
+ strip_path = ""
+ if "SYSTEM_DEVELOPER_BIN_DIR" in os.environ:
+ strip_path = os.environ["SYSTEM_DEVELOPER_BIN_DIR"]
+ else:
+ strip_path = "/usr/bin"
+ strip_path = os.path.join(strip_path, "strip")
+ strip_cmdline = [strip_path] + sys.argv[1:]
+ # Print the strip invocation so that it's obvious something is happening
+ print " ".join(strip_cmdline)
+ strip_cmd = subprocess.Popen(strip_cmdline)
+ if strip_cmd.wait() == 0:
+ remove_dsym = False
+ finally:
+ if remove_dsym:
+ shutil.rmtree(dsym)
+
+ # Update modification time on the Mach-O file and .dSYM bundle
+ now = time.time()
+ os.utime(macho, (now, now))
+ os.utime(dsym, (now, now))
+
+ return True
+
+def main(argv=None):
+ if argv is None:
+ argv = sys.argv
+
+ # This only supports operating on one file at a time. Look at the arguments
+ # to strip to figure out what the source to be stripped is. Arguments are
+ # processed in the same way that strip does, although to reduce complexity,
+ # this doesn't do all of the same checking as strip. For example, strip
+ # has no -Z switch and would treat -Z on the command line as an error. For
+ # the purposes this is needed for, that's fine.
+ macho = None
+ process_switches = True
+ ignore_argument = False
+ for arg in argv[1:]:
+ if ignore_argument:
+ ignore_argument = False
+ continue
+ if process_switches:
+ if arg == "-":
+ process_switches = False
+ # strip has these switches accept an argument:
+ if arg in ["-s", "-R", "-d", "-o", "-arch"]:
+ ignore_argument = True
+ if arg[0] == "-":
+ continue
+ if macho is None:
+ macho = arg
+ else:
+ print >> sys.stderr, "Too many things to strip"
+ return 1
+
+ if macho is None:
+ print >> sys.stderr, "Nothing to strip"
+ return 1
+
+ if not strip_and_make_fake_dsym(macho):
+ return 1
+
+ return 0
+
+if __name__ == "__main__":
+ sys.exit(main(sys.argv))
diff --git a/build/output_dll_copy.rules b/build/output_dll_copy.rules
new file mode 100644
index 0000000..c6e9051
--- /dev/null
+++ b/build/output_dll_copy.rules
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<VisualStudioToolFile
+ Name="Output DLL copy"
+ Version="8.00"
+ >
+ <Rules>
+ <CustomBuildRule
+ Name="Output DLL copy"
+ CommandLine="xcopy /R /C /Y $(InputPath) $(OutDir)"
+ Outputs="$(OutDir)\$(InputFileName)"
+ FileExtensions="*.dll"
+ >
+ <Properties>
+ </Properties>
+ </CustomBuildRule>
+ </Rules>
+</VisualStudioToolFile>
diff --git a/build/release.gypi b/build/release.gypi
new file mode 100644
index 0000000..c12526b
--- /dev/null
+++ b/build/release.gypi
@@ -0,0 +1,19 @@
+{
+ 'conditions': [
+ # Handle build types.
+ ['buildtype=="Dev"', {
+ 'includes': ['internal/release_impl.gypi'],
+ }],
+ ['buildtype=="Official"', {
+ 'includes': ['internal/release_impl_official.gypi'],
+ }],
+ # TODO(bradnelson): may also need:
+ # checksenabled
+ # coverage
+ # dom_stats
+ # pgo_instrument
+ # pgo_optimize
+ # purify
+ ],
+}
+
diff --git a/build/sanitize-mac-build-log.sed b/build/sanitize-mac-build-log.sed
new file mode 100644
index 0000000..2de72bf
--- /dev/null
+++ b/build/sanitize-mac-build-log.sed
@@ -0,0 +1,32 @@
+#!/bin/echo Use sanitize-mac-build-log.sh or sed -f
+
+# Copyright (c) 2011 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.
+
+# Use this sed script to reduce a Mac build log into something readable.
+
+# Drop uninformative lines.
+/^distcc/d
+/^Check dependencies/d
+/^ setenv /d
+/^ cd /d
+/^make: Nothing to be done/d
+/^$/d
+
+# Xcode prints a short "compiling foobar.o" line followed by the lengthy
+# full command line. These deletions drop the command line.
+\|^ /Developer/usr/bin/|d
+\|^ /Developer/Library/PrivateFrameworks/DevToolsCore.framework/|d
+\|^ /Developer/Library/Xcode/Plug-ins/CoreBuildTasks.xcplugin/|d
+
+# And, if you've overridden something from your own bin directory, remove those
+# full command lines, too.
+\|^ /Users/[^/]*/bin/|d
+
+# There's already a nice note for bindings, don't need the command line.
+\|^python scripts/rule_binding.py|d
+
+# Shorten the "compiling foobar.o" line.
+s|^Distributed-CompileC \(.*\) normal i386 c++ com.apple.compilers.gcc.4_2| CC \1|
+s|^CompileC \(.*\) normal i386 c++ com.apple.compilers.gcc.4_2| CC \1|
diff --git a/build/sanitize-mac-build-log.sh b/build/sanitize-mac-build-log.sh
new file mode 100755
index 0000000..dc743fa
--- /dev/null
+++ b/build/sanitize-mac-build-log.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+# Copyright (c) 2010 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.
+sed -f `dirname "${0}"`/`basename "${0}" sh`sed
+
diff --git a/build/sanitize-win-build-log.sed b/build/sanitize-win-build-log.sed
new file mode 100644
index 0000000..d6d049c
--- /dev/null
+++ b/build/sanitize-win-build-log.sed
@@ -0,0 +1,14 @@
+#!/bin/echo Use sanitize-win-build-log.sh or sed -f
+
+# Copyright (c) 2010 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.
+
+# Use this sed script to reduce a Windows build log into something
+# machine-parsable.
+
+# Drop uninformative lines.
+/The operation completed successfully./d
+
+# Drop parallelization indicators on lines.
+s/^[0-9]\+>//
diff --git a/build/sanitize-win-build-log.sh b/build/sanitize-win-build-log.sh
new file mode 100755
index 0000000..dc743fa
--- /dev/null
+++ b/build/sanitize-win-build-log.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+# Copyright (c) 2010 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.
+sed -f `dirname "${0}"`/`basename "${0}" sh`sed
+
diff --git a/build/temp_gyp/README.chromium b/build/temp_gyp/README.chromium
new file mode 100644
index 0000000..8045d61
--- /dev/null
+++ b/build/temp_gyp/README.chromium
@@ -0,0 +1,3 @@
+This directory will be removed once the files in it are committed upstream and
+Chromium imports an upstream revision with these files. Contact mark for
+details.
diff --git a/build/temp_gyp/googleurl.gyp b/build/temp_gyp/googleurl.gyp
new file mode 100644
index 0000000..8bf7cce
--- /dev/null
+++ b/build/temp_gyp/googleurl.gyp
@@ -0,0 +1,116 @@
+# Copyright (c) 2009 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.
+
+# TODO(mark): Upstream this file to googleurl.
+{
+ 'variables': {
+ 'chromium_code': 1,
+ },
+ 'targets': [
+ {
+ 'target_name': 'googleurl',
+ 'type': '<(component)',
+ 'msvs_guid': 'EF5E94AB-B646-4E5B-A058-52EF07B8351C',
+ 'dependencies': [
+ '../../base/base.gyp:base',
+ '../../third_party/icu/icu.gyp:icudata',
+ '../../third_party/icu/icu.gyp:icui18n',
+ '../../third_party/icu/icu.gyp:icuuc',
+ ],
+ 'sources': [
+ '../../googleurl/src/gurl.cc',
+ '../../googleurl/src/gurl.h',
+ '../../googleurl/src/url_canon.h',
+ '../../googleurl/src/url_canon_etc.cc',
+ '../../googleurl/src/url_canon_fileurl.cc',
+ '../../googleurl/src/url_canon_host.cc',
+ '../../googleurl/src/url_canon_icu.cc',
+ '../../googleurl/src/url_canon_icu.h',
+ '../../googleurl/src/url_canon_internal.cc',
+ '../../googleurl/src/url_canon_internal.h',
+ '../../googleurl/src/url_canon_internal_file.h',
+ '../../googleurl/src/url_canon_ip.cc',
+ '../../googleurl/src/url_canon_ip.h',
+ '../../googleurl/src/url_canon_mailtourl.cc',
+ '../../googleurl/src/url_canon_path.cc',
+ '../../googleurl/src/url_canon_pathurl.cc',
+ '../../googleurl/src/url_canon_query.cc',
+ '../../googleurl/src/url_canon_relative.cc',
+ '../../googleurl/src/url_canon_stdstring.h',
+ '../../googleurl/src/url_canon_stdurl.cc',
+ '../../googleurl/src/url_file.h',
+ '../../googleurl/src/url_parse.cc',
+ '../../googleurl/src/url_parse.h',
+ '../../googleurl/src/url_parse_file.cc',
+ '../../googleurl/src/url_parse_internal.h',
+ '../../googleurl/src/url_util.cc',
+ '../../googleurl/src/url_util.h',
+ ],
+ 'direct_dependent_settings': {
+ 'include_dirs': [
+ '../..',
+ ],
+ },
+ 'conditions': [
+ ['OS=="win" and component=="shared_library"', {
+ 'defines': [
+ 'GURL_DLL',
+ 'GURL_IMPLEMENTATION=1',
+ ],
+ 'direct_dependent_settings': {
+ 'defines': [
+ 'GURL_DLL',
+ ],
+ },
+ }],
+ ],
+ },
+ {
+ 'target_name': 'googleurl_unittests',
+ 'dependencies': [
+ 'googleurl',
+ '../../base/base.gyp:base_i18n',
+ '../../base/base.gyp:test_support_base',
+ '../../testing/gtest.gyp:gtest',
+ '../../third_party/icu/icu.gyp:icuuc',
+ ],
+ 'sources': [
+ '../../googleurl/src/gurl_unittest.cc',
+ '../../googleurl/src/url_canon_unittest.cc',
+ '../../googleurl/src/url_parse_unittest.cc',
+ '../../googleurl/src/url_test_utils.h',
+ '../../googleurl/src/url_util_unittest.cc',
+ # Make sure base and ICU are started up the 'Chromium way' since the
+ # build is using the Chromium base & ICU.
+ '../../base/test/run_all_unittests.cc',
+ ],
+ 'conditions': [
+ ['OS=="linux" or OS=="freebsd"', {
+ 'conditions': [
+ ['linux_use_tcmalloc==1', {
+ 'dependencies': [
+ '../../base/allocator/allocator.gyp:allocator',
+ ],
+ }],
+ ],
+ }],
+ # TODO(victorw): The unittest code uses inline functions that access
+ # global variables, it also uses internal functions that we may not want
+ # to export, so skip building unittests for windows multi dll build.
+ # The googleurl functions are tested by the static library build.
+ ['OS=="win" and component=="shared_library"', {
+ 'type': 'none',
+ }, {
+ 'type': 'executable',
+ }],
+ ],
+ },
+ ],
+}
+
+# Local Variables:
+# tab-width:2
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/build/temp_gyp/pdfsqueeze.gyp b/build/temp_gyp/pdfsqueeze.gyp
new file mode 100644
index 0000000..d7a742c
--- /dev/null
+++ b/build/temp_gyp/pdfsqueeze.gyp
@@ -0,0 +1,46 @@
+# Copyright (c) 2009 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.
+
+{
+ 'targets': [
+ {
+ 'target_name': 'pdfsqueeze',
+ 'type': 'executable',
+ 'sources': [
+ '../../third_party/pdfsqueeze/pdfsqueeze.m',
+ ],
+ 'defines': [
+ # Use defines to map the full path names that will be used for
+ # the vars into the short forms expected by pdfsqueeze.m.
+ '______third_party_pdfsqueeze_ApplyGenericRGB_qfilter=ApplyGenericRGB_qfilter',
+ '______third_party_pdfsqueeze_ApplyGenericRGB_qfilter_len=ApplyGenericRGB_qfilter_len',
+ ],
+ 'include_dirs': [
+ '<(INTERMEDIATE_DIR)',
+ ],
+ 'libraries': [
+ '$(SDKROOT)/System/Library/Frameworks/Foundation.framework',
+ '$(SDKROOT)/System/Library/Frameworks/Quartz.framework',
+ ],
+ 'actions': [
+ {
+ 'action_name': 'Generate inline filter data',
+ 'inputs': [
+ '../../third_party/pdfsqueeze/ApplyGenericRGB.qfilter',
+ ],
+ 'outputs': [
+ '<(INTERMEDIATE_DIR)/ApplyGenericRGB.h',
+ ],
+ 'action': ['xxd', '-i', '<@(_inputs)', '<@(_outputs)'],
+ },
+ ],
+ },
+ ],
+}
+
+# Local Variables:
+# tab-width:2
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/build/util/build_util.gyp b/build/util/build_util.gyp
new file mode 100644
index 0000000..a909177
--- /dev/null
+++ b/build/util/build_util.gyp
@@ -0,0 +1,43 @@
+# Copyright (c) 2009 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.
+
+{
+ 'targets': [
+ {
+ 'target_name': 'lastchange',
+ 'type': 'none',
+ 'variables': {
+ 'lastchange_out_path': '<(SHARED_INTERMEDIATE_DIR)/build/LASTCHANGE',
+ 'default_lastchange_path': '../LASTCHANGE.in',
+ },
+ 'actions': [
+ {
+ 'action_name': 'lastchange',
+ 'inputs': [
+ # Note: <(default_lastchange_path) is optional,
+ # so it doesn't show up in inputs.
+ './lastchange.py',
+ ],
+ 'outputs': [
+ '<(lastchange_out_path).always',
+ '<(lastchange_out_path)',
+ ],
+ 'action': [
+ 'python', '<@(_inputs)',
+ '-o', '<(lastchange_out_path)',
+ '-d', '<(default_lastchange_path)',
+ ],
+ 'message': 'Extracting last change to <(lastchange_out_path)',
+ 'process_outputs_as_sources': '1',
+ },
+ ],
+ },
+ ]
+}
+
+# Local Variables:
+# tab-width:2
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/build/util/lastchange.py b/build/util/lastchange.py
new file mode 100755
index 0000000..4d7a1fe
--- /dev/null
+++ b/build/util/lastchange.py
@@ -0,0 +1,286 @@
+#!/usr/bin/env python
+# Copyright (c) 2011 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.
+
+"""
+lastchange.py -- Chromium revision fetching utility.
+"""
+
+import re
+import optparse
+import os
+import subprocess
+import sys
+
+class VersionInfo(object):
+ def __init__(self, url, root, revision):
+ self.url = url
+ self.root = root
+ self.revision = revision
+
+
+def FetchSVNRevision(directory):
+ """
+ Fetch the Subversion branch and revision for a given directory.
+
+ Errors are swallowed.
+
+ Returns:
+ a VersionInfo object or None on error.
+ """
+ try:
+ proc = subprocess.Popen(['svn', 'info'],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ cwd=directory,
+ shell=(sys.platform=='win32'))
+ except OSError:
+ # command is apparently either not installed or not executable.
+ return None
+ if not proc:
+ return None
+
+ attrs = {}
+ for line in proc.stdout:
+ line = line.strip()
+ if not line:
+ continue
+ key, val = line.split(': ', 1)
+ attrs[key] = val
+
+ try:
+ url = attrs['URL']
+ root = attrs['Repository Root']
+ revision = attrs['Revision']
+ except KeyError:
+ return None
+
+ return VersionInfo(url, root, revision)
+
+
+def RunGitCommand(directory, command):
+ """
+ Launches git subcommand.
+
+ Errors are swallowed.
+
+ Returns:
+ process object or None.
+ """
+ command = ['git'] + command
+ # Force shell usage under cygwin & win32. This is a workaround for
+ # mysterious loss of cwd while invoking cygwin's git.
+ # We can't just pass shell=True to Popen, as under win32 this will
+ # cause CMD to be used, while we explicitly want a cygwin shell.
+ if sys.platform in ('cygwin', 'win32'):
+ command = ['sh', '-c', ' '.join(command)]
+ try:
+ proc = subprocess.Popen(command,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ cwd=directory)
+ return proc
+ except OSError:
+ return None
+
+
+def FetchGitRevision(directory):
+ """
+ Fetch the Git hash for a given directory.
+
+ Errors are swallowed.
+
+ Returns:
+ a VersionInfo object or None on error.
+ """
+ proc = RunGitCommand(directory, ['rev-parse', 'HEAD'])
+ if proc:
+ output = proc.communicate()[0].strip()
+ if proc.returncode == 0 and output:
+ return VersionInfo('git', 'git', output[:7])
+ return None
+
+
+def IsGitSVN(directory):
+ """
+ Checks whether git-svn has been set up.
+
+ Errors are swallowed.
+
+ Returns:
+ whether git-svn has been set up.
+ """
+ # To test whether git-svn has been set up, query the config for any
+ # svn-related configuration. This command exits with an error code
+ # if there aren't any matches, so ignore its output.
+ proc = RunGitCommand(directory, ['config', '--get-regexp', '^svn'])
+ if proc:
+ return (proc.wait() == 0)
+ return False
+
+
+def FetchGitSVNURL(directory):
+ """
+ Fetch URL of SVN repository bound to git.
+
+ Errors are swallowed.
+
+ Returns:
+ SVN URL.
+ """
+ if IsGitSVN(directory):
+ proc = RunGitCommand(directory, ['svn', 'info', '--url'])
+ if proc:
+ output = proc.communicate()[0].strip()
+ if proc.returncode == 0:
+ match = re.search(r'^\w+://.*$', output, re.M)
+ if match:
+ return match.group(0)
+ return ''
+
+
+def FetchGitSVNRoot(directory):
+ """
+ Fetch root of SVN repository bound to git.
+
+ Errors are swallowed.
+
+ Returns:
+ SVN root repository.
+ """
+ if IsGitSVN(directory):
+ git_command = ['config', '--get-regexp', '^svn-remote.svn.url$']
+ proc = RunGitCommand(directory, git_command)
+ if proc:
+ output = proc.communicate()[0].strip()
+ if proc.returncode == 0:
+ # Zero return code implies presence of requested configuration variable.
+ # Its value is second (last) field of output.
+ match = re.search(r'\S+$', output)
+ if match:
+ return match.group(0)
+ return ''
+
+
+def LookupGitSVNRevision(directory, depth):
+ """
+ Fetch the Git-SVN identifier for the local tree.
+ Parses first |depth| commit messages.
+
+ Errors are swallowed.
+ """
+ if not IsGitSVN(directory):
+ return None
+ git_re = re.compile(r'^\s*git-svn-id:\s+(\S+)@(\d+)')
+ proc = RunGitCommand(directory, ['log', '-' + str(depth)])
+ if proc:
+ for line in proc.stdout:
+ match = git_re.match(line)
+ if match:
+ id = match.group(2)
+ if id:
+ proc.stdout.close() # Cut pipe for fast exit.
+ return id
+ return None
+
+
+def IsGitSVNDirty(directory):
+ """
+ Checks whether our git-svn tree contains clean trunk or some branch.
+
+ Errors are swallowed.
+ """
+ # For git branches the last commit message is either
+ # some local commit or a merge.
+ return LookupGitSVNRevision(directory, 1) is None
+
+
+def FetchGitSVNRevision(directory):
+ """
+ Fetch the Git-SVN identifier for the local tree.
+
+ Errors are swallowed.
+ """
+ # We assume that at least first 999 commit messages contain svn evidence.
+ revision = LookupGitSVNRevision(directory, 999)
+ if not revision:
+ return None
+ if IsGitSVNDirty(directory):
+ revision = revision + '-dirty'
+ url = FetchGitSVNURL(directory)
+ root = FetchGitSVNRoot(directory)
+ return VersionInfo(url, root, revision)
+
+
+def FetchVersionInfo(default_lastchange, directory=None):
+ """
+ Returns the last change (in the form of a branch, revision tuple),
+ from some appropriate revision control system.
+ """
+ version_info = (FetchSVNRevision(directory) or
+ FetchGitSVNRevision(directory) or FetchGitRevision(directory))
+ if not version_info:
+ if default_lastchange and os.path.exists(default_lastchange):
+ revision = open(default_lastchange, 'r').read().strip()
+ version_info = VersionInfo(None, None, revision)
+ else:
+ version_info = VersionInfo('unknown', '', '0')
+ return version_info
+
+
+def WriteIfChanged(file_name, contents):
+ """
+ Writes the specified contents to the specified file_name
+ iff the contents are different than the current contents.
+ """
+ try:
+ old_contents = open(file_name, 'r').read()
+ except EnvironmentError:
+ pass
+ else:
+ if contents == old_contents:
+ return
+ os.unlink(file_name)
+ open(file_name, 'w').write(contents)
+
+
+def main(argv=None):
+ if argv is None:
+ argv = sys.argv
+
+ parser = optparse.OptionParser(usage="lastchange.py [options]")
+ parser.add_option("-d", "--default-lastchange", metavar="FILE",
+ help="default last change input FILE")
+ parser.add_option("-o", "--output", metavar="FILE",
+ help="write last change to FILE")
+ parser.add_option("--revision-only", action='store_true',
+ help="just print the SVN revision number")
+ opts, args = parser.parse_args(argv[1:])
+
+ out_file = opts.output
+
+ while len(args) and out_file is None:
+ if out_file is None:
+ out_file = args.pop(0)
+ if args:
+ sys.stderr.write('Unexpected arguments: %r\n\n' % args)
+ parser.print_help()
+ sys.exit(2)
+
+ version_info = FetchVersionInfo(opts.default_lastchange)
+
+ if opts.revision_only:
+ print version_info.revision
+ else:
+ contents = "LASTCHANGE=%s\n" % version_info.revision
+ if out_file:
+ WriteIfChanged(out_file, contents)
+ else:
+ sys.stdout.write(contents)
+
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/build/util/support/support.gyp b/build/util/support/support.gyp
new file mode 100644
index 0000000..5840f80
--- /dev/null
+++ b/build/util/support/support.gyp
@@ -0,0 +1,21 @@
+# Copyright (c) 2009 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.
+
+{
+ 'variables': {
+ 'chromium_code': 1,
+ },
+ 'includes': [
+ '../../common.gypi',
+ ],
+ 'targets': [
+ {
+ 'target_name': 'support',
+ 'type': 'none',
+ },
+ # TODO(slightlyoff)
+ ],
+}
+
+# vim: shiftwidth=2:et:ai:tabstop=2
diff --git a/build/whitespace_file.txt b/build/whitespace_file.txt
new file mode 100644
index 0000000..28040e3
--- /dev/null
+++ b/build/whitespace_file.txt
@@ -0,0 +1,11 @@
+Copyright (c) 2011 The Chromium Authors. All rights reserved.
+Use of this useless file is governed by a BSD-style license that can be
+found in the LICENSE file.
+
+This file is used for making non-code changes to trigger buildbot cycles. Make
+any modification below this line.
+================================================================================
+
+i am somewhat YELLY BELLY!
+
+<<< All your base are belong to us. >>>
diff --git a/build/win/chrome_win.croc b/build/win/chrome_win.croc
new file mode 100644
index 0000000..e1e3bb7
--- /dev/null
+++ b/build/win/chrome_win.croc
@@ -0,0 +1,26 @@
+# -*- python -*-
+# Crocodile config file for Chromium windows
+
+{
+ # List of rules, applied in order
+ 'rules' : [
+ # Specify inclusions before exclusions, since rules are in order.
+
+ # Don't include chromeos, posix, or linux specific files
+ {
+ 'regexp' : '.*(_|/)(chromeos|linux|posix)(\\.|_)',
+ 'include' : 0,
+ },
+ # Don't include ChromeOS dirs
+ {
+ 'regexp' : '.*/chromeos/',
+ 'include' : 0,
+ },
+
+ # Groups
+ {
+ 'regexp' : '.*_test_win\\.',
+ 'group' : 'test',
+ },
+ ],
+}
diff --git a/build/win/system.gyp b/build/win/system.gyp
new file mode 100644
index 0000000..0c06849
--- /dev/null
+++ b/build/win/system.gyp
@@ -0,0 +1,33 @@
+# Copyright (c) 2009 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.
+
+{
+ 'targets': [
+ {
+ 'target_name': 'cygwin',
+ 'type': 'none',
+ 'actions': [
+ {
+ 'action_name': 'setup_mount',
+ 'msvs_cygwin_shell': 0,
+ 'inputs': [
+ '../../third_party/cygwin/setup_mount.bat',
+ ],
+ # Visual Studio requires an output file, or else the
+ # custom build step won't run.
+ 'outputs': [
+ '../../third_party/cygwin/_always_run_setup_mount.marker',
+ ],
+ 'action': ['', '<@(_inputs)'],
+ },
+ ],
+ },
+ ],
+}
+
+# Local Variables:
+# tab-width:2
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/chrome/browser/chrome_browser_application_mac.mm b/chrome/browser/chrome_browser_application_mac.mm
index 7ba8cda..601d9c4 100644
--- a/chrome/browser/chrome_browser_application_mac.mm
+++ b/chrome/browser/chrome_browser_application_mac.mm
@@ -7,6 +7,7 @@
#import "base/logging.h"
#import "base/metrics/histogram.h"
#import "base/memory/scoped_nsobject.h"
+#include "base/sys_info.h"
#import "base/sys_string_conversions.h"
#import "chrome/app/breakpad_mac.h"
#import "chrome/browser/app_controller_mac.h"
@@ -194,9 +195,15 @@ BOOL SwizzleNSExceptionInit() {
@implementation BrowserCrApplication
+ (void)initialize {
- // Turn all deallocated Objective-C objects into zombies, keeping
- // the most recent 10,000 of them on the treadmill.
- ObjcEvilDoers::ZombieEnable(YES, 10000);
+ // Whitelist releases that are compatible with objc zombies.
+ int32 major_version = 0, minor_version = 0, bugfix_version = 0;
+ base::SysInfo::OperatingSystemVersionNumbers(
+ &major_version, &minor_version, &bugfix_version);
+ if (major_version == 10 && (minor_version == 5 || minor_version == 6)) {
+ // Turn all deallocated Objective-C objects into zombies, keeping
+ // the most recent 10,000 of them on the treadmill.
+ ObjcEvilDoers::ZombieEnable(YES, 10000);
+ }
}
- init {
diff --git a/chrome/browser/chromeos/cros/network_library.cc b/chrome/browser/chromeos/cros/network_library.cc
index 31ebe0e..85e0f94 100644
--- a/chrome/browser/chromeos/cros/network_library.cc
+++ b/chrome/browser/chromeos/cros/network_library.cc
@@ -679,7 +679,7 @@ static ConnectionError ParseError(const std::string& error) {
{ kErrorAaaFailed, ERROR_AAA_FAILED },
};
static StringToEnum<ConnectionError> parser(
- table, arraysize(table), ERROR_UNKNOWN);
+ table, arraysize(table), ERROR_NO_ERROR);
return parser.Get(error);
}
@@ -1201,8 +1201,9 @@ std::string Network::GetStateString() const {
std::string Network::GetErrorString() const {
switch (error_) {
- case ERROR_UNKNOWN:
- return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_UNKNOWN);
+ case ERROR_NO_ERROR:
+ // TODO(nkostylev): Introduce new error message "None" instead.
+ return std::string();
case ERROR_OUT_OF_RANGE:
return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_OUT_OF_RANGE);
case ERROR_PIN_MISSING:
diff --git a/chrome/browser/chromeos/cros/network_library.h b/chrome/browser/chromeos/cros/network_library.h
index 77d6c46..e485660 100644
--- a/chrome/browser/chromeos/cros/network_library.h
+++ b/chrome/browser/chromeos/cros/network_library.h
@@ -129,7 +129,7 @@ enum PinOperationError {
// connection errors (see flimflam/include/service.h)
enum ConnectionError {
- ERROR_UNKNOWN = 0,
+ ERROR_NO_ERROR = 0,
ERROR_OUT_OF_RANGE = 1,
ERROR_PIN_MISSING = 2,
ERROR_DHCP_FAILED = 3,
@@ -329,7 +329,7 @@ class Network {
protected:
Network(const std::string& service_path, ConnectionType type)
: state_(STATE_UNKNOWN),
- error_(ERROR_UNKNOWN),
+ error_(ERROR_NO_ERROR),
connectable_(true),
is_active_(false),
favorite_(false),
diff --git a/chrome/browser/chromeos/login/existing_user_controller.cc b/chrome/browser/chromeos/login/existing_user_controller.cc
index 6b58f77..7f05eb3 100644
--- a/chrome/browser/chromeos/login/existing_user_controller.cc
+++ b/chrome/browser/chromeos/login/existing_user_controller.cc
@@ -393,12 +393,13 @@ void ExistingUserController::OnPasswordChangeDetected(
// Another attempt will be invoked after verification completion.
return;
}
- // TODO(altimofeev): remove this constrain when full sync for the owner will
- // be correctly handled.
- bool full_sync_disabled = (UserCrosSettingsProvider::cached_owner() ==
- last_login_attempt_username_);
- PasswordChangedView* view = new PasswordChangedView(this, full_sync_disabled);
+ // Passing 'false' here enables "full sync" mode in the dialog,
+ // which disables the requirement for the old owner password,
+ // allowing us to recover from a lost owner password/homedir.
+ // TODO(gspencer): We shouldn't have to erase stateful data when
+ // doing this. See http://crosbug.com/9115 http://crosbug.com/7792
+ PasswordChangedView* view = new PasswordChangedView(this, false);
views::Window* window = browser::CreateViewsWindow(GetNativeWindow(),
gfx::Rect(),
view);
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc
index 9cd4a4f..1e88799 100644
--- a/chrome/browser/chromeos/login/wizard_controller.cc
+++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -496,11 +496,6 @@ void WizardController::OnEulaAccepted() {
MarkEulaAccepted();
chromeos::MetricsCrosSettingsProvider::SetMetricsStatus(
usage_statistics_reporting_);
- if (chromeos::CrosLibrary::Get()->EnsureLoaded()) {
- // TPM password could be seen on EULA screen, now it's safe to clear it.
- chromeos::CrosLibrary::Get()->
- GetCryptohomeLibrary()->TpmClearStoredPassword();
- }
InitiateOOBEUpdate();
}
diff --git a/chrome/browser/download/download_extensions.cc b/chrome/browser/download/download_extensions.cc
index b9cac1b..90f704a 100644
--- a/chrome/browser/download/download_extensions.cc
+++ b/chrome/browser/download/download_extensions.cc
@@ -105,6 +105,7 @@ static const struct Executables {
{ "drv", Dangerous },
{ "exe", AllowOnUserGesture },
{ "fxp", AllowOnUserGesture },
+ { "grp", Dangerous },
{ "hlp", AllowOnUserGesture },
{ "hta", AllowOnUserGesture },
{ "htt", AllowOnUserGesture },
diff --git a/chrome/browser/download/download_manager.cc b/chrome/browser/download/download_manager.cc
index 7155001..02e554a 100644
--- a/chrome/browser/download/download_manager.cc
+++ b/chrome/browser/download/download_manager.cc
@@ -539,7 +539,12 @@ void DownloadManager::OnResponseCompleted(int32 download_id,
int os_error,
const std::string& hash) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (os_error == 0) {
+ // ERR_CONNECTION_CLOSED is allowed since a number of servers in the wild
+ // advertise a larger Content-Length than the amount of bytes in the message
+ // body, and then close the connection. Other browsers - IE8, Firefox 4.0.1,
+ // and Safari 5.0.4 - treat the download as complete in this case, so we
+ // follow their lead.
+ if (os_error == 0 || os_error == net::ERR_CONNECTION_CLOSED) {
OnAllDataSaved(download_id, size, hash);
} else {
OnDownloadError(download_id, size, os_error);
diff --git a/chrome/browser/importer/firefox2_importer.cc b/chrome/browser/importer/firefox2_importer.cc
index f0dbcfd..9b1b4f2 100644
--- a/chrome/browser/importer/firefox2_importer.cc
+++ b/chrome/browser/importer/firefox2_importer.cc
@@ -266,9 +266,11 @@ void Firefox2Importer::ImportBookmarksFile(
entry.title = folder_title;
if (import_to_bookmark_bar && toolbar_folder) {
// Flatten the folder in toolbar.
- entry.in_toolbar = true;
- entry.path.assign(path.begin() + toolbar_folder, path.end());
- toolbar_bookmarks.push_back(entry);
+ if (toolbar_folder <= path.size()) {
+ entry.in_toolbar = true;
+ entry.path.assign(path.begin() + toolbar_folder, path.end());
+ toolbar_bookmarks.push_back(entry);
+ }
} else {
// Insert the folder into the "Imported from Firefox" folder.
entry.path.assign(path.begin(), path.end());
diff --git a/chrome/browser/password_manager/password_manager_unittest.cc b/chrome/browser/password_manager/password_manager_unittest.cc
index 0db4973..a22d81b 100644
--- a/chrome/browser/password_manager/password_manager_unittest.cc
+++ b/chrome/browser/password_manager/password_manager_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 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.
@@ -38,11 +38,14 @@ class TestingProfileWithPasswordStore : public TestingProfile {
public:
explicit TestingProfileWithPasswordStore(PasswordStore* store)
: store_(store) {}
+ virtual ~TestingProfileWithPasswordStore() {
+ store_->Shutdown();
+ }
virtual PasswordStore* GetPasswordStore(ServiceAccessType access) {
return store_;
}
private:
- PasswordStore* store_;
+ scoped_refptr<PasswordStore> store_;
};
class MockPasswordStore : public PasswordStore {
diff --git a/chrome/browser/password_manager/password_store.cc b/chrome/browser/password_manager/password_store.cc
index 4d00b23..09ed969 100644
--- a/chrome/browser/password_manager/password_store.cc
+++ b/chrome/browser/password_manager/password_store.cc
@@ -34,6 +34,9 @@ bool PasswordStore::Init() {
return true;
}
+void PasswordStore::Shutdown() {
+}
+
void PasswordStore::AddLogin(const PasswordForm& form) {
Task* task = NewRunnableMethod(this, &PasswordStore::AddLoginImpl, form);
ScheduleTask(
@@ -98,6 +101,7 @@ PasswordStore::GetLoginsRequest* PasswordStore::NewGetLoginsRequest(
void PasswordStore::ScheduleTask(Task* task) {
BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, task);
}
+
void PasswordStore::ForwardLoginsResult(GetLoginsRequest* request) {
request->ForwardResult(GetLoginsRequest::TupleType(request->handle(),
request->value));
diff --git a/chrome/browser/password_manager/password_store.h b/chrome/browser/password_manager/password_store.h
index 75a3e80..1e7f69d 100644
--- a/chrome/browser/password_manager/password_store.h
+++ b/chrome/browser/password_manager/password_store.h
@@ -74,6 +74,9 @@ class PasswordStore
// Reimplement this to add custom initialization. Always call this too.
virtual bool Init();
+ // Invoked from the profiles destructor to shutdown the PasswordStore.
+ virtual void Shutdown();
+
// Adds the given PasswordForm to the secure password store asynchronously.
virtual void AddLogin(const webkit_glue::PasswordForm& form);
diff --git a/chrome/browser/password_manager/password_store_default.cc b/chrome/browser/password_manager/password_store_default.cc
index 2be5207..d99ba4a 100644
--- a/chrome/browser/password_manager/password_store_default.cc
+++ b/chrome/browser/password_manager/password_store_default.cc
@@ -4,7 +4,7 @@
#include "chrome/browser/password_manager/password_store_default.h"
-#include <vector>
+#include <set>
#include "base/logging.h"
#include "base/stl_util-inl.h"
@@ -19,6 +19,85 @@
using webkit_glue::PasswordForm;
+// MigrateHelper handles migration from WebDB to PasswordStore. It runs
+// entirely on the UI thread and is owned by PasswordStoreDefault.
+class PasswordStoreDefault::MigrateHelper : public WebDataServiceConsumer {
+ public:
+ MigrateHelper(Profile* profile,
+ WebDataService* web_data_service,
+ PasswordStore* password_store)
+ : profile_(profile),
+ web_data_service_(web_data_service),
+ password_store_(password_store) {
+ }
+ ~MigrateHelper();
+
+ void Init();
+
+ // WebDataServiceConsumer:
+ virtual void OnWebDataServiceRequestDone(
+ WebDataService::Handle handle,
+ const WDTypedResult *result) OVERRIDE;
+
+ private:
+ typedef std::set<WebDataService::Handle> Handles;
+
+ Profile* profile_;
+
+ scoped_refptr<WebDataService> web_data_service_;
+
+ // This creates a cycle between us and PasswordStore. The cycle is broken
+ // from PasswordStoreDefault::Shutdown, which deletes us.
+ scoped_refptr<PasswordStore> password_store_;
+
+ // Set of handles from requesting data from the WebDB.
+ Handles handles_;
+
+ DISALLOW_COPY_AND_ASSIGN(MigrateHelper);
+};
+
+PasswordStoreDefault::MigrateHelper::~MigrateHelper() {
+ for (Handles::const_iterator i = handles_.begin(); i != handles_.end(); ++i)
+ web_data_service_->CancelRequest(*i);
+ handles_.clear();
+}
+
+void PasswordStoreDefault::MigrateHelper::Init() {
+ handles_.insert(web_data_service_->GetAutofillableLogins(this));
+ handles_.insert(web_data_service_->GetBlacklistLogins(this));
+}
+
+void PasswordStoreDefault::MigrateHelper::OnWebDataServiceRequestDone(
+ WebDataService::Handle handle,
+ const WDTypedResult* result) {
+ typedef std::vector<const PasswordForm*> PasswordForms;
+
+ DCHECK(handles_.end() != handles_.find(handle));
+ DCHECK(password_store_);
+
+ handles_.erase(handle);
+ if (!result)
+ return;
+
+ if (PASSWORD_RESULT != result->GetType()) {
+ NOTREACHED();
+ return;
+ }
+
+ const PasswordForms& forms =
+ static_cast<const WDResult<PasswordForms>*>(result)->GetValue();
+ for (PasswordForms::const_iterator it = forms.begin();
+ it != forms.end(); ++it) {
+ password_store_->AddLogin(**it);
+ web_data_service_->RemoveLogin(**it);
+ delete *it;
+ }
+ if (handles_.empty()) {
+ profile_->GetPrefs()->RegisterBooleanPref(prefs::kLoginDatabaseMigrated,
+ true);
+ }
+}
+
PasswordStoreDefault::PasswordStoreDefault(LoginDatabase* login_db,
Profile* profile,
WebDataService* web_data_service)
@@ -31,6 +110,13 @@ PasswordStoreDefault::PasswordStoreDefault(LoginDatabase* login_db,
}
PasswordStoreDefault::~PasswordStoreDefault() {
+ // MigrateHelper should always be NULL as Shutdown should be invoked before
+ // the destructor.
+ DCHECK(!migrate_helper_.get());
+}
+
+void PasswordStoreDefault::Shutdown() {
+ migrate_helper_.reset();
}
void PasswordStoreDefault::ReportMetricsImpl() {
@@ -125,36 +211,7 @@ void PasswordStoreDefault::MigrateIfNecessary() {
PrefService* prefs = profile_->GetPrefs();
if (prefs->FindPreference(prefs::kLoginDatabaseMigrated))
return;
- handles_.insert(web_data_service_->GetAutofillableLogins(this));
- handles_.insert(web_data_service_->GetBlacklistLogins(this));
-}
-
-typedef std::vector<const PasswordForm*> PasswordForms;
-
-void PasswordStoreDefault::OnWebDataServiceRequestDone(
- WebDataService::Handle handle,
- const WDTypedResult* result) {
- DCHECK(handles_.end() != handles_.find(handle));
-
- handles_.erase(handle);
- if (!result)
- return;
-
- if (PASSWORD_RESULT != result->GetType()) {
- NOTREACHED();
- return;
- }
-
- const PasswordForms& forms =
- static_cast<const WDResult<PasswordForms>*>(result)->GetValue();
- for (PasswordForms::const_iterator it = forms.begin();
- it != forms.end(); ++it) {
- AddLogin(**it);
- web_data_service_->RemoveLogin(**it);
- delete *it;
- }
- if (handles_.empty()) {
- profile_->GetPrefs()->RegisterBooleanPref(prefs::kLoginDatabaseMigrated,
- true);
- }
+ DCHECK(!migrate_helper_.get());
+ migrate_helper_.reset(new MigrateHelper(profile_, web_data_service_, this));
+ migrate_helper_->Init();
}
diff --git a/chrome/browser/password_manager/password_store_default.h b/chrome/browser/password_manager/password_store_default.h
index c819b14..4c6163a 100644
--- a/chrome/browser/password_manager/password_store_default.h
+++ b/chrome/browser/password_manager/password_store_default.h
@@ -6,21 +6,19 @@
#define CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_DEFAULT_H_
#pragma once
-#include <set>
#include <vector>
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/browser/password_manager/login_database.h"
#include "chrome/browser/password_manager/password_store.h"
-#include "chrome/browser/webdata/web_data_service.h"
class Profile;
+class WebDataService;
// Simple password store implementation that delegates everything to
// the LoginDatabase.
-class PasswordStoreDefault : public PasswordStore,
- public WebDataServiceConsumer {
+class PasswordStoreDefault : public PasswordStore {
public:
// Takes ownership of |login_db|.
PasswordStoreDefault(LoginDatabase* login_db,
@@ -31,6 +29,7 @@ class PasswordStoreDefault : public PasswordStore,
virtual ~PasswordStoreDefault();
// Implements PasswordStore interface.
+ virtual void Shutdown();
virtual void ReportMetricsImpl();
virtual void AddLoginImpl(const webkit_glue::PasswordForm& form);
virtual void UpdateLoginImpl(const webkit_glue::PasswordForm& form);
@@ -48,23 +47,21 @@ class PasswordStoreDefault : public PasswordStore,
scoped_refptr<WebDataService> web_data_service_;
- // Implements the WebDataService consumer interface.
- virtual void OnWebDataServiceRequestDone(WebDataService::Handle handle,
- const WDTypedResult *result);
-
protected:
inline bool DeleteAndRecreateDatabaseFile() {
return login_db_->DeleteAndRecreateDatabaseFile();
}
private:
+ class MigrateHelper;
+
// Migrates logins from the WDS to the LoginDatabase.
void MigrateIfNecessary();
scoped_ptr<LoginDatabase> login_db_;
Profile* profile_;
- std::set<WebDataService::Handle> handles_;
+ scoped_ptr<MigrateHelper> migrate_helper_;
DISALLOW_COPY_AND_ASSIGN(PasswordStoreDefault);
};
diff --git a/chrome/browser/password_manager/password_store_default_unittest.cc b/chrome/browser/password_manager/password_store_default_unittest.cc
index 19b70a1..212de2f 100644
--- a/chrome/browser/password_manager/password_store_default_unittest.cc
+++ b/chrome/browser/password_manager/password_store_default_unittest.cc
@@ -285,7 +285,7 @@ TEST_F(PasswordStoreDefaultTest, Migration) {
done.Wait();
// Initializing the PasswordStore should trigger a migration.
- scoped_refptr<PasswordStoreDefault> store(
+ scoped_refptr<PasswordStore> store(
new PasswordStoreDefault(login_db_.release(),
profile_.get(), wds_.get()));
store->Init();
@@ -364,6 +364,8 @@ TEST_F(PasswordStoreDefaultTest, Migration) {
STLDeleteElements(&expected_autofillable);
STLDeleteElements(&expected_blacklisted);
+
+ store->Shutdown();
}
TEST_F(PasswordStoreDefaultTest, MigrationAlreadyDone) {
@@ -400,7 +402,7 @@ TEST_F(PasswordStoreDefaultTest, MigrationAlreadyDone) {
true);
// Initializing the PasswordStore shouldn't trigger a migration.
- scoped_refptr<PasswordStoreDefault> store(
+ scoped_refptr<PasswordStore> store(
new PasswordStoreDefault(login_db_.release(), profile_.get(),
wds_.get()));
store->Init();
@@ -421,6 +423,8 @@ TEST_F(PasswordStoreDefaultTest, MigrationAlreadyDone) {
MessageLoop::current()->Run();
STLDeleteElements(&unexpected_autofillable);
+
+ store->Shutdown();
}
TEST_F(PasswordStoreDefaultTest, Notifications) {
@@ -429,7 +433,7 @@ TEST_F(PasswordStoreDefaultTest, Notifications) {
true);
// Initializing the PasswordStore shouldn't trigger a migration.
- scoped_refptr<PasswordStoreDefault> store(
+ scoped_refptr<PasswordStore> store(
new PasswordStoreDefault(login_db_.release(), profile_.get(),
wds_.get()));
store->Init();
@@ -511,4 +515,6 @@ TEST_F(PasswordStoreDefaultTest, Notifications) {
BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
new SignalingTask(&done));
done.Wait();
+
+ store->Shutdown();
}
diff --git a/chrome/browser/password_manager/password_store_mac_unittest.cc b/chrome/browser/password_manager/password_store_mac_unittest.cc
index 3deabb3..01a5b6f 100644
--- a/chrome/browser/password_manager/password_store_mac_unittest.cc
+++ b/chrome/browser/password_manager/password_store_mac_unittest.cc
@@ -913,6 +913,7 @@ class PasswordStoreMacTest : public testing::Test {
}
virtual void TearDown() {
+ store_->Shutdown();
MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask);
MessageLoop::current()->Run();
}
diff --git a/chrome/browser/password_manager/password_store_win.cc b/chrome/browser/password_manager/password_store_win.cc
index 415fbc4..a1100fc 100644
--- a/chrome/browser/password_manager/password_store_win.cc
+++ b/chrome/browser/password_manager/password_store_win.cc
@@ -4,12 +4,15 @@
#include "chrome/browser/password_manager/password_store_win.h"
+#include <map>
+
#include "base/logging.h"
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/password_manager/ie7_password.h"
#include "chrome/browser/password_manager/password_manager.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/webdata/web_data_service.h"
using webkit_glue::PasswordForm;
@@ -36,100 +39,73 @@ class FormGetLoginsRequest : public PasswordStore::GetLoginsRequest {
private:
scoped_ptr<PasswordForm> form_;
};
-}
-PasswordStoreWin::PasswordStoreWin(LoginDatabase* login_database,
- Profile* profile,
- WebDataService* web_data_service)
- : PasswordStoreDefault(login_database, profile, web_data_service) {
-}
-
-PasswordStoreWin::~PasswordStoreWin() {
- DCHECK(pending_requests_.empty() ||
- BrowserThread::CurrentlyOn(BrowserThread::DB));
+} // namespace
- for (PendingRequestMap::const_iterator it = pending_requests_.begin();
- it != pending_requests_.end(); ++it) {
- web_data_service_->CancelRequest(it->first);
+// Handles requests to WebDataService.
+class PasswordStoreWin::DBHandler : public WebDataServiceConsumer {
+ public:
+ DBHandler(WebDataService* web_data_service,
+ PasswordStoreWin* password_store)
+ : web_data_service_(web_data_service),
+ password_store_(password_store) {
}
-}
-PasswordStore::GetLoginsRequest* PasswordStoreWin::NewGetLoginsRequest(
- GetLoginsCallback* callback) {
- return new FormGetLoginsRequest(callback);
-}
+ ~DBHandler();
-void PasswordStoreWin::ForwardLoginsResult(GetLoginsRequest* request) {
- if (static_cast<FormGetLoginsRequest*>(request)->IsLoginsRequest() &&
- request->value.empty()) {
- IE7PasswordInfo info;
- std::wstring url = ASCIIToWide(
- static_cast<FormGetLoginsRequest*>(request)->form()->origin.spec());
- info.url_hash = ie7_password::GetUrlHash(url);
- WebDataService::Handle handle = web_data_service_->GetIE7Login(info,
- this);
- TrackRequest(handle, request);
- } else {
- PasswordStore::ForwardLoginsResult(request);
- }
-}
+ // Requests the IE7 login for |url| and |request|. This is async. The request
+ // is processed when complete.
+ void GetIE7Login(const GURL& url, GetLoginsRequest* request);
-void PasswordStoreWin::OnWebDataServiceRequestDone(
- WebDataService::Handle handle, const WDTypedResult* result) {
- if (!result)
- return; // The WDS returns NULL if it is shutting down.
+ private:
+ // Holds requests associated with in-flight GetLogin queries.
+ typedef std::map<WebDataService::Handle,
+ scoped_refptr<GetLoginsRequest> > PendingRequestMap;
- if (PASSWORD_IE7_RESULT == result->GetType()) {
- scoped_refptr<GetLoginsRequest> request(TakeRequestWithHandle(handle));
+ // Gets logins from IE7 if no others are found. Also copies them into
+ // Chrome's WebDatabase so we don't need to look next time.
+ PasswordForm* GetIE7Result(const WDTypedResult* result,
+ const PasswordForm& form);
- // If the request was cancelled, we are done.
- if (!request.get())
- return;
+ // WebDataServiceConsumer.
+ virtual void OnWebDataServiceRequestDone(
+ WebDataService::Handle handle,
+ const WDTypedResult* result) OVERRIDE;
- // This is a response from WebDataService::GetIE7Login.
- PasswordForm* form = static_cast<FormGetLoginsRequest*>(
- request.get())->form();
- DCHECK(form);
- PasswordForm* ie7_form = GetIE7Result(result, *form);
+ scoped_refptr<WebDataService> web_data_service_;
- if (ie7_form)
- request->value.push_back(ie7_form);
+ // This creates a cycle between us and PasswordStore. The cycle is broken
+ // from PasswordStoreWin::Shutdown, which deletes us.
+ scoped_refptr<PasswordStoreWin> password_store_;
- PasswordStore::ForwardLoginsResult(request.get());
- } else {
- PasswordStoreDefault::OnWebDataServiceRequestDone(handle, result);
- }
-}
+ // Holds requests associated with in-flight GetLogin queries.
+ PendingRequestMap pending_requests_;
-void PasswordStoreWin::GetLoginsImpl(GetLoginsRequest* request,
- const PasswordForm& form) {
- static_cast<FormGetLoginsRequest*>(request)->SetLoginsRequestForm(form);
+ DISALLOW_COPY_AND_ASSIGN(DBHandler);
+};
- PasswordStoreDefault::GetLoginsImpl(request, form);
+PasswordStoreWin::DBHandler::~DBHandler() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
+ for (PendingRequestMap::const_iterator i = pending_requests_.begin();
+ i != pending_requests_.end(); ++i) {
+ web_data_service_->CancelRequest(i->first);
+ }
}
-void PasswordStoreWin::TrackRequest(WebDataService::Handle handle,
- GetLoginsRequest* request) {
+void PasswordStoreWin::DBHandler::GetIE7Login(const GURL& url,
+ GetLoginsRequest* request) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
-
+ IE7PasswordInfo info;
+ info.url_hash = ie7_password::GetUrlHash(UTF8ToWide(url.spec()));
+ WebDataService::Handle handle = web_data_service_->GetIE7Login(info, this);
pending_requests_.insert(PendingRequestMap::value_type(handle, request));
}
-PasswordStoreDefault::GetLoginsRequest* PasswordStoreWin::TakeRequestWithHandle(
- WebDataService::Handle handle) {
+PasswordForm* PasswordStoreWin::DBHandler::GetIE7Result(
+ const WDTypedResult *result,
+ const PasswordForm& form) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
- PendingRequestMap::iterator it(pending_requests_.find(handle));
- if (it == pending_requests_.end())
- return NULL;
-
- GetLoginsRequest* request = it->second;
- pending_requests_.erase(it);
- return request;
-}
-
-PasswordForm* PasswordStoreWin::GetIE7Result(const WDTypedResult *result,
- const PasswordForm& form) {
const WDResult<IE7PasswordInfo>* r =
static_cast<const WDResult<IE7PasswordInfo>*>(result);
IE7PasswordInfo info = r->GetValue();
@@ -153,9 +129,82 @@ PasswordForm* PasswordStoreWin::GetIE7Result(const WDTypedResult *result,
autofill->preferred = true;
autofill->ssl_valid = form.origin.SchemeIsSecure();
autofill->date_created = info.date_created;
- // Add this PasswordForm to the saved password table.
- AddLogin(*autofill);
+ // Add this PasswordForm to the saved password table. We're on the DB thread
+ // already, so we use AddLoginImpl.
+ password_store_->AddLoginImpl(*autofill);
return autofill;
}
return NULL;
}
+
+void PasswordStoreWin::DBHandler::OnWebDataServiceRequestDone(
+ WebDataService::Handle handle,
+ const WDTypedResult* result) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
+
+ PendingRequestMap::iterator i(pending_requests_.find(handle));
+ DCHECK(i != pending_requests_.end());
+ scoped_refptr<GetLoginsRequest> request(i->second);
+ pending_requests_.erase(i);
+
+ if (!result)
+ return; // The WDS returns NULL if it is shutting down.
+
+ DCHECK_EQ(PASSWORD_IE7_RESULT, result->GetType());
+ PasswordForm* form =
+ static_cast<FormGetLoginsRequest*>(request.get())->form();
+ DCHECK(form);
+ PasswordForm* ie7_form = GetIE7Result(result, *form);
+
+ if (ie7_form)
+ request->value.push_back(ie7_form);
+
+ request->ForwardResult(GetLoginsRequest::TupleType(request->handle(),
+ request->value));
+}
+
+PasswordStoreWin::PasswordStoreWin(LoginDatabase* login_database,
+ Profile* profile,
+ WebDataService* web_data_service)
+ : PasswordStoreDefault(login_database, profile, web_data_service) {
+ db_handler_.reset(new DBHandler(web_data_service, this));
+}
+
+PasswordStoreWin::~PasswordStoreWin() {
+}
+
+void PasswordStoreWin::ShutdownOnDBThread() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
+ db_handler_.reset();
+}
+
+PasswordStore::GetLoginsRequest* PasswordStoreWin::NewGetLoginsRequest(
+ GetLoginsCallback* callback) {
+ return new FormGetLoginsRequest(callback);
+}
+
+void PasswordStoreWin::Shutdown() {
+ BrowserThread::PostTask(
+ BrowserThread::DB, FROM_HERE,
+ NewRunnableMethod(this, &PasswordStoreWin::ShutdownOnDBThread));
+ PasswordStoreDefault::Shutdown();
+}
+
+void PasswordStoreWin::ForwardLoginsResult(GetLoginsRequest* request) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
+ if (static_cast<FormGetLoginsRequest*>(request)->IsLoginsRequest() &&
+ request->value.empty() && db_handler_.get()) {
+ db_handler_->GetIE7Login(
+ static_cast<FormGetLoginsRequest*>(request)->form()->origin,
+ request);
+ } else {
+ PasswordStore::ForwardLoginsResult(request);
+ }
+}
+
+void PasswordStoreWin::GetLoginsImpl(GetLoginsRequest* request,
+ const PasswordForm& form) {
+ static_cast<FormGetLoginsRequest*>(request)->SetLoginsRequestForm(form);
+
+ PasswordStoreDefault::GetLoginsImpl(request, form);
+}
diff --git a/chrome/browser/password_manager/password_store_win.h b/chrome/browser/password_manager/password_store_win.h
index 2cf238d..f08bbcd 100644
--- a/chrome/browser/password_manager/password_store_win.h
+++ b/chrome/browser/password_manager/password_store_win.h
@@ -6,8 +6,7 @@
#define CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_WIN_H_
#pragma once
-#include <map>
-
+#include "base/scoped_ptr.h"
#include "chrome/browser/password_manager/password_store_default.h"
class LoginDatabase;
@@ -28,38 +27,25 @@ class PasswordStoreWin : public PasswordStoreDefault {
WebDataService* web_data_service);
private:
+ class DBHandler;
+
virtual ~PasswordStoreWin();
+ // Invoked from Shutdown, but run on the DB thread.
+ void ShutdownOnDBThread();
+
virtual GetLoginsRequest* NewGetLoginsRequest(
GetLoginsCallback* callback) OVERRIDE;
// See PasswordStoreDefault.
+ virtual void Shutdown() OVERRIDE;
virtual void ForwardLoginsResult(GetLoginsRequest* request) OVERRIDE;
- virtual void OnWebDataServiceRequestDone(
- WebDataService::Handle h, const WDTypedResult* result) OVERRIDE;
// Overridden so that we can save the form for later use.
virtual void GetLoginsImpl(GetLoginsRequest* request,
const webkit_glue::PasswordForm& form) OVERRIDE;
- // Takes ownership of |request| and tracks it under |handle|.
- void TrackRequest(WebDataService::Handle handle, GetLoginsRequest* request);
-
- // Finds the GetLoginsRequest associated with the in-flight WebDataService
- // request identified by |handle|, removes it from the tracking list, and
- // returns it. Ownership of the GetLoginsRequest passes to the caller.
- // Returns NULL if the request has been cancelled.
- GetLoginsRequest* TakeRequestWithHandle(WebDataService::Handle handle);
-
- // Gets logins from IE7 if no others are found. Also copies them into
- // Chrome's WebDatabase so we don't need to look next time.
- webkit_glue::PasswordForm* GetIE7Result(
- const WDTypedResult* result,
- const webkit_glue::PasswordForm& form);
-
- // Holds requests associated with in-flight GetLogin queries.
- typedef std::map<WebDataService::Handle, GetLoginsRequest*> PendingRequestMap;
- PendingRequestMap pending_requests_;
+ scoped_ptr<DBHandler> db_handler_;
DISALLOW_COPY_AND_ASSIGN(PasswordStoreWin);
};
diff --git a/chrome/browser/password_manager/password_store_win_unittest.cc b/chrome/browser/password_manager/password_store_win_unittest.cc
index 98ad2be..6477b12 100644
--- a/chrome/browser/password_manager/password_store_win_unittest.cc
+++ b/chrome/browser/password_manager/password_store_win_unittest.cc
@@ -18,6 +18,7 @@
#include "chrome/browser/password_manager/password_store_win.h"
#include "chrome/browser/password_manager/ie7_password.h"
#include "chrome/browser/prefs/pref_service.h"
+#include "chrome/browser/webdata/web_data_service.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/signaling_task.h"
#include "chrome/test/testing_profile.h"
@@ -171,7 +172,7 @@ TEST_F(PasswordStoreWinTest, DISABLED_ConvertIE7Login) {
true);
// Initializing the PasswordStore shouldn't trigger a migration.
- scoped_refptr<PasswordStoreWin> store(
+ scoped_refptr<PasswordStore> store(
new PasswordStoreWin(login_db_.release(), profile_.get(), wds_.get()));
EXPECT_TRUE(store->Init());
@@ -220,6 +221,8 @@ TEST_F(PasswordStoreWinTest, DISABLED_ConvertIE7Login) {
MessageLoop::current()->Run();
STLDeleteElements(&forms);
+
+ store->Shutdown();
}
TEST_F(PasswordStoreWinTest, OutstandingWDSQueries) {
@@ -228,7 +231,7 @@ TEST_F(PasswordStoreWinTest, OutstandingWDSQueries) {
true);
// Initializing the PasswordStore shouldn't trigger a migration.
- scoped_refptr<PasswordStoreWin> store(
+ scoped_refptr<PasswordStore> store(
new PasswordStoreWin(login_db_.release(), profile_.get(), wds_.get()));
EXPECT_TRUE(store->Init());
@@ -250,6 +253,7 @@ TEST_F(PasswordStoreWinTest, OutstandingWDSQueries) {
store->GetLogins(*form, &consumer);
// Release the PSW and the WDS before the query can return.
+ store->Shutdown();
store = NULL;
wds_->Shutdown();
wds_ = NULL;
@@ -277,7 +281,7 @@ TEST_F(PasswordStoreWinTest, DISABLED_MultipleWDSQueriesOnDifferentThreads) {
true);
// Initializing the PasswordStore shouldn't trigger a migration.
- scoped_refptr<PasswordStoreWin> store(
+ scoped_refptr<PasswordStore> store(
new PasswordStoreWin(login_db_.release(), profile_.get(), wds_.get()));
EXPECT_TRUE(store->Init());
@@ -338,6 +342,8 @@ TEST_F(PasswordStoreWinTest, DISABLED_MultipleWDSQueriesOnDifferentThreads) {
MessageLoop::current()->Run();
STLDeleteElements(&forms);
+
+ store->Shutdown();
}
TEST_F(PasswordStoreWinTest, Migration) {
@@ -426,7 +432,7 @@ TEST_F(PasswordStoreWinTest, Migration) {
done.Wait();
// Initializing the PasswordStore should trigger a migration.
- scoped_refptr<PasswordStoreWin> store(
+ scoped_refptr<PasswordStore> store(
new PasswordStoreWin(login_db_.release(), profile_.get(), wds_.get()));
store->Init();
@@ -507,7 +513,7 @@ TEST_F(PasswordStoreWinTest, Migration) {
}
TEST_F(PasswordStoreWinTest, EmptyLogins) {
- scoped_refptr<PasswordStoreWin> store(
+ scoped_refptr<PasswordStore> store(
new PasswordStoreWin(login_db_.release(), profile_.get(), wds_.get()));
store->Init();
@@ -539,10 +545,12 @@ TEST_F(PasswordStoreWinTest, EmptyLogins) {
store->GetLogins(*form, &consumer);
MessageLoop::current()->Run();
+
+ store->Shutdown();
}
TEST_F(PasswordStoreWinTest, EmptyBlacklistLogins) {
- scoped_refptr<PasswordStoreWin> store(
+ scoped_refptr<PasswordStore> store(
new PasswordStoreWin(login_db_.release(), profile_.get(), wds_.get()));
store->Init();
@@ -560,10 +568,12 @@ TEST_F(PasswordStoreWinTest, EmptyBlacklistLogins) {
store->GetBlacklistLogins(&consumer);
MessageLoop::current()->Run();
+
+ store->Shutdown();
}
TEST_F(PasswordStoreWinTest, EmptyAutofillableLogins) {
- scoped_refptr<PasswordStoreWin> store(
+ scoped_refptr<PasswordStore> store(
new PasswordStoreWin(login_db_.release(), profile_.get(), wds_.get()));
store->Init();
@@ -581,4 +591,6 @@ TEST_F(PasswordStoreWinTest, EmptyAutofillableLogins) {
store->GetAutofillableLogins(&consumer);
MessageLoop::current()->Run();
+
+ store->Shutdown();
}
diff --git a/chrome/browser/password_manager/password_store_x_unittest.cc b/chrome/browser/password_manager/password_store_x_unittest.cc
index 80eaa6a..721368d 100644
--- a/chrome/browser/password_manager/password_store_x_unittest.cc
+++ b/chrome/browser/password_manager/password_store_x_unittest.cc
@@ -436,6 +436,8 @@ TEST_P(PasswordStoreXTest, WDSMigration) {
STLDeleteElements(&expected_autofillable);
STLDeleteElements(&expected_blacklisted);
+
+ store->Shutdown();
}
TEST_P(PasswordStoreXTest, WDSMigrationAlreadyDone) {
@@ -499,6 +501,8 @@ TEST_P(PasswordStoreXTest, WDSMigrationAlreadyDone) {
MessageLoop::current()->Run();
STLDeleteElements(&unexpected_autofillable);
+
+ store->Shutdown();
}
TEST_P(PasswordStoreXTest, Notifications) {
@@ -591,6 +595,8 @@ TEST_P(PasswordStoreXTest, Notifications) {
BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
new SignalingTask(&done));
done.Wait();
+
+ store->Shutdown();
}
TEST_P(PasswordStoreXTest, NativeMigration) {
@@ -730,6 +736,8 @@ TEST_P(PasswordStoreXTest, NativeMigration) {
STLDeleteElements(&expected_autofillable);
STLDeleteElements(&expected_blacklisted);
+
+ store->Shutdown();
}
INSTANTIATE_TEST_CASE_P(NoBackend,
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index 9f507eb..9e8adce 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -609,6 +609,10 @@ ProfileImpl::~ProfileImpl() {
// The sync service needs to be deleted before the services it calls.
sync_service_.reset();
+ // Password store uses WebDB, shut it down before the WebDB has been shutdown.
+ if (password_store_.get())
+ password_store_->Shutdown();
+
// Both HistoryService and WebDataService maintain threads for background
// processing. Its possible each thread still has tasks on it that have
// increased the ref count of the service. In such a situation, when we
diff --git a/chrome/browser/resources/options/chromeos/internet_options.js b/chrome/browser/resources/options/chromeos/internet_options.js
index 4902f1d..a802a9b 100644
--- a/chrome/browser/resources/options/chromeos/internet_options.js
+++ b/chrome/browser/resources/options/chromeos/internet_options.js
@@ -404,9 +404,18 @@ cr.define('options', function() {
$('operatorName').textContent = data.operatorName;
$('operatorCode').textContent = data.operatorCode;
$('imsi').textContent = data.imsi;
- $('cellularApn').value = data.apn;
- $('cellularApnUsername').value = data.apn_username;
- $('cellularApnPassword').value = data.apn_password;
+ // If there's no custom APN show default APN that is used. These will be
+ // displayed differently when http://crosbug.com/14290 is fixed.
+ // See also http://crosbug.com/p/4058 for context.
+ if (data.apn != '') {
+ $('cellularApn').value = data.apn;
+ $('cellularApnUsername').value = data.apn_username;
+ $('cellularApnPassword').value = data.apn_password;
+ } else {
+ $('cellularApn').value = data.last_good_apn;
+ $('cellularApnUsername').value = data.last_good_apn_username;
+ $('cellularApnPassword').value = data.last_good_apn_password;
+ }
$('sim-card-lock-enabled').checked = data.simCardLockEnabled;
InternetOptions.enableSecurityTab(true);
page.setAttribute('gsm', true);
diff --git a/chrome/browser/sync/profile_sync_service_password_unittest.cc b/chrome/browser/sync/profile_sync_service_password_unittest.cc
index 16cb99e..2f0f719 100644
--- a/chrome/browser/sync/profile_sync_service_password_unittest.cc
+++ b/chrome/browser/sync/profile_sync_service_password_unittest.cc
@@ -169,6 +169,7 @@ class ProfileSyncServicePasswordTest : public AbstractProfileSyncServiceTest {
}
virtual void TearDown() {
+ password_store_->Shutdown();
service_.reset();
notification_service_->TearDown();
db_thread_.Stop();
diff --git a/chrome/browser/tab_contents/web_contents_unittest.cc b/chrome/browser/tab_contents/web_contents_unittest.cc
index 6057195..dc18b54 100644
--- a/chrome/browser/tab_contents/web_contents_unittest.cc
+++ b/chrome/browser/tab_contents/web_contents_unittest.cc
@@ -702,40 +702,40 @@ TEST_F(TabContentsTest, CrossSiteNavigationNotPreemptedByFrame) {
EXPECT_TRUE(contents()->cross_navigation_pending());
}
-// Test that the original renderer can preempt a cross-site navigation while the
-// beforeunload request is in flight.
-TEST_F(TabContentsTest, CrossSitePreemptDuringBeforeUnload) {
+// Test that a cross-site navigation is not preempted if the previous
+// renderer sends a FrameNavigate message just before being told to stop.
+// We should only preempt the cross-site navigation if the previous renderer
+// has started a new navigation. See http://crbug.com/79176.
+TEST_F(TabContentsTest, CrossSiteNotPreemptedDuringBeforeUnload) {
contents()->transition_cross_site = true;
- TestRenderViewHost* orig_rvh = rvh();
- SiteInstance* instance1 = contents()->GetSiteInstance();
- // Navigate to URL. First URL should use first RenderViewHost.
- const GURL url("http://www.google.com");
+ // Navigate to NTP URL.
+ const GURL url("chrome://newtab");
controller().LoadURL(url, GURL(), PageTransition::TYPED);
- ViewHostMsg_FrameNavigate_Params params1;
- InitNavigateParams(&params1, 1, url);
- contents()->TestDidNavigate(orig_rvh, params1);
+ TestRenderViewHost* orig_rvh = rvh();
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, contents()->render_view_host());
- // Navigate to new site, with the befureunload request in flight.
+ // Navigate to new site, with the beforeunload request in flight.
const GURL url2("http://www.yahoo.com");
controller().LoadURL(url2, GURL(), PageTransition::TYPED);
+ TestRenderViewHost* pending_rvh = contents()->pending_rvh();
+ EXPECT_TRUE(contents()->cross_navigation_pending());
+ EXPECT_TRUE(orig_rvh->is_waiting_for_beforeunload_ack());
- // Suppose the original renderer navigates now, while the beforeunload request
- // is in flight. We must cancel the pending navigation and show this new
- // page, because the beforeunload handler might return false.
- orig_rvh->SendNavigate(2, GURL("http://www.google.com/foo"));
+ // Suppose the first navigation tries to commit now, with a
+ // ViewMsg_Stop in flight. This should not cancel the pending navigation,
+ // but it should act as if the beforeunload ack arrived.
+ orig_rvh->SendNavigate(1, GURL("chrome://newtab"));
+ EXPECT_TRUE(contents()->cross_navigation_pending());
+ EXPECT_EQ(orig_rvh, contents()->render_view_host());
+ EXPECT_FALSE(orig_rvh->is_waiting_for_beforeunload_ack());
- // Verify that the pending navigation is cancelled.
- SiteInstance* instance2 = contents()->GetSiteInstance();
+ // The pending navigation should be able to commit successfully.
+ ViewHostMsg_FrameNavigate_Params params2;
+ InitNavigateParams(&params2, 1, url2, PageTransition::TYPED);
+ contents()->TestDidNavigate(pending_rvh, params2);
EXPECT_FALSE(contents()->cross_navigation_pending());
- EXPECT_EQ(orig_rvh, rvh());
- EXPECT_EQ(instance1, instance2);
- EXPECT_TRUE(contents()->pending_rvh() == NULL);
-
- // Make sure the beforeunload ack doesn't cause problems if it arrives here.
- orig_rvh->TestOnMessageReceived(ViewHostMsg_ShouldClose_ACK(0, true));
+ EXPECT_EQ(pending_rvh, contents()->render_view_host());
}
// Test that the original renderer cannot preempt a cross-site navigation once
diff --git a/chrome/browser/ui/browser_init.cc b/chrome/browser/ui/browser_init.cc
index 920b830..12eb45a 100644
--- a/chrome/browser/ui/browser_init.cc
+++ b/chrome/browser/ui/browser_init.cc
@@ -1186,7 +1186,7 @@ void BrowserInit::LaunchWithProfile::AddStartupURLs(
while (it != browser_init_->first_run_tabs_.end()) {
// Replace magic names for the actual urls.
if (it->host() == "new_tab_page") {
- startup_urls->push_back(GURL());
+ startup_urls->push_back(GURL(chrome::kChromeUINewTabURL));
} else if (it->host() == "welcome_page") {
startup_urls->push_back(GetWelcomePageURL());
} else {
diff --git a/chrome/browser/ui/cocoa/browser_window_controller.mm b/chrome/browser/ui/cocoa/browser_window_controller.mm
index d0bfe00..8ba6eae 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller.mm
+++ b/chrome/browser/ui/cocoa/browser_window_controller.mm
@@ -156,19 +156,9 @@
MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
@interface NSWindow (LionSDKDeclarations)
-- (void)toggleFullScreen:(id)sender;
- (void)setRestorable:(BOOL)flag;
@end
-enum {
- NSWindowCollectionBehaviorFullScreenPrimary = 1 << 7,
- NSWindowCollectionBehaviorFullScreenAuxiliary = 1 << 8
-};
-
-enum {
- NSWindowFullScreenButton = 7
-};
-
#endif // MAC_OS_X_VERSION_10_7
// IncognitoImageView subclasses NSView to allow mouse events to pass through it
@@ -417,20 +407,7 @@ enum {
if ([self hasToolbar]) // Do not create the buttons in popups.
[toolbarController_ createBrowserActionButtons];
- // For versions of Mac OS that provide an "enter fullscreen" button, make
- // one appear (in a rather hacky manner). http://crbug.com/74065 : When
- // switching the fullscreen implementation to the new API, revisit how much
- // of this hacky code is necessary.
- if ([window respondsToSelector:@selector(toggleFullScreen:)]) {
- NSWindowCollectionBehavior behavior = [window collectionBehavior];
- behavior |= NSWindowCollectionBehaviorFullScreenPrimary;
- [window setCollectionBehavior:behavior];
-
- NSButton* fullscreenButton =
- [window standardWindowButton:NSWindowFullScreenButton];
- [fullscreenButton setAction:@selector(enterFullscreen:)];
- [fullscreenButton setTarget:self];
- }
+ [self setUpOSFullScreenButton];
// We are done initializing now.
initializing_ = NO;
@@ -2057,6 +2034,10 @@ willAnimateFromState:(bookmarks::VisualState)oldState
// We're done moving focus, so re-enable bar visibility changes.
[self enableBarVisibilityUpdates];
+ // This needs to be done when leaving full-screen mode to ensure that the
+ // button's action is set properly.
+ [self setUpOSFullScreenButton];
+
// Fade back in.
if (didFadeOut) {
CGDisplayFade(token, kFadeDurationSeconds / 2, kCGDisplayBlendSolidColor,
diff --git a/chrome/browser/ui/cocoa/browser_window_controller_private.h b/chrome/browser/ui/cocoa/browser_window_controller_private.h
index 8757126..48d39f6 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller_private.h
+++ b/chrome/browser/ui/cocoa/browser_window_controller_private.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 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.
@@ -113,6 +113,12 @@
- (void)enableBarVisibilityUpdates;
- (void)disableBarVisibilityUpdates;
+// For versions of Mac OS that provide an "enter fullscreen" button, make one
+// appear (in a rather hacky manner). http://crbug.com/74065 : When switching
+// the fullscreen implementation to the new API, revisit how much of this
+// hacky code is necessary.
+- (void)setUpOSFullScreenButton;
+
@end // @interface BrowserWindowController(Private)
diff --git a/chrome/browser/ui/cocoa/browser_window_controller_private.mm b/chrome/browser/ui/cocoa/browser_window_controller_private.mm
index 2eac331..52532cc 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller_private.mm
+++ b/chrome/browser/ui/cocoa/browser_window_controller_private.mm
@@ -28,6 +28,26 @@
#include "content/browser/tab_contents/tab_contents.h"
#include "content/browser/tab_contents/tab_contents_view.h"
+// Provide the forward-declarations of new 10.7 SDK symbols so they can be
+// called when building with the 10.5 SDK.
+#if !defined(MAC_OS_X_VERSION_10_7) || \
+ MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
+
+@interface NSWindow (LionSDKDeclarations)
+- (void)toggleFullScreen:(id)sender;
+@end
+
+enum {
+ NSWindowCollectionBehaviorFullScreenPrimary = 1 << 7,
+ NSWindowCollectionBehaviorFullScreenAuxiliary = 1 << 8
+};
+
+enum {
+ NSWindowFullScreenButton = 7
+};
+
+#endif // MAC_OS_X_VERSION_10_7
+
namespace {
// Space between the incognito badge and the right edge of the window.
@@ -40,22 +60,7 @@ const CGFloat kLocBarLeftRightInset = 1;
const CGFloat kLocBarTopInset = 0;
const CGFloat kLocBarBottomInset = 1;
-} // end namespace
-
-// 10.7 adds public APIs for full-screen support. Provide the declaration so it
-// can be called below when building with the 10.5 SDK.
-#if !defined(MAC_OS_X_VERSION_10_7) || \
-MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
-
-@interface NSWindow (LionSDKDeclarations)
-- (void)toggleFullScreen:(id)sender;
-@end
-
-enum {
- NSWindowFullScreenButton = 7
-};
-
-#endif // MAC_OS_X_VERSION_10_7
+} // namespace
@implementation BrowserWindowController(Private)
@@ -537,4 +542,18 @@ willPositionSheet:(NSWindow*)sheet
[fullscreenController_ cancelAnimationAndTimers];
}
+- (void)setUpOSFullScreenButton {
+ NSWindow* window = [self window];
+ if ([window respondsToSelector:@selector(toggleFullScreen:)]) {
+ NSWindowCollectionBehavior behavior = [window collectionBehavior];
+ behavior |= NSWindowCollectionBehaviorFullScreenPrimary;
+ [window setCollectionBehavior:behavior];
+
+ NSButton* fullscreenButton =
+ [window standardWindowButton:NSWindowFullScreenButton];
+ [fullscreenButton setAction:@selector(enterFullscreen:)];
+ [fullscreenButton setTarget:self];
+ }
+}
+
@end // @implementation BrowserWindowController(Private)
diff --git a/chrome/browser/ui/webui/chromeos/mobile_setup_ui.cc b/chrome/browser/ui/webui/chromeos/mobile_setup_ui.cc
index 16da1e5..7be689a 100644
--- a/chrome/browser/ui/webui/chromeos/mobile_setup_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/mobile_setup_ui.cc
@@ -939,7 +939,7 @@ void MobileSetupHandler::EvaluateCellularNetwork(
if ((network->activation_state() ==
chromeos::ACTIVATION_STATE_PARTIALLY_ACTIVATED ||
network->activation_state() == chromeos::ACTIVATION_STATE_ACTIVATING) &&
- (network->error() == chromeos::ERROR_UNKNOWN ||
+ (network->error() == chromeos::ERROR_NO_ERROR ||
network->error() == chromeos::ERROR_OTASP_FAILED) &&
network->state() == chromeos::STATE_ACTIVATION_FAILURE) {
LOG(WARNING) << "Activation failure detected "
diff --git a/chrome/common/extensions/docs/css/ApiRefStyles.css b/chrome/common/extensions/docs/css/ApiRefStyles.css
index 3a7040f..ef33312 100644
--- a/chrome/common/extensions/docs/css/ApiRefStyles.css
+++ b/chrome/common/extensions/docs/css/ApiRefStyles.css
@@ -84,6 +84,10 @@ pre b {
background:yellow
}
+.linenumber {
+ color: #999999;
+}
+
code,pre {
font-family:monospace;
color:#007000
diff --git a/chrome/common/extensions/docs/overview.html b/chrome/common/extensions/docs/overview.html
index f91d3aa..e5c7c8d 100644
--- a/chrome/common/extensions/docs/overview.html
+++ b/chrome/common/extensions/docs/overview.html
@@ -287,6 +287,17 @@
</li>
</ol>
</li><li>
+ <a href="#apis"> Using the chrome.* APIs </a>
+ <ol>
+ <li>
+ <a href="#sync"> Asynchronous vs. synchronous methods </a>
+ </li><li>
+ <a href="#sync-example"> Example: Using a callback </a>
+ </li><li>
+ <a href="#chrome-more"> More details </a>
+ </li>
+ </ol>
+ </li><li>
<a href="#pageComm">Communication between pages </a>
<ol>
<li style="display: none; ">
@@ -628,7 +639,7 @@ Here are some examples of extensions that usually
An extension with a content script
that doesn't use cross-origin XMLHttpRequests or localStorage,
and that doesn't need to use
- <a href="api_index.html">extension APIs</a>.
+ <a href="#apis">extension APIs</a>.
</li>
<li>
An extension that has no UI except for an options page.
@@ -650,7 +661,7 @@ Any extension can have an options page,
which lets users customize how the extension works.
Another type of special page is the override page.
And finally, you can
-use <a href="tabs.html#method-create"><code>chrome.tabs.create()</code></a>
+use <a href="tabs.html#method-create">chrome.tabs.create()</a>
or <code>window.open()</code>
to display any other HTML files that are in the extension.
</p>
@@ -743,6 +754,138 @@ see <a href="content_scripts.html">Content Scripts</a>.
</p>
+<h2 id="apis"> Using the chrome.* APIs </h2>
+
+<p>
+In addition to having access to all the APIs that web pages and apps can use,
+extensions can also use Chrome-only APIs
+(often called <em>chrome.* APIs</em>)
+that allow tight integration with the browser.
+For example, any extension or web app can use the
+standard <code>window.open()</code> method to open a URL.
+But if you want to specify which window that URL should be displayed in,
+your extension can use the Chrome-only
+<a href="tabs.html#method-create">chrome.tabs.create()</a>
+method instead.
+</p>
+
+<h3 id="sync"> Asynchronous vs. synchronous methods </h3>
+<p>
+Most methods in the chrome.* APIs are <b>asynchronous</b>:
+they return immediately, without waiting for the operation to finish.
+If you need to know the outcome of that operation,
+then you pass a callback function into the method.
+That callback is executed later (potentially <em>much</em> later),
+sometime after the method returns.
+Here's an example of the signature for an asynchronous method:
+</p>
+
+<p>
+<code>
+chrome.tabs.create(object <em>createProperties</em>, function <em>callback</em>)
+</code>
+</p>
+
+<p>
+Other chrome.* methods are <b>synchronous</b>.
+Synchronous methods never have a callback
+because they don't return until they've completed all their work.
+Often, synchronous methods have a return type.
+Consider the
+<a href="extension.html#method-getBackgroundPage">chrome.extensions.getBackgroundPage()</a> method:
+</p>
+
+<p>
+<code>
+DOMWindow chrome.extension.getBackgroundPage()
+</code>
+</p>
+
+<p>
+This method has no callback and a return type of <code>DOMWindow</code>
+because it synchronously returns the background page
+and performs no other, asynchronous work.
+</p>
+
+
+<h3 id="sync-example"> Example: Using a callback </h3>
+
+<p>
+Say you want to navigate
+the user's currently selected tab to a new URL.
+To do this, you need to get the current tab's ID
+(using <a href="tabs.html#method-getSelected">chrome.tabs.getSelected()</a>)
+and then make that tab go to the new URL
+(using <a href="tabs.html#method-update">chrome.tabs.update()</a>).
+</p>
+
+<p>
+If <code>getSelected()</code> were synchronous,
+you might write code like this:
+</p>
+
+<pre> <b>//THIS CODE DOESN'T WORK</b>
+<span class="linenumber">1: </span>var tab = chrome.tabs.getSelected(null); <b>//WRONG!!!</b>
+<span class="linenumber">2: </span>chrome.tabs.update(tab.id, {url:newUrl});
+<span class="linenumber">3: </span>someOtherFunction();
+</pre>
+
+<p>
+That approach fails
+because <code>getSelected()</code> is asynchronous.
+It returns without waiting for its work to complete,
+and it doesn't even return a value
+(although some asynchronous methods do).
+You can tell that <code>getSelected()</code> is asynchronous
+by the <em>callback</em> parameter in its signature:
+
+</p><p>
+<code>
+chrome.tabs.getSelected(integer <em>windowId</em>, function <em>callback</em>)
+</code>
+</p>
+
+<p>
+To fix the preceding code,
+you must use that callback parameter.
+The following code shows
+how to define a callback function
+that gets the results from <code>getSelected()</code>
+(as a parameter named <code>tab</code>)
+and calls <code>update()</code>.
+</p>
+
+<pre> <b>//THIS CODE WORKS</b>
+<span class="linenumber">1: </span>chrome.tabs.getSelected(null, <b>function(tab) {</b>
+<span class="linenumber">2: </span> chrome.tabs.update(tab.id, {url:newUrl});
+<span class="linenumber">3: </span><b>}</b>);
+<span class="linenumber">4: </span>someOtherFunction();
+</pre>
+
+<p>
+In this example, the lines are executed in the following order: 1, 4, 2.
+The callback function specified to <code>getSelected</code> is called
+(and line 2 executed)
+only after information about the currently selected tab is available,
+which is sometime after <code>getSelected()</code> returns.
+Although <code>update()</code> is asynchronous,
+this example doesn't use its callback parameter,
+since we don't do anything about the results of the update.
+</p>
+
+
+<h3 id="chrome-more"> More details </h3>
+
+<p>
+For more information, see the
+<a href="api_index.html">chrome.* API docs</a>
+and watch this video:
+</p>
+
+<p>
+<iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/bmxr75CV36A?rel=0" frameborder="0" allowfullscreen=""></iframe>
+</p>
+
<h2 id="pageComm">Communication between pages </h2>
<p>
diff --git a/chrome/common/extensions/docs/static/overview.html b/chrome/common/extensions/docs/static/overview.html
index dabc217..1da4f38 100644
--- a/chrome/common/extensions/docs/static/overview.html
+++ b/chrome/common/extensions/docs/static/overview.html
@@ -283,7 +283,7 @@ Here are some examples of extensions that usually
An extension with a content script
that doesn't use cross-origin XMLHttpRequests or localStorage,
and that doesn't need to use
- <a href="api_index.html">extension APIs</a>.
+ <a href="#apis">extension APIs</a>.
</li>
<li>
An extension that has no UI except for an options page.
@@ -305,7 +305,7 @@ Any extension can have an options page,
which lets users customize how the extension works.
Another type of special page is the override page.
And finally, you can
-use <a href="tabs.html#method-create"><code>chrome.tabs.create()</code></a>
+use <a href="tabs.html#method-create">chrome.tabs.create()</a>
or <code>window.open()</code>
to display any other HTML files that are in the extension.
</p>
@@ -404,6 +404,140 @@ see <a href="content_scripts.html">Content Scripts</a>.
</p>
+<h2 id="apis"> Using the chrome.* APIs </h2>
+
+<p>
+In addition to having access to all the APIs that web pages and apps can use,
+extensions can also use Chrome-only APIs
+(often called <em>chrome.* APIs</em>)
+that allow tight integration with the browser.
+For example, any extension or web app can use the
+standard <code>window.open()</code> method to open a URL.
+But if you want to specify which window that URL should be displayed in,
+your extension can use the Chrome-only
+<a href="tabs.html#method-create">chrome.tabs.create()</a>
+method instead.
+</p>
+
+<h3 id="sync"> Asynchronous vs. synchronous methods </h3>
+<p>
+Most methods in the chrome.* APIs are <b>asynchronous</b>:
+they return immediately, without waiting for the operation to finish.
+If you need to know the outcome of that operation,
+then you pass a callback function into the method.
+That callback is executed later (potentially <em>much</em> later),
+sometime after the method returns.
+Here's an example of the signature for an asynchronous method:
+</p>
+
+<p>
+<code>
+chrome.tabs.create(object <em>createProperties</em>, function <em>callback</em>)
+</code>
+</p>
+
+<p>
+Other chrome.* methods are <b>synchronous</b>.
+Synchronous methods never have a callback
+because they don't return until they've completed all their work.
+Often, synchronous methods have a return type.
+Consider the
+<a href="extension.html#method-getBackgroundPage">chrome.extensions.getBackgroundPage()</a> method:
+</p>
+
+<p>
+<code>
+DOMWindow chrome.extension.getBackgroundPage()
+</code>
+</p>
+
+<p>
+This method has no callback and a return type of <code>DOMWindow</code>
+because it synchronously returns the background page
+and performs no other, asynchronous work.
+</p>
+
+
+<h3 id="sync-example"> Example: Using a callback </h3>
+
+<p>
+Say you want to navigate
+the user's currently selected tab to a new URL.
+To do this, you need to get the current tab's ID
+(using <a href="tabs.html#method-getSelected">chrome.tabs.getSelected()</a>)
+and then make that tab go to the new URL
+(using <a href="tabs.html#method-update">chrome.tabs.update()</a>).
+</p>
+
+<p>
+If <code>getSelected()</code> were synchronous,
+you might write code like this:
+</p>
+
+<pre>
+ <b>//THIS CODE DOESN'T WORK</b>
+<span class="linenumber">1: </span>var tab = chrome.tabs.getSelected(null); <b>//WRONG!!!</b>
+<span class="linenumber">2: </span>chrome.tabs.update(tab.id, {url:newUrl});
+<span class="linenumber">3: </span>someOtherFunction();
+</pre>
+
+<p>
+That approach fails
+because <code>getSelected()</code> is asynchronous.
+It returns without waiting for its work to complete,
+and it doesn't even return a value
+(although some asynchronous methods do).
+You can tell that <code>getSelected()</code> is asynchronous
+by the <em>callback</em> parameter in its signature:
+
+<p>
+<code>
+chrome.tabs.getSelected(integer <em>windowId</em>, function <em>callback</em>)
+</code>
+</p>
+
+<p>
+To fix the preceding code,
+you must use that callback parameter.
+The following code shows
+how to define a callback function
+that gets the results from <code>getSelected()</code>
+(as a parameter named <code>tab</code>)
+and calls <code>update()</code>.
+</p>
+
+<pre>
+ <b>//THIS CODE WORKS</b>
+<span class="linenumber">1: </span>chrome.tabs.getSelected(null, <b>function(tab) {</b>
+<span class="linenumber">2: </span> chrome.tabs.update(tab.id, {url:newUrl});
+<span class="linenumber">3: </span><b>}</b>);
+<span class="linenumber">4: </span>someOtherFunction();
+</pre>
+
+<p>
+In this example, the lines are executed in the following order: 1, 4, 2.
+The callback function specified to <code>getSelected</code> is called
+(and line 2 executed)
+only after information about the currently selected tab is available,
+which is sometime after <code>getSelected()</code> returns.
+Although <code>update()</code> is asynchronous,
+this example doesn't use its callback parameter,
+since we don't do anything about the results of the update.
+</p>
+
+
+<h3 id="chrome-more"> More details </h3>
+
+<p>
+For more information, see the
+<a href="api_index.html">chrome.* API docs</a>
+and watch this video:
+</p>
+
+<p>
+<iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/bmxr75CV36A?rel=0" frameborder="0" allowfullscreen></iframe>
+</p>
+
<h2 id="pageComm">Communication between pages </h2>
<p>
diff --git a/chrome/common/extensions/docs/static/whats_new.html b/chrome/common/extensions/docs/static/whats_new.html
index 437e9cd..5c1bd6e 100644
--- a/chrome/common/extensions/docs/static/whats_new.html
+++ b/chrome/common/extensions/docs/static/whats_new.html
@@ -7,6 +7,7 @@ made in recent releases.
</p>
<ul>
+ <li> <a href="#12">Google Chrome 12</a> </li>
<li> <a href="#11">Google Chrome 11</a> </li>
<li> <a href="#10">Google Chrome 10</a> </li>
<li> <a href="#9">Google Chrome 9</a> </li>
@@ -16,6 +17,38 @@ made in recent releases.
</ul>
+<h2 id="12"> Google Chrome 12 </h2>
+
+<h4> Additions to existing APIs </h4>
+ <ul>
+ <li> Two new <code>chrome.extension</code>
+ methods&mdash;<a href="extension.html#method-isAllowedFileSchemeAccess">isAllowedFileSchemeAccess()</a> and
+ <a href="extension.html#method-isAllowedIncognitoAccess">isAllowedIncognitoAccess()</a>&mdash;let you
+ determine whether your extension has increased access,
+ which the user specifies using the extensions management page
+ (<b>chrome://extensions</b>).
+ </li>
+ <li> The <a href="windows.html#method-create">chrome.windows.create()</a>
+ method can now take a <code>focused</code> value.
+ Previously, all new windows had the keyboard focus;
+ now you can create windows without interrupting the user's typing.
+ </li>
+ <li> If the manifest specifies "experimental" permission,
+ your extension can specify "panel" as the value of
+ the <code>type</code> field in
+ the <a href="windows.html#method-create">chrome.windows.create()</a>
+ method
+ or the <a href="windows.html#type-Window">Window</a> type.
+ </li>
+ <li> The <a href="cookies.html#event-onChanged">onChanged</a>
+ event of <code>chrome.cookies</code>
+ now has a <code>cause</code> parameter. </li>
+ <li> The <code>chrome.contextMenus</code>
+ <a href="contextMenus.html#method-create">create()</a> and
+ <a href="contextMenus.html#method-update">update()</a>
+ methods now let you specify a context value of "frame".
+ </ul>
+
<h2 id="11"> Google Chrome 11 </h2>
<h4> Changes to existing APIs </h4>
@@ -66,7 +99,7 @@ made in recent releases.
<h4> Additions to existing APIs </h4>
<ul>
<li> The <a href="windows.html#method-create">chrome.windows.create()</a>
- method now has a <code>tabId</code> parameter.
+ method now has a <code>tabId</code> field.
You can use it to move a tab or panel into a new window.
<p class="note">
<b>Note:</b>
@@ -88,9 +121,6 @@ made in recent releases.
<li> The <a href="manifest.html#homepage_url">homepage_url</a> field
lets you specify the extension or app's homepage. </li>
</ul>
-</h4>
-
-<!-- <h4> New experimental APIs </h4> -->
<h4> Additions to existing APIs </h4>
<ul>
@@ -143,18 +173,6 @@ No API or manifest changes worth noting.
</li>
</ul>
-<!--
-<h4> New experimental APIs </h4>
- <ul>
- <li> a change </li>
- </ul>
-
-<h4> Additions to existing APIs </h4>
- <ul>
- <li> a change </li>
- </ul>
--->
-
<h2 id="6">Google Chrome 6</h2>
@@ -168,14 +186,6 @@ No API or manifest changes worth noting.
machine's idle state changes. </li>
</ul>
-<h4> New experimental APIs </h4>
- <ul>
- <li>The <a href="experimental.omnibox.html">omnibox API</a> allows you to
- add functionality to the browser's address bar. </li>
- <li>The <a href="experimental.infobars.html">infobars API</a> allows you
- to add a UI panel across the top of a tab. </li>
- </ul>
-
<h4> Additions to existing APIs </h4>
<ul>
<li>The <a
diff --git a/chrome/common/extensions/docs/whats_new.html b/chrome/common/extensions/docs/whats_new.html
index 6e45782..6924f51 100644
--- a/chrome/common/extensions/docs/whats_new.html
+++ b/chrome/common/extensions/docs/whats_new.html
@@ -321,6 +321,7 @@ made in recent releases.
</p>
<ul>
+ <li> <a href="#12">Google Chrome 12</a> </li>
<li> <a href="#11">Google Chrome 11</a> </li>
<li> <a href="#10">Google Chrome 10</a> </li>
<li> <a href="#9">Google Chrome 9</a> </li>
@@ -330,6 +331,38 @@ made in recent releases.
</ul>
+<h2 id="12"> Google Chrome 12 </h2>
+
+<h4> Additions to existing APIs </h4>
+ <ul>
+ <li> Two new <code>chrome.extension</code>
+ methods—<a href="extension.html#method-isAllowedFileSchemeAccess">isAllowedFileSchemeAccess()</a> and
+ <a href="extension.html#method-isAllowedIncognitoAccess">isAllowedIncognitoAccess()</a>—let you
+ determine whether your extension has increased access,
+ which the user specifies using the extensions management page
+ (<b>chrome://extensions</b>).
+ </li>
+ <li> The <a href="windows.html#method-create">chrome.windows.create()</a>
+ method can now take a <code>focused</code> value.
+ Previously, all new windows had the keyboard focus;
+ now you can create windows without interrupting the user's typing.
+ </li>
+ <li> If the manifest specifies "experimental" permission,
+ your extension can specify "panel" as the value of
+ the <code>type</code> field in
+ the <a href="windows.html#method-create">chrome.windows.create()</a>
+ method
+ or the <a href="windows.html#type-Window">Window</a> type.
+ </li>
+ <li> The <a href="cookies.html#event-onChanged">onChanged</a>
+ event of <code>chrome.cookies</code>
+ now has a <code>cause</code> parameter. </li>
+ <li> The <code>chrome.contextMenus</code>
+ <a href="contextMenus.html#method-create">create()</a> and
+ <a href="contextMenus.html#method-update">update()</a>
+ methods now let you specify a context value of "frame".
+ </li></ul>
+
<h2 id="11"> Google Chrome 11 </h2>
<h4> Changes to existing APIs </h4>
@@ -380,7 +413,7 @@ made in recent releases.
<h4> Additions to existing APIs </h4>
<ul>
<li> The <a href="windows.html#method-create">chrome.windows.create()</a>
- method now has a <code>tabId</code> parameter.
+ method now has a <code>tabId</code> field.
You can use it to move a tab or panel into a new window.
<p class="note">
<b>Note:</b>
@@ -403,9 +436,6 @@ made in recent releases.
lets you specify the extension or app's homepage. </li>
</ul>
-
-<!-- <h4> New experimental APIs </h4> -->
-
<h4> Additions to existing APIs </h4>
<ul>
<li> The <a href="tabs.html#type-Tab">Tab</a> object
@@ -457,18 +487,6 @@ No API or manifest changes worth noting.
</li>
</ul>
-<!--
-<h4> New experimental APIs </h4>
- <ul>
- <li> a change </li>
- </ul>
-
-<h4> Additions to existing APIs </h4>
- <ul>
- <li> a change </li>
- </ul>
--->
-
<h2 id="6">Google Chrome 6</h2>
@@ -482,14 +500,6 @@ No API or manifest changes worth noting.
machine's idle state changes. </li>
</ul>
-<h4> New experimental APIs </h4>
- <ul>
- <li>The <a href="experimental.omnibox.html">omnibox API</a> allows you to
- add functionality to the browser's address bar. </li>
- <li>The <a href="experimental.infobars.html">infobars API</a> allows you
- to add a UI panel across the top of a tab. </li>
- </ul>
-
<h4> Additions to existing APIs </h4>
<ul>
<li>The <a href="extension.html#method-getViews">chrome.extension.getViews()</a>
diff --git a/webkit/glue/resources/webkit_strings_ca.xtb b/webkit/glue/resources/webkit_strings_ca.xtb
index baaa04e..b2bf734 100644
--- a/webkit/glue/resources/webkit_strings_ca.xtb
+++ b/webkit/glue/resources/webkit_strings_ca.xtb
@@ -11,7 +11,7 @@
<translation id="4202807286478387388">salta</translation>
<translation id="4611115858363067980"><ph name="FILENAME"/><ph name="WIDTH"/>×<ph name="HEIGHT"/></translation>
<translation id="7658239707568436148">Cancel·la</translation>
-<translation id="795667975304826397">No heu seleccionat cap fitxer.</translation>
+<translation id="795667975304826397">Cap fitxer seleccionat.</translation>
<translation id="1416462845279468967">S'ha produït un error en instal·lar el connector </translation>
<translation id="8141602879876242471">És un índex on es poden realitzar cerques. Introdueix els termes de cerca:</translation>
<translation id="5650795167354946011">Després d'instal·lar el connector, feu clic aquí per actualitzar</translation>
diff --git a/webkit/glue/resources/webkit_strings_de.xtb b/webkit/glue/resources/webkit_strings_de.xtb
index 26ce85a..63ebeb4 100644
--- a/webkit/glue/resources/webkit_strings_de.xtb
+++ b/webkit/glue/resources/webkit_strings_de.xtb
@@ -44,7 +44,7 @@
<translation id="5466621249238537318">Wählen Sie eine oder mehrere Dateien aus.</translation>
<translation id="8750798805984357768">Wählen Sie eine dieser Optionen aus.</translation>
<translation id="7740050170769002709">HTML-Inhalte</translation>
-<translation id="2226276347425096477">Kürzen Sie diesen Text auf max. <ph name="MAX_CHARACTERS"/> Zeichen. Derzeit verwenden Sie <ph name="CURRENT_LENGTH"/> Zeichen.</translation>
+<translation id="2226276347425096477">Kürzen Sie diesen Text auf max. <ph name="MAX_CHARACTERS"/> Zeichen. Zurzeit verwenden Sie <ph name="CURRENT_LENGTH"/> Zeichen.</translation>
<translation id="1639239467298939599">Wird geladen...</translation>
<translation id="2908441821576996758">Geben Sie eine durch Kommas getrennte Liste der E-Mail-Adressen ein.</translation>
<translation id="5939518447894949180">Zurücksetzen</translation>
diff --git a/webkit/glue/resources/webkit_strings_id.xtb b/webkit/glue/resources/webkit_strings_id.xtb
index daa6799..b455b86 100644
--- a/webkit/glue/resources/webkit_strings_id.xtb
+++ b/webkit/glue/resources/webkit_strings_id.xtb
@@ -11,7 +11,7 @@
<translation id="4202807286478387388">lompati</translation>
<translation id="4611115858363067980"><ph name="FILENAME"/> - <ph name="WIDTH"/>×<ph name="HEIGHT"/></translation>
<translation id="7658239707568436148">Batal</translation>
-<translation id="795667975304826397">Tidak ada file yang dipilih</translation>
+<translation id="795667975304826397">Tidak ada berkas yang dipiliah</translation>
<translation id="1416462845279468967">Pemasangan pengaya gagal</translation>
<translation id="8141602879876242471">Terdapat indeks yang dapat dicari. Masukkan kata kunci penelusuran:</translation>
<translation id="5650795167354946011">Setelah memasang pengaya, klik di sini untuk menyegarkan</translation>
@@ -35,7 +35,7 @@
<translation id="838869780401515933">centangi</translation>
<translation id="2846343701378493991">1024 (Tingkat Menengah)</translation>
<translation id="5476505524087279545">batalkan centang</translation>
-<translation id="3789841737615482174">Instal</translation>
+<translation id="3789841737615482174">Pasang</translation>
<translation id="2507943997699731163">Harap isi bidang ini.</translation>
<translation id="5253117816378681419">Konfirmasikan bahwa Anda ingin memasang pengaya <ph name="PLUGIN"/>. Anda harus memasang pengaya yang Anda percayai saja.</translation>
<translation id="6663448176199120256">Penelusuran Barusan</translation>