1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/string_util.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/external_protocol/external_protocol_handler.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/profiles/profile_io_data.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/url_constants.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/base/net_util.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "url/url_util.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 15116680a4aac90f2aa7413d9095a592090648e557Ben MurdochChromeAutocompleteSchemeClassifier::ChromeAutocompleteSchemeClassifier( 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Profile* profile) 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : profile_(profile) { 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 20116680a4aac90f2aa7413d9095a592090648e557Ben MurdochChromeAutocompleteSchemeClassifier::~ChromeAutocompleteSchemeClassifier() { 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochmetrics::OmniboxInputType::Type 24116680a4aac90f2aa7413d9095a592090648e557Ben MurdochChromeAutocompleteSchemeClassifier::GetInputTypeForScheme( 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& scheme) const { 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (base::IsStringASCII(scheme) && 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (ProfileIOData::IsHandledProtocol(scheme) || 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LowerCaseEqualsASCII(scheme, content::kViewSourceScheme) || 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LowerCaseEqualsASCII(scheme, url::kJavaScriptScheme) || 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LowerCaseEqualsASCII(scheme, url::kDataScheme))) { 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return metrics::OmniboxInputType::URL; 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Also check for schemes registered via registerProtocolHandler(), which 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // can be handled by web pages/apps. 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ProtocolHandlerRegistry* registry = profile_ ? 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ProtocolHandlerRegistryFactory::GetForBrowserContext(profile_) : NULL; 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (registry && registry->IsHandledProtocol(scheme)) 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return metrics::OmniboxInputType::URL; 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Not an internal protocol; check if it's an external protocol, i.e. one 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // that's registered on the user's OS and will shell out to another program. 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // We need to do this after the checks above because some internally 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // handlable schemes (e.g. "javascript") may be treated as "blocked" by the 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // external protocol handler because we don't want pages to open them, but 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // users still can. 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ExternalProtocolHandler::BlockState block_state = 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExternalProtocolHandler::GetBlockState(scheme); 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (block_state) { 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ExternalProtocolHandler::DONT_BLOCK: 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return metrics::OmniboxInputType::URL; 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ExternalProtocolHandler::BLOCK: 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If we don't want the user to open the URL, don't let it be navigated 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // to at all. 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return metrics::OmniboxInputType::QUERY; 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return metrics::OmniboxInputType::INVALID; 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 63