Browse Source

Fix crash that happens when the PDF viewer is refreshed.
The root cause is the PdfViewerHandler instanceis destroyed but not removed from the list of observer in WebContentsZoomController

Ahmed Mohamed Ali 7 years ago
parent
commit
9f3cfa2dbd

+ 17 - 7
atom/browser/ui/webui/pdf_viewer_handler.cc

@@ -58,7 +58,9 @@ void PopulateStreamInfo(base::DictionaryValue* stream_info,
 PdfViewerHandler::PdfViewerHandler(const std::string& src)
     : stream_(nullptr), original_url_(src) {}
 
-PdfViewerHandler::~PdfViewerHandler() {}
+PdfViewerHandler::~PdfViewerHandler() {
+  RemoveObserver();
+}
 
 void PdfViewerHandler::SetPdfResourceStream(content::StreamInfo* stream) {
   stream_ = stream;
@@ -90,15 +92,11 @@ void PdfViewerHandler::RegisterMessages() {
 }
 
 void PdfViewerHandler::OnJavascriptAllowed() {
-  auto zoom_controller = WebContentsZoomController::FromWebContents(
-    web_ui()->GetWebContents());
-  zoom_controller->AddObserver(this);
+  AddObserver();
 }
 
 void PdfViewerHandler::OnJavascriptDisallowed() {
-  auto zoom_controller = WebContentsZoomController::FromWebContents(
-    web_ui()->GetWebContents());
-  zoom_controller->RemoveObserver(this);
+  RemoveObserver();
 }
 
 void PdfViewerHandler::Initialize(const base::ListValue* args) {
@@ -214,4 +212,16 @@ void PdfViewerHandler::OnZoomLevelChanged(content::WebContents* web_contents,
   }
 }
 
+void PdfViewerHandler::AddObserver() {
+  auto zoom_controller =
+      WebContentsZoomController::FromWebContents(web_ui()->GetWebContents());
+  zoom_controller->AddObserver(this);
+}
+
+void PdfViewerHandler::RemoveObserver() {
+  auto zoom_controller =
+      WebContentsZoomController::FromWebContents(web_ui()->GetWebContents());
+  zoom_controller->RemoveObserver(this);
+}
+
 }  // namespace atom

+ 2 - 1
atom/browser/ui/webui/pdf_viewer_handler.h

@@ -45,7 +45,8 @@ class PdfViewerHandler : public content::WebUIMessageHandler,
   void Reload(const base::ListValue* args);
   void OnZoomLevelChanged(content::WebContents* web_contents, double level,
       bool is_temporary);
-
+  void AddObserver();
+  void RemoveObserver();
   std::unique_ptr<base::Value> initialize_callback_id_;
   content::StreamInfo* stream_;
   std::string original_url_;