15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/android/content_startup_flags.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/base_switches.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/switches.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "gpu/command_buffer/service/gpu_switches.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_switches.h"
1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/native_theme/native_theme_switches.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SetContentCommandLineFlags(bool single_process,
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const std::string& plugin_descriptor) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // May be called multiple times, to cover all possible program entry points.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool already_initialized = false;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (already_initialized)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  already_initialized = true;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::CommandLine* parsed_command_line =
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::CommandLine::ForCurrentProcess();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int command_line_renderer_limit = -1;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (parsed_command_line->HasSwitch(switches::kRendererProcessLimit)) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string limit = parsed_command_line->GetSwitchValueASCII(
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switches::kRendererProcessLimit);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int value;
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (base::StringToInt(limit, &value)) {
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      command_line_renderer_limit = std::max(0, value);
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (command_line_renderer_limit > 0) {
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int limit = std::min(command_line_renderer_limit,
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         static_cast<int>(kMaxRendererProcessCount));
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RenderProcessHost::SetMaxRendererProcessCount(limit);
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (single_process || command_line_renderer_limit == 0) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Need to ensure the command line flag is consistent as a lot of chrome
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // internal code checks this directly, but it wouldn't normally get set when
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // we are implementing an embedded WebView.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parsed_command_line->AppendSwitch(switches::kSingleProcess);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  parsed_command_line->AppendSwitch(switches::kEnableBeginFrameScheduling);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parsed_command_line->AppendSwitch(switches::kEnablePinch);
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  parsed_command_line->AppendSwitch(switches::kEnableOverlayFullscreenVideo);
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  parsed_command_line->AppendSwitch(switches::kEnableOverlayScrollbar);
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  parsed_command_line->AppendSwitch(switches::kEnableOverscrollNotifications);
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  parsed_command_line->AppendSwitch(switches::kValidateInputEventStream);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run the GPU service as a thread in the browser instead of as a
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // standalone process.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parsed_command_line->AppendSwitch(switches::kInProcessGPU);
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  parsed_command_line->AppendSwitch(switches::kDisableGpuShaderDiskCache);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parsed_command_line->AppendSwitch(switches::kEnableViewport);
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  parsed_command_line->AppendSwitch(switches::kEnableViewportMeta);
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  parsed_command_line->AppendSwitch(
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      switches::kMainFrameResizesAreOrientationChanges);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
73a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Disable anti-aliasing.
74a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  parsed_command_line->AppendSwitch(
75a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      cc::switches::kDisableCompositedAntialiasing);
76a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  parsed_command_line->AppendSwitch(switches::kUIPrioritizeInGpuProcess);
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  parsed_command_line->AppendSwitch(switches::kEnableDelegatedRenderer);
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!plugin_descriptor.empty()) {
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parsed_command_line->AppendSwitchNative(
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      switches::kRegisterPepperPlugins, plugin_descriptor);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Disable profiler timing by default.
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!parsed_command_line->HasSwitch(switches::kProfilerTiming)) {
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    parsed_command_line->AppendSwitchASCII(
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        switches::kProfilerTiming, switches::kProfilerTimingDisabledValue);
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
94