text: // 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.
  
  #ifndef CONTENT_RENDERER_ANDROID_CONTENT_DETECTOR_H_
  #define CONTENT_RENDERER_ANDROID_CONTENT_DETECTOR_H_
  
  #include "third_party/WebKit/public/web/WebRange.h"
  #include "url/gurl.h"
  
  namespace WebKit {
  class WebHitTestResult;
  }
  
  namespace content {
  
  // Base class for text-based content detectors.
  class ContentDetector {
   public:
    // Holds the content detection results.
    struct Result {
      Result();
      Result(const WebKit::WebRange& content_boundaries,
             const std::string& text,
             const GURL& intent_url);
      ~Result();
  
      bool valid;
      WebKit::WebRange content_boundaries;
      std::string text; // Processed text of the content.
      GURL intent_url; // URL of the intent that should process this content.
    };
  
    virtual ~ContentDetector() {}
  
    // Returns a WebKit range delimiting the contents found around the tapped
    // position. If no content is found a null range will be returned.
    Result FindTappedContent(const WebKit::WebHitTestResult& hit_test);
  
   protected:
    ContentDetector() {}
  
    // Parses the input string defined by the begin/end iterators returning true
    // if the desired content is found. The start and end positions relative to
    // the input iterators are returned in start_pos and end_pos.
    // The end position is assumed to be non-inclusive.
    virtual bool FindContent(const string16::const_iterator& begin,
                             const string16::const_iterator& end,
                             size_t* start_pos,
                             size_t* end_pos,
                             std::string* content_text) = 0;
  
    // Returns the intent URL that should process the content, if any.
    virtual GURL GetIntentURL(const std::string& content_text) = 0;
  
    // Returns the maximum length of text to be extracted around the tapped
    // position in order to search for content.
    virtual size_t GetMaximumContentLength() = 0;
  
    WebKit::WebRange FindContentRange(const WebKit::WebHitTestResult& hit_test,
                                      std::string* content_text);
  
    DISALLOW_COPY_AND_ASSIGN(ContentDetector);
  };
  
  }  // namespace content
  
  #endif  // CONTENT_RENDERER_ANDROID_CONTENT_DETECTOR_H_
  