zoukankan      html  css  js  c++  java
  • chromium源码阅读

    linux下chromium的入口函数在文件:src/chrome/app/chrome_exe_main_aura.cc 中

    int main(int argc, const char** argv) {
      return ChromeMain(argc, argv);
    }

    ChromeMain函数在 src/chrome/app/chrome_main.cc 中

    base::CommandLine::Init(params.argc, params.argv);

    具体函数如下:

    bool CommandLine::Init(int argc, const char* const* argv) {
      if (current_process_commandline_) {
        // If this is intentional, Reset() must be called first. If we are using
        // the shared build mode, we have to share a single object across multiple
        // shared libraries.
        return false;
      }
    
      current_process_commandline_ = new CommandLine(NO_PROGRAM);
    #if defined(OS_WIN)
      current_process_commandline_->ParseFromString(::GetCommandLineW());
    #elif defined(OS_POSIX)
      current_process_commandline_->InitFromArgv(argc, argv);
    #endif
    
      return true;
    }

    接下来进入文件: src/headless/app/headless_shell.cc

    int HeadlessBrowserMain(
        HeadlessBrowser::Options options,
        const base::Callback<void(HeadlessBrowser*)>& on_browser_start_callback) {
      DCHECK(!on_browser_start_callback.is_null());
    #if DCHECK_IS_ON()
      // The browser can only be initialized once.
      static bool browser_was_initialized;
      DCHECK(!browser_was_initialized);
      browser_was_initialized = true;
    
      // Child processes should not end up here.
      DCHECK(!base::CommandLine::ForCurrentProcess()->HasSwitch(
          ::switches::kProcessType));
    #endif
      return RunContentMain(std::move(options),
                            std::move(on_browser_start_callback));
    }

    继续:src/content/app/content_main.cc

    int ContentMain(const ContentMainParams& params) {
      ContentServiceManagerMainDelegate delegate(params);
      service_manager::MainParams main_params(&delegate);
    #if defined(OS_POSIX) && !defined(OS_ANDROID)
      main_params.argc = params.argc;
      main_params.argv = params.argv;
    #endif
      return service_manager::Main(main_params);
    }

    继续往下看:src/services/service_manager/embedder/main.cc   int Main(const MainParams& params) 中

    switch (process_type) {
        case ProcessType::kDefault:
          NOTREACHED();
          break;
    
        case ProcessType::kServiceManager:
          exit_code = RunServiceManager(delegate);
          break;
    
        case ProcessType::kService:
          CommonSubprocessInit();
          exit_code = RunService(delegate);
          break;
    
        case ProcessType::kEmbedder:
          if (ServiceManagerIsRemote())
            CommonSubprocessInit();
          exit_code = delegate->RunEmbedderProcess();
          break;
      }

    继续://src/base/run_loop.cc

    void RunLoop::Run() {
      DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
    
      if (!BeforeRun())
        return;
    
      // It is okay to access this RunLoop from another sequence while Run() is
      // active as this RunLoop won't touch its state until after that returns (if
      // the RunLoop's state is accessed while processing Run(), it will be re-bound
      // to the accessing sequence for the remainder of that Run() -- accessing from
      // multiple sequences is still disallowed).
      DETACH_FROM_SEQUENCE(sequence_checker_);
    
      // Use task stopwatch to exclude the loop run time from the current task, if
      // any.
      tracked_objects::TaskStopwatch stopwatch;
      stopwatch.Start();
      delegate_->Run();
      stopwatch.Stop();
    
      // Rebind this RunLoop to the current thread after Run().
      DETACH_FROM_SEQUENCE(sequence_checker_);
      DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
    
      AfterRun();
    }
  • 相关阅读:
    伪元素:placeholder-shown&&:focus-within
    伪元素:target
    伪元素:focus-within
    MpVue解析
    ESLint在vue中的使用
    vue动态 设置类名
    Java 文件流操作.
    SpringMVC 与 REST.
    基于Nginx和Zookeeper实现Dubbo的分布式服务
    基于Spring的RPC通讯模型.
  • 原文地址:https://www.cnblogs.com/danxi/p/7020375.html
Copyright © 2011-2022 走看看