1 // Copyright 2014 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 ATHENA_CONTENT_CONTENT_PROXY_H_ 6 #define ATHENA_CONTENT_CONTENT_PROXY_H_ 7 8 #include "base/macros.h" 9 #include "base/memory/ref_counted_memory.h" 10 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/weak_ptr.h" 12 #include "ui/gfx/image/image_skia.h" 13 14 namespace views { 15 class WebView; 16 } 17 18 namespace athena { 19 20 class Activity; 21 class ProxyImageData; 22 23 // This object creates and holds proxy content which gets shown instead of the 24 // actual web content, generated from the passed |web_view|. 25 // The created |proxy_content_| will be destroyed with the destruction of this 26 // object. 27 // Calling EvictContent() will release the rendered content. 28 // When ContentGetsDestroyed() gets called, the old view will be made visible 29 // and then the link to the |web_view_| will get severed. 30 class ContentProxy { 31 public: 32 // Creates the object by creating a sized down |web_view| layer and making it 33 // visible inside |activity|'s window. 34 ContentProxy(views::WebView* web_view, Activity* activity); 35 // TODO(skuhne): Add a function to create this object from a passed PNG, so 36 // that we can create it from a session restore. 37 38 // With the destruction of the object, the layer should get destroyed and the 39 // content should become visible again. 40 virtual ~ContentProxy(); 41 42 // Called when the content will get unloaded. 43 void ContentWillUnload(); 44 45 // Can be called to save resources by creating a layer with a solid color 46 // instead of creating a content image layer. 47 // Note: Currently the GPU does create a full size texture and fills it with 48 // the given color - so there isn't really memory savings yet. 49 void EvictContent(); 50 51 // Get the image of the content. If there is no image known, an empty image 52 // will be returned. 53 gfx::ImageSkia GetContentImage(); 54 55 // The content is about to get destroyed by its creator. 56 // Note: This function should only be used by AppActivity. 57 void OnPreContentDestroyed(); 58 59 private: 60 // Make the original (web)content visible. This call should only be paired 61 // with HideOriginalContent. 62 void ShowOriginalContent(); 63 64 // Make the content invisible. This call should only be paired with 65 // MakeVisible. 66 void HideOriginalContent(); 67 68 // Creates proxy content from |web_view_|. 69 void CreateProxyContent(); 70 71 // Creates an image from the current content. 72 bool CreateContentImage(); 73 74 // Called once the content was read back. 75 void OnContentImageRead(bool success, const SkBitmap& bitmap); 76 77 // Called once the image content has been converted to PNG. 78 void OnContentImageEncodeComplete(scoped_refptr<ProxyImageData> image); 79 80 // The web view which was passed on creation and is associated with this 81 // object. It will be shown when OnPreContentDestroyed() gets called and then 82 // set to NULL. The ownership remains with the creator. 83 views::WebView* web_view_; 84 85 // While we are doing our PNG encode, we keep the read back image to have 86 // something which we can pass back to the overview mode. (It would make no 87 // sense to the user to see that more recent windows get painted later than 88 // older ones). 89 gfx::ImageSkia raw_image_; 90 91 // True if the content is visible. 92 bool content_visible_; 93 94 // True if the content is loaded and needs a re-layout when it gets shown 95 // again. 96 bool content_loaded_; 97 98 // True if a content creation was kicked off once. This ensures that the 99 // function is never called twice. 100 bool content_creation_called_; 101 102 // The PNG image data. 103 scoped_refptr<base::RefCountedBytes> png_data_; 104 105 // Creating an encoded image from the content will be asynchronous. Use a 106 // weakptr for the callback to make sure that the read back / encoding image 107 // completion callback does not trigger on a destroyed ContentProxy. 108 base::WeakPtrFactory<ContentProxy> proxy_content_to_image_factory_; 109 110 DISALLOW_COPY_AND_ASSIGN(ContentProxy); 111 }; 112 113 } // namespace athena 114 115 #endif // ATHENA_CONTENT_CONTENT_PROXY_H_ 116