mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			121 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Copyright (c) 2016 The Chromium Embedded Framework 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 "tests/cefclient/browser/drm_test.h"
 | 
						|
 | 
						|
#include <algorithm>
 | 
						|
#include <string>
 | 
						|
 | 
						|
#include "include/cef_parser.h"
 | 
						|
#include "include/cef_web_plugin.h"
 | 
						|
#include "tests/cefclient/browser/test_runner.h"
 | 
						|
 | 
						|
namespace client {
 | 
						|
namespace drm_test {
 | 
						|
 | 
						|
namespace {
 | 
						|
 | 
						|
// Application-specific error codes.
 | 
						|
const int kMessageFormatError = 1;
 | 
						|
const int kCdmLoadError = 2;
 | 
						|
 | 
						|
const char kTestUrlPath[] = "/drm";
 | 
						|
const char kWidevineCdmPathKey[] = "widevine_cdm_path";
 | 
						|
 | 
						|
// Callback executed once CDM registration is complete.
 | 
						|
class CdmCallback : public CefRegisterCdmCallback {
 | 
						|
 public:
 | 
						|
  CdmCallback(CefRefPtr<CefMessageRouterBrowserSide::Callback> callback)
 | 
						|
      : callback_(callback) {}
 | 
						|
 | 
						|
  void OnCdmRegistrationComplete(cef_cdm_registration_error_t result,
 | 
						|
                                 const CefString& error_message) OVERRIDE {
 | 
						|
    if (result == CEF_CDM_REGISTRATION_ERROR_NONE)
 | 
						|
      callback_->Success("");
 | 
						|
    else
 | 
						|
      callback_->Failure(kCdmLoadError, error_message);
 | 
						|
    callback_ = nullptr;
 | 
						|
  }
 | 
						|
 | 
						|
 private:
 | 
						|
  CefRefPtr<CefMessageRouterBrowserSide::Callback> callback_;
 | 
						|
 | 
						|
  IMPLEMENT_REFCOUNTING(CdmCallback);
 | 
						|
  DISALLOW_COPY_AND_ASSIGN(CdmCallback);
 | 
						|
};
 | 
						|
 | 
						|
// Handle messages in the browser process.
 | 
						|
class Handler : public CefMessageRouterBrowserSide::Handler {
 | 
						|
 public:
 | 
						|
  Handler() {}
 | 
						|
 | 
						|
  // Called due to cefQuery execution in drm.html.
 | 
						|
  virtual bool OnQuery(CefRefPtr<CefBrowser> browser,
 | 
						|
                       CefRefPtr<CefFrame> frame,
 | 
						|
                       int64 query_id,
 | 
						|
                       const CefString& request,
 | 
						|
                       bool persistent,
 | 
						|
                       CefRefPtr<Callback> callback) OVERRIDE {
 | 
						|
    // Only handle messages from the test URL.
 | 
						|
    const std::string& url = frame->GetURL();
 | 
						|
    if (!test_runner::IsTestURL(url, kTestUrlPath))
 | 
						|
      return false;
 | 
						|
 | 
						|
    // Parse |request| as a JSON dictionary.
 | 
						|
    CefRefPtr<CefDictionaryValue> request_dict = ParseJSON(request);
 | 
						|
    if (!request_dict) {
 | 
						|
      callback->Failure(kMessageFormatError, "Incorrect message format");
 | 
						|
      return true;
 | 
						|
    }
 | 
						|
 | 
						|
    // Verify the "widevine_cdm_path" key.
 | 
						|
    if (!VerifyKey(request_dict, kWidevineCdmPathKey, VTYPE_STRING, callback))
 | 
						|
      return true;
 | 
						|
 | 
						|
    const std::string& widevine_cdm_path =
 | 
						|
        request_dict->GetString(kWidevineCdmPathKey);
 | 
						|
    if (widevine_cdm_path.empty()) {
 | 
						|
      callback->Failure(kMessageFormatError, "Empty widevine CDM path");
 | 
						|
      return true;
 | 
						|
    }
 | 
						|
 | 
						|
    // Register the Widvine CDM.
 | 
						|
    CefRegisterWidevineCdm(widevine_cdm_path, new CdmCallback(callback));
 | 
						|
    return true;
 | 
						|
  }
 | 
						|
 | 
						|
 private:
 | 
						|
  // Convert a JSON string to a dictionary value.
 | 
						|
  static CefRefPtr<CefDictionaryValue> ParseJSON(const CefString& string) {
 | 
						|
    CefRefPtr<CefValue> value = CefParseJSON(string, JSON_PARSER_RFC);
 | 
						|
    if (value.get() && value->GetType() == VTYPE_DICTIONARY)
 | 
						|
      return value->GetDictionary();
 | 
						|
    return nullptr;
 | 
						|
  }
 | 
						|
 | 
						|
  // Verify that |key| exists in |dictionary| and has type |value_type|. Fails
 | 
						|
  // |callback| and returns false on failure.
 | 
						|
  static bool VerifyKey(CefRefPtr<CefDictionaryValue> dictionary,
 | 
						|
                        const char* key,
 | 
						|
                        cef_value_type_t value_type,
 | 
						|
                        CefRefPtr<Callback> callback) {
 | 
						|
    if (!dictionary->HasKey(key) || dictionary->GetType(key) != value_type) {
 | 
						|
      callback->Failure(
 | 
						|
          kMessageFormatError,
 | 
						|
          "Missing or incorrectly formatted message key: " + std::string(key));
 | 
						|
      return false;
 | 
						|
    }
 | 
						|
    return true;
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
}  // namespace
 | 
						|
 | 
						|
void CreateMessageHandlers(test_runner::MessageHandlerSet& handlers) {
 | 
						|
  handlers.insert(new Handler());
 | 
						|
}
 | 
						|
 | 
						|
}  // namespace drm_test
 | 
						|
}  // namespace client
 |