• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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 #ifndef COMPONENTS_DOM_DISTILLER_CONTENT_DISTILLER_PAGE_WEB_CONTENTS_H_
6 #define COMPONENTS_DOM_DISTILLER_CONTENT_DISTILLER_PAGE_WEB_CONTENTS_H_
7 
8 #include <string>
9 
10 #include "base/memory/scoped_ptr.h"
11 #include "components/dom_distiller/core/distiller_page.h"
12 #include "content/public/browser/web_contents.h"
13 #include "content/public/browser/web_contents_observer.h"
14 #include "url/gurl.h"
15 
16 namespace content {
17 class RenderViewHost;
18 }
19 
20 using content::RenderViewHost;
21 
22 namespace dom_distiller {
23 
24 class SourcePageHandleWebContents : public SourcePageHandle {
25  public:
26   explicit SourcePageHandleWebContents(
27       scoped_ptr<content::WebContents> web_contents);
28   virtual ~SourcePageHandleWebContents();
29 
30   scoped_ptr<content::WebContents> GetWebContents();
31 
32  private:
33   // The WebContents this class owns.
34   scoped_ptr<content::WebContents> web_contents_;
35 };
36 
37 class DistillerPageWebContentsFactory : public DistillerPageFactory {
38  public:
DistillerPageWebContentsFactory(content::BrowserContext * browser_context)39   explicit DistillerPageWebContentsFactory(
40       content::BrowserContext* browser_context)
41       : DistillerPageFactory(), browser_context_(browser_context) {}
~DistillerPageWebContentsFactory()42   virtual ~DistillerPageWebContentsFactory() {}
43 
44   virtual scoped_ptr<DistillerPage> CreateDistillerPage() const OVERRIDE;
45   virtual scoped_ptr<DistillerPage> CreateDistillerPageWithHandle(
46       scoped_ptr<SourcePageHandle> handle) const OVERRIDE;
47 
48  private:
49   content::BrowserContext* browser_context_;
50 };
51 
52 class DistillerPageWebContents : public DistillerPage,
53                                  public content::WebContentsObserver {
54  public:
55   DistillerPageWebContents(
56       content::BrowserContext* browser_context,
57       scoped_ptr<SourcePageHandleWebContents> optional_web_contents_handle);
58   virtual ~DistillerPageWebContents();
59 
60   // content::WebContentsObserver implementation.
61   virtual void DocumentLoadedInFrame(int64 frame_id,
62                                      RenderViewHost* render_view_host) OVERRIDE;
63 
64   virtual void DidFailLoad(int64 frame_id,
65                            const GURL& validated_url,
66                            bool is_main_frame,
67                            int error_code,
68                            const base::string16& error_description,
69                            RenderViewHost* render_view_host) OVERRIDE;
70 
71  protected:
72   virtual void DistillPageImpl(const GURL& url,
73                                const std::string& script) OVERRIDE;
74 
75  private:
76   friend class TestDistillerPageWebContents;
77 
78   enum State {
79     // The page distiller is idle.
80     IDLE,
81     // A page is currently loading.
82     LOADING_PAGE,
83     // There was an error processing the page.
84     PAGELOAD_FAILED,
85     // JavaScript is executing within the context of the page. When the
86     // JavaScript completes, the state will be returned to |IDLE|.
87     EXECUTING_JAVASCRIPT
88   };
89 
90   // Creates a new WebContents, adds |this| as an observer, and loads the
91   // |url|.
92   virtual void CreateNewWebContents(const GURL& url);
93 
94   // Injects and executes JavaScript in the context of a loaded page. This
95   // must only be called after the page has successfully loaded.
96   void ExecuteJavaScript();
97 
98   // Called when the distillation is done or if the page load failed.
99   void OnWebContentsDistillationDone(const GURL& page_url,
100                                      const base::Value* value);
101 
102   // The current state of the |DistillerPage|, initially |IDLE|.
103   State state_;
104 
105   // The JavaScript to inject to extract content.
106   std::string script_;
107 
108   scoped_ptr<content::WebContents> web_contents_;
109   content::BrowserContext* browser_context_;
110   DISALLOW_COPY_AND_ASSIGN(DistillerPageWebContents);
111 };
112 
113 }  // namespace dom_distiller
114 
115 #endif  // COMPONENTS_DOM_DISTILLER_CONTENT_DISTILLER_PAGE_WEB_CONTENTS_H_
116