15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines the Chrome Extensions WebNavigation API functions for observing and 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// intercepting navigation events, as specified in the extension JSON API. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_WEB_NAVIGATION_WEB_NAVIGATION_API_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_WEB_NAVIGATION_WEB_NAVIGATION_API_H_ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_navigation/frame_navigation_state.h" 161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/extensions/chrome_extension_function.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_list_observer.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_user_data.h" 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/browser_context_keyed_api_factory.h" 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/event_router.h" 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct RetargetingDetails; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tab contents observer that forwards navigation events to the event router. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebNavigationTabObserver 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public content::NotificationObserver, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::WebContentsObserver, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::WebContentsUserData<WebNavigationTabObserver> { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WebNavigationTabObserver(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the object for the given |web_contents|. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static WebNavigationTabObserver* Get(content::WebContents* web_contents); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FrameNavigationState& frame_navigation_state() const { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return navigation_state_; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* GetRenderViewHostInProcess(int process_id) const; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::NotificationObserver implementation. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::WebContentsObserver implementation. 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void RenderFrameDeleted( 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* render_frame_host) OVERRIDE; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void RenderViewDeleted( 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RenderViewHost* render_view_host) OVERRIDE; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AboutToNavigateRenderView( 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host) OVERRIDE; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidStartProvisionalLoadForFrame( 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* render_frame_host, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& validated_url, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_error_page, 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool is_iframe_srcdoc) OVERRIDE; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidCommitProvisionalLoadForFrame( 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* render_frame_host, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PageTransition transition_type) OVERRIDE; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidFailProvisionalLoad( 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* render_frame_host, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& validated_url, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code, 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::string16& error_description) OVERRIDE; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DocumentLoadedInFrame( 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* render_frame_host) OVERRIDE; 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void DidFinishLoad(content::RenderFrameHost* render_frame_host, 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& validated_url) OVERRIDE; 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void DidFailLoad(content::RenderFrameHost* render_frame_host, 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& validated_url, 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int error_code, 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::string16& error_description) OVERRIDE; 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidGetRedirectForResourceRequest( 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RenderViewHost* render_view_host, 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const content::ResourceRedirectDetails& details) OVERRIDE; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidOpenRequestedURL(content::WebContents* new_contents, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PageTransition transition, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 source_frame_num) OVERRIDE; 92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void WebContentsDestroyed() OVERRIDE; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit WebNavigationTabObserver(content::WebContents* web_contents); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class content::WebContentsUserData<WebNavigationTabObserver>; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the transition and target url correspond to a reference fragment 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation. 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool IsReferenceFragmentNavigation(content::RenderFrameHost* frame_host, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates and sends onErrorOccurred events for all on-going navigations. If 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |render_view_host| is non-NULL, only generates events for frames in this 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // render view host. If |frame_host_to_skip| is given, no events are sent for 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // that 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // frame. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SendErrorEvents(content::WebContents* web_contents, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host, 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* frame_host_to_skip); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tracks the state of the frames we are sending events for. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FrameNavigationState navigation_state_; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used for tracking registrations to redirect notifications. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current RenderViewHost of the observed WebContents. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // During a cross site navigation, the WebContents has a second, pending 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewHost. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* pending_render_view_host_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebNavigationTabObserver); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Observes navigation notifications and routes them as events to the extension 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// system. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebNavigationEventRouter : public TabStripModelObserver, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public chrome::BrowserListObserver, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::NotificationObserver { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit WebNavigationEventRouter(Profile* profile); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WebNavigationEventRouter(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to cache the information about newly created WebContents objects. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct PendingWebContents{ 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingWebContents(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingWebContents(content::WebContents* source_web_contents, 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* source_frame_host, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* target_web_contents, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& target_url); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~PendingWebContents(); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* source_web_contents; 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* source_frame_host; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* target_web_contents; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL target_url; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TabStripModelObserver implementation. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TabReplacedAt(TabStripModel* tab_strip_model, 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* old_contents, 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* new_contents, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index) OVERRIDE; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome::BrowserListObserver implementation. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnBrowserAdded(Browser* browser) OVERRIDE; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnBrowserRemoved(Browser* browser) OVERRIDE; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::NotificationObserver implementation. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handler for the NOTIFICATION_RETARGETING event. The method takes the 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // details of such an event and stores them for the later 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTIFICATION_TAB_ADDED event. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Retargeting(const RetargetingDetails* details); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handler for the NOTIFICATION_TAB_ADDED event. The method takes the details 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of such an event and creates a JSON formated extension event from it. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TabAdded(content::WebContents* tab); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handler for NOTIFICATION_WEB_CONTENTS_DESTROYED. If |tab| is in 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |pending_web_contents_|, it is removed. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TabDestroyed(content::WebContents* tab); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mapping pointers to WebContents objects to information about how they got 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // created. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<content::WebContents*, PendingWebContents> pending_web_contents_; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used for tracking registrations to navigation notifications. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The profile that owns us via ExtensionService. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebNavigationEventRouter); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// API function that returns the state of a given frame. 1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class WebNavigationGetFrameFunction : public ChromeSyncExtensionFunction { 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~WebNavigationGetFrameFunction() {} 1975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual bool RunSync() OVERRIDE; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_EXTENSION_FUNCTION("webNavigation.getFrame", WEBNAVIGATION_GETFRAME) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// API function that returns the states of all frames in a given tab. 2021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class WebNavigationGetAllFramesFunction : public ChromeSyncExtensionFunction { 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~WebNavigationGetAllFramesFunction() {} 2045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual bool RunSync() OVERRIDE; 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_EXTENSION_FUNCTION("webNavigation.getAllFrames", 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WEBNAVIGATION_GETALLFRAMES) 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class WebNavigationAPI : public BrowserContextKeyedAPI, 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public extensions::EventRouter::Observer { 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) explicit WebNavigationAPI(content::BrowserContext* context); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~WebNavigationAPI(); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // KeyedService implementation. 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Shutdown() OVERRIDE; 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // BrowserContextKeyedAPI implementation. 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static BrowserContextKeyedAPIFactory<WebNavigationAPI>* GetFactoryInstance(); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // EventRouter::Observer implementation. 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnListenerAdded(const extensions::EventListenerInfo& details) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERRIDE; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) friend class BrowserContextKeyedAPIFactory<WebNavigationAPI>; 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::BrowserContext* browser_context_; 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // BrowserContextKeyedAPI implementation. 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const char* service_name() { 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "WebNavigationAPI"; 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const bool kServiceIsNULLWhileTesting = true; 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Created lazily upon OnListenerAdded. 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WebNavigationEventRouter> web_navigation_event_router_; 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebNavigationAPI); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_API_WEB_NAVIGATION_WEB_NAVIGATION_API_H_ 245