// Copyright (c) 2016 The Chromium Embedded Framework Authors.
// Portions copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "libcef/browser/chrome_profile_manager_stub.h"

#include "libcef/browser/browser_context.h"
#include "libcef/browser/content_browser_client.h"

namespace {

// Return the active browser context. This is primarily called from Chrome code
// that handles WebUI views and wishes to associate the view's data with a
// particular context (profile). Chrome stores multiple profiles in sub-
// directories of |user_data_dir| and then uses ProfileManager to track which
// profile (sub-directory name) was last active.
//
// TODO(cef): To most closely match Chrome behavior this should return the
// context for the currently active browser (e.g. the browser with input focus).
// Return the main context for now since we don't currently have a good way to
// determine that.
CefBrowserContext* GetActiveBrowserContext() {
  return static_cast<CefBrowserContext*>(
      CefContentBrowserClient::Get()->request_context()->GetBrowserContext());
}

}  // namespace

ChromeProfileManagerStub::ChromeProfileManagerStub()
    : ProfileManager(base::FilePath()) {}

ChromeProfileManagerStub::~ChromeProfileManagerStub() {}

Profile* ChromeProfileManagerStub::GetProfile(
    const base::FilePath& profile_dir) {
  CefBrowserContext* browser_context =
      CefBrowserContext::GetForCachePath(profile_dir);
  if (!browser_context) {
    // ProfileManager makes assumptions about profile directory paths that do
    // not match CEF usage. For example, the default Chrome profile name is
    // "Default" so it will append that sub-directory name to an empty
    // |user_data_dir| value and then call this method. Use the active context
    // in cases such as this where we don't understand what ProfileManager is
    // asking for.
    browser_context = GetActiveBrowserContext();
  }
  return browser_context;
}

bool ChromeProfileManagerStub::IsValidProfile(const void* profile) {
  if (!profile)
    return false;
  return !!CefBrowserContext::GetForContext(
      reinterpret_cast<content::BrowserContext*>(const_cast<void*>(profile)));
}

Profile* ChromeProfileManagerStub::GetLastUsedProfile(
    const base::FilePath& user_data_dir) {
  // Override this method to avoid having to register prefs::kProfileLastUsed,
  // usage of which doesn't make sense for CEF.
  return GetActiveBrowserContext();
}
