navigation_policy_handler.cc 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "fuchsia_web/webengine/browser/navigation_policy_handler.h"
  5. #include <lib/fidl/cpp/binding.h>
  6. #include "base/fuchsia/fuchsia_logging.h"
  7. #include "content/public/browser/navigation_handle.h"
  8. #include "fuchsia_web/webengine/browser/navigation_policy_throttle.h"
  9. NavigationPolicyHandler::NavigationPolicyHandler(
  10. fuchsia::web::NavigationPolicyProviderParams params,
  11. fidl::InterfaceHandle<fuchsia::web::NavigationPolicyProvider> delegate)
  12. : params_(std::move(params)), provider_(delegate.Bind()) {
  13. provider_.set_error_handler(fit::bind_member(
  14. this, &NavigationPolicyHandler::OnNavigationPolicyProviderDisconnected));
  15. }
  16. NavigationPolicyHandler::~NavigationPolicyHandler() {
  17. for (auto* throttle : navigation_throttles_) {
  18. throttle->OnNavigationPolicyProviderDisconnected(
  19. content::NavigationThrottle::CANCEL);
  20. }
  21. navigation_throttles_.clear();
  22. }
  23. void NavigationPolicyHandler::RegisterNavigationThrottle(
  24. NavigationPolicyThrottle* navigation_throttle) {
  25. navigation_throttles_.insert(navigation_throttle);
  26. }
  27. void NavigationPolicyHandler::RemoveNavigationThrottle(
  28. NavigationPolicyThrottle* navigation_throttle) {
  29. navigation_throttles_.erase(navigation_throttle);
  30. }
  31. void NavigationPolicyHandler::EvaluateRequestedNavigation(
  32. fuchsia::web::RequestedNavigation requested_navigation,
  33. fuchsia::web::NavigationPolicyProvider::EvaluateRequestedNavigationCallback
  34. callback) {
  35. provider_->EvaluateRequestedNavigation(std::move(requested_navigation),
  36. std::move(callback));
  37. }
  38. bool NavigationPolicyHandler::ShouldEvaluateNavigation(
  39. content::NavigationHandle* handle,
  40. fuchsia::web::NavigationPhase phase) {
  41. if (handle->IsInMainFrame()) {
  42. return (phase & params_.main_frame_phases()) == phase;
  43. }
  44. return (phase & params_.subframe_phases()) == phase;
  45. }
  46. bool NavigationPolicyHandler::is_provider_connected() {
  47. return provider_.is_bound();
  48. }
  49. void NavigationPolicyHandler::OnNavigationPolicyProviderDisconnected(
  50. zx_status_t status) {
  51. ZX_LOG(ERROR, status) << "NavigationPolicyProvider disconnected";
  52. for (auto* throttle : navigation_throttles_) {
  53. throttle->OnNavigationPolicyProviderDisconnected(
  54. content::NavigationThrottle::CANCEL);
  55. }
  56. navigation_throttles_.clear();
  57. }