1 // Copyright 2019 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 5 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_util.h" 6 7 #include <string> 8 #include <utility> 9 10 #include "chrome/common/extensions/api/safe_browsing_private.h" 11 12 namespace safe_browsing_private = extensions::api::safe_browsing_private; 13 14 namespace extensions { 15 16 namespace safe_browsing_util { 17 ReferrerToReferrerChainEntry(const safe_browsing::ReferrerChainEntry & referrer)18safe_browsing_private::ReferrerChainEntry ReferrerToReferrerChainEntry( 19 const safe_browsing::ReferrerChainEntry& referrer) { 20 safe_browsing_private::ReferrerChainEntry entry; 21 // Add all referrer chain entry fields to the entry. 22 entry.url = referrer.url(); 23 if (referrer.has_main_frame_url()) { 24 entry.main_frame_url = 25 std::make_unique<std::string>(referrer.main_frame_url()); 26 } 27 // This url type value is deprecated and should not be used. 28 DCHECK_NE( 29 referrer.type(), 30 safe_browsing::ReferrerChainEntry_URLType_DEPRECATED_SERVER_REDIRECT); 31 switch (referrer.type()) { 32 case safe_browsing::ReferrerChainEntry_URLType_EVENT_URL: 33 entry.url_type = safe_browsing_private::URLType::URL_TYPE_EVENT_URL; 34 break; 35 case safe_browsing::ReferrerChainEntry_URLType_LANDING_PAGE: 36 entry.url_type = safe_browsing_private::URLType::URL_TYPE_LANDING_PAGE; 37 break; 38 case safe_browsing::ReferrerChainEntry_URLType_LANDING_REFERRER: 39 entry.url_type = 40 safe_browsing_private::URLType::URL_TYPE_LANDING_REFERRER; 41 break; 42 case safe_browsing::ReferrerChainEntry_URLType_CLIENT_REDIRECT: 43 entry.url_type = safe_browsing_private::URLType::URL_TYPE_CLIENT_REDIRECT; 44 break; 45 case safe_browsing::ReferrerChainEntry_URLType_RECENT_NAVIGATION: 46 entry.url_type = 47 safe_browsing_private::URLType::URL_TYPE_RECENT_NAVIGATION; 48 break; 49 case safe_browsing::ReferrerChainEntry_URLType_REFERRER: 50 entry.url_type = safe_browsing_private::URLType::URL_TYPE_REFERRER; 51 break; 52 case safe_browsing::ReferrerChainEntry_URLType_DEPRECATED_SERVER_REDIRECT: 53 NOTREACHED(); 54 } 55 if (referrer.ip_addresses_size() > 0) { 56 entry.ip_addresses = std::make_unique<std::vector<std::string>>(); 57 entry.ip_addresses->reserve(referrer.ip_addresses_size()); 58 for (const std::string& ip_address : referrer.ip_addresses()) 59 entry.ip_addresses->emplace_back(ip_address); 60 } 61 if (referrer.has_referrer_url()) { 62 entry.referrer_url = std::make_unique<std::string>(referrer.referrer_url()); 63 } 64 if (referrer.has_referrer_main_frame_url()) { 65 entry.referrer_main_frame_url = 66 std::make_unique<std::string>(referrer.referrer_main_frame_url()); 67 } 68 if (referrer.has_is_retargeting()) 69 entry.is_retargeting = std::make_unique<bool>(referrer.is_retargeting()); 70 if (referrer.has_navigation_time_msec()) { 71 entry.navigation_time_ms = 72 std::make_unique<double>(referrer.navigation_time_msec()); 73 } 74 if (referrer.server_redirect_chain_size() > 0) { 75 entry.server_redirect_chain = 76 std::make_unique<std::vector<safe_browsing_private::ServerRedirect>>(); 77 entry.server_redirect_chain->reserve(referrer.server_redirect_chain_size()); 78 for (const auto& server_redirect : referrer.server_redirect_chain()) { 79 safe_browsing_private::ServerRedirect result; 80 result.url = std::make_unique<std::string>(server_redirect.url()); 81 entry.server_redirect_chain->emplace_back(std::move(result)); 82 } 83 } 84 if (referrer.has_navigation_initiation()) { 85 DCHECK_NE(referrer.navigation_initiation(), 86 safe_browsing::ReferrerChainEntry_NavigationInitiation_UNDEFINED); 87 switch (referrer.navigation_initiation()) { 88 case safe_browsing:: 89 ReferrerChainEntry_NavigationInitiation_BROWSER_INITIATED: 90 entry.navigation_initiation = 91 safe_browsing_private::NAVIGATION_INITIATION_BROWSER_INITIATED; 92 break; 93 case safe_browsing:: 94 ReferrerChainEntry_NavigationInitiation_RENDERER_INITIATED_WITHOUT_USER_GESTURE: 95 entry.navigation_initiation = safe_browsing_private:: 96 NAVIGATION_INITIATION_RENDERER_INITIATED_WITHOUT_USER_GESTURE; 97 break; 98 case safe_browsing:: 99 ReferrerChainEntry_NavigationInitiation_RENDERER_INITIATED_WITH_USER_GESTURE: 100 entry.navigation_initiation = safe_browsing_private:: 101 NAVIGATION_INITIATION_RENDERER_INITIATED_WITH_USER_GESTURE; 102 break; 103 case safe_browsing::ReferrerChainEntry_NavigationInitiation_UNDEFINED: 104 NOTREACHED(); 105 } 106 } 107 if (referrer.has_maybe_launched_by_external_application()) { 108 entry.maybe_launched_by_external_app = std::make_unique<bool>( 109 referrer.maybe_launched_by_external_application()); 110 } 111 112 return entry; 113 } 114 115 } // namespace safe_browsing_util 116 117 } // namespace extensions 118